2013-08-14 22 views
8

Trong ứng dụng ASP.NET MVC API của tôi, tôi có thể trả về một hữu ích ErrorResponse nếu một vài trong số Required lĩnh vực tôi đang thiếu:Việc trả lại phản ứng lỗi trong trường hợp của một mô hình rỗng

return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); 

-

"Message": "The request is invalid.", 
     "ModelState": { 
      "myModel.FooA": [ 
       "The FooA is required." 
      ], 
      "myModel.FooC": [ 
       "The FooC property is required." 
      ], 
      "myModel.FooD": [ 
       "The FooD property is required." 
      ] 
     } 

Tuy nhiên như this answer xác nhận, một mô hình NULL sẽ Validate. Vì tôi không cho phép điều này, làm cách nào tôi có thể trả về một phản hồi lỗi hữu ích bằng nhau cho biết tất cả các giá trị được yêu cầu? Tôi biết rằng tôi có thể thêm một ModelError theo cách thủ công cho mỗi thuộc tính, nhưng tôi nghi ngờ có thể có một cách mà CreateErrorResponse có thể làm điều này cho tôi.

+0

Xin chào @Jonathan. Tham chiếu trên có một kiểm tra nếu mô hình không phải là null. Trong trường hợp nó là null, bạn có thể kiểm tra dưới đây gợi ý. –

+0

Bạn có thể gọi 'Controller.ValidateModel (new MyClass()) 'nếu đối tượng của bạn là null? (nb, 'ValidateModel' là một phương thức trong lớp' Controller'). xem http://stackoverflow.com/questions/6360087/manually-invoking-modelstate-validation – wal

+0

không có cách nào tự động để đạt được những gì bạn muốn. bạn yêu cầu một mô hình tùy chỉnh binder –

Trả lời

3

Bạn đang sử dụng mvc3 hoặc web-api? các thẻ của bạn cho biết bạn đang sử dụng mvc nhưng câu mở đầu của bạn ngụ ý web-api. Nếu sử dụng MVC3 bạn có thể sử dụng như sau:

Trong điều khiển của bạn trước khi cuộc gọi của bạn để ModelState.IsValid thêm:

if (modelObj == null) 
{ 
    ModelState.Clear(); 
    var blankModel = new MyClass(); 
    TryValidateModel(blankModel); 
    return View("About", blankModel);   
} 

Nếu bạn đang sử dụng web-api giả sử bạn đang sử dụng System.ComponentModel.DataAnnotations bạn có thể sử dụng các mục sau:

ModelState.Clear(); 

var model = new MyClass(); 
var results = new List<ValidationResult>(); 
Validator.TryValidateObject(model, new ValidationContext(model, null, null), 
                   results, true); 

var modelState = new ModelStateDictionary(); 
foreach (var validationResult in results) 
    modelState.AddModelError(validationResult.MemberNames.ToArray()[0], 
               validationResult.ErrorMessage); 

return Request.CreateErrorResponse(HttpStatusCode.BadRequest, modelState); 
+0

+1 cho 'TryValidateModel' –

Các vấn đề liên quan