2013-03-20 53 views
3

這是我第一次使用asp.net mvc webApi,並且我有Post/Put方法,它有一個名爲ProductViewModel的參數。該視圖模型的一些性質有數據註釋驗證,如RequiredStringLenght等...我有POST方法是這樣的:如何獲取ModelState在asp.net mvc web api上的工作?

public HttpResponseMessage Post([FromBody] ProductViewModel value) 
{ 
    if (ModelState.IsValid) 
    { 
     // persist data here... 

     return Request.CreateResponse(HttpStatusCode.OK); 
    } 

    return Request.CreateResponse(HttpStatusCode.BadRequest, ModelState.GetErrors()); 
} 

我有GetErrors()方法的擴展,讓我錯誤的List<>和傳遞給客戶。我的問題是:爲什麼ModelState不起作用?

如果我將null傳遞給ViewModel的一個屬性,這個驗證根本不起作用。 IsValid房產總是true。有什麼辦法可以解決這個問題並獲得ModelState的工作,比如MVC?

我的模型看起來是這樣的:

public class ProductViewModel 
{ 
    [Display(ResourceType = typeof(Resources.Global), Name = "Name")] 
    [Required(ErrorMessageResourceType = typeof(Resources.Global), ErrorMessageResourceName = "Required")] 
    [StringLength(100, ErrorMessageResourceType = typeof(Resources.Global), ErrorMessageResourceName = "Range")] 
    public string Name { get; set; } 

    [Display(ResourceType = typeof(Resources.Global), Name = "ShortName")] 
    [Required(ErrorMessageResourceType = typeof(Resources.Global), ErrorMessageResourceName = "Required")] 
    [StringLength(20, ErrorMessageResourceType = typeof(Resources.Global), ErrorMessageResourceName = "Range")] 
    public string ShortName { get; set; } 
} 

謝謝。

回答

1

您是否可以確保您傳遞Content-Type作爲請求的一部分? (如果content-type沒有被傳遞,那麼就會設置特定類型的默認值,並且模型狀態不會有錯誤......這個錯誤最近已經被修復)。

也,你可以做到以下幾點:

return Request.CreateErrorResponse(HttpStatusCode.BadRequest, this.ModelState) 
+0

是的,我已經經過'的Content-type:由小提琴手應用/ json',是不是? 我得到了我的對象'ProductViewModel'構造並填充了屬性,但ModelState.IsValid始終爲true,如果有REquired爲null的屬性並不重要,'IsValid'總是爲true。它是一個asp.net mvc webapi的bug嗎? – 2013-03-20 19:10:45

+0

內容類型看起來是正確的......你可以分享你的模型是什麼樣子,也可以從提琴手的原始請求? – 2013-03-20 19:11:37

+0

我編輯了我的帖子,看看我的模型,只有兩個屬性有一些驗證。我通過小提琴手傳過來的jSon是:'{Name:null,ShortName:「」}',只是爲了測試驗證,但驗證通過,我得到了我的ORM工具的其他例外(nhibernate)。 – 2013-03-20 19:17:04