2015-05-05 3 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

Здравствуйте @Jasen, попробовал, но это не сработало. Он выдает эту ошибку «Не удалось выполнить проверку для одного или нескольких объектов. Дополнительную информацию см. В разделе «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, я последовал за вашим примером, но я все еще получаю 'Validation failed для одного или нескольких объектов. Дополнительную информацию см. В разделе Свойство EntityValidationErrors. «Я сделал трассировку и обнаружил, что она входит в« OnActionExecuting »без ошибок. – uikrosoft

+0

@uikrosoft Возможно, вам стоит взглянуть на исключение. Кажется, что у вас может быть проблема с db-моделью. Попытайтесь использовать некоторую реализацию отладки для unitOfWork.SchoolManagerRepository, которая просто записывает модели в отладчик, а не переходит в структуру сущности. Или проверить http://stackoverflow.com/questions/7795300/validation-failed-for-one-or-more-entities-see-entityvalidationerrors-propert –

Смежные вопросы