2015-05-05 47 views
0

使用JObject將數據傳遞給webapi,您如何執行JObject返回的對象的模型驗證?我正在使用angurlarjs進行綁定,併爲我的模型使用DTO。JObject Webapi中的模型驗證

[System.Web.Http.HttpPost] 
     public HttpResponseMessage InsertSchoolBranch(JObject jsonData) 
     { 

      try 
      { 
       dynamic json = jsonData;  
       JObject jbranchInfo = json.branchInfo; 
       JObject jbranchPolicy = json.branchPolicy; 


       var branchInfo = jbranchInfo.ToObject<SchoolBranch>(); 
       var branchPolicy = jbranchPolicy.ToObject<SchoolPolicy>(); 

       int schoolId = Convert.ToInt32(UserDataPieces(2)); 
       int userId = Convert.ToInt32(UserDataPieces(0)); 

       unitOfWork.SchoolManagerRepository.InsertSchoolBranch(branchInfo, branchPolicy, userId, schoolId, ref message); 

       return new HttpResponseMessage(HttpStatusCode.OK); 
      } 
      catch (UnauthorizedAccessException) 
      { 
       return Request.CreateResponse(HttpStatusCode.Unauthorized); 
      } 
      catch (Exception) 
      { 
       return Request.CreateResponse(HttpStatusCode.InternalServerError); 


      } 


     } 
+0

如果你發佈一個強類型的模型,而不是動態'JObject'你可以驗證屬性裝飾你的模特屬性和檢查'ModelState.IsValid在你的行動中。 – Jasen

+0

你好@賈森,試過了,但沒有奏效。它引發了這個錯誤「驗證失敗的一個或多個實體。有關更多詳細信息,請參閱'EntityValidationErrors'屬性。' – uikrosoft

+1

@uikrosoft可以在遇到此錯誤時分享完整的代碼和請求詳細信息: – Victor

回答

0

如果要驗證輸入數據,請考慮使用自定義ActionFilterAttributes對其進行裝飾。

[RequiresJsonBody("SchoolBranch","SchoolPolicy")] 
public HttpResponseMessage InsertSchoolBranch(JObject jsonData) 
{ 
    // Stuff... 
} 

或可能使用一些元組爲模型

public class RequiresJsonBody : ActionFilterAttribute 
{ 
    private string paramName; 

    public RequiresJsonBody (string paramName) 
    { 
     this.paramName = paramName; 
    } 

    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     IDictionary<string, string> errors = new Dictionary<string, string>(); 

     // Validate incoming. Add key/error messages to dictionary... 

     foreach (var err in errors) 
     { 
      actionContext.ModelState.AddModelError(err.Key, err.Value); 
     } 

     if (!actionContext.ModelState.IsValid 
      && errors.Keys.Count > 0) 
     { 
      actionContext.Response 
       = actionContext.Request.CreateErrorResponse(
        HttpStatusCode.BadRequest, 
        String.Join(" ", errors.Values.ToArray())); 
     } 
    } 
} 
+0

你好@Jonas,我跟着你的例子,但我仍然得到'驗證失敗的一個或多個實體。有關更多詳細信息,請參閱'EntityValidationErrors'屬性。'我做了一個跟蹤,發現它沒有錯誤地進入'OnActionExecuting'。 – uikrosoft

+0

@uikrosoft也許你應該看看例外。似乎你可能有一個數據庫模型問題。嘗試爲unitOfWork.SchoolManagerRepository使用一些調試實現,它只是將模型寫入調試器,而不是去實體框架。 或退房http://stackoverflow.com/questions/7795300/validation-failed-for-one-or-more-entities-see-entityvalidationerrors-propert –