2011-01-31 66 views
8

這是一個控制器的動作,我用AJAX POST方法調用:如何更新ModelState?

[HttpPost] 
    public ActionResult Add(Comment comment) 
    { 
     if (User.Identity.IsAuthenticated) 
     { 
      comment.Username = User.Identity.Name; 
      comment.Email = Membership.GetUser().Email; 
     } 

     if (ModelState.IsValid) 
     { 
      this.db.Add(comment); 
      return PartialView("Comment", comment); 
     } 
     else 
     { 
      //... 
     } 
    } 

如果用戶登錄,提交表單沒有用戶名和電子郵件領域,所以他們沒有得到通過AJAX調用傳遞。當操作被調用時,ModelStat.IsValid返回false,因爲這兩個屬性是必需的。將有效值設置爲屬性後,如何觸發模型驗證以更新ModelState?

回答

4

您可以使用自定義model binder從User.Identity綁定評論的用戶名和電子郵件屬性。因爲綁定發生在驗證之前,所以ModelState將是有效的。

另一種選擇是爲Comment類實現自定義model validator,該類將檢查ControllerContext.Controller是否爲經過驗證的用戶。

通過實施這些選項中的任何一個,您可以刪除第一個選項。

3

您可以嘗試調用內置的TryUpdateModel方法,該方法返回一個布爾值,以便您可以檢查該值。

更新:嘗試使用帶有例外的TryUpdateModel。在行動中使用表單集合而不是評論。

[HttpPost] 
    public ActionResult Add(FormCollection collection) 
    { 

     string[] excludedProperties = new string[] { "Username". "Email" }; 
     var comment = new Comment(); 
     if (User.Identity.IsAuthenticated) 
     { 
      comment.Username = User.Identity.Name; 
      comment.Email = Membership.GetUser().Email; 
     } 

     TryUpdateModel<Comment>(comment, "", null, excludedProperties, collection.ToValueProvider()); 

     if (ModelState.IsValid) 
     { 
      this.db.Add(comment); 
      return PartialView("Comment", comment); 
     } 
     else 
     { 
      //... 
     } 
    } 
+0

不,這是我第一次嘗試和控制器中的所有其他方法:UpdateModel,ValidateModel,TryValidate。沒有任何工作,我得到一個例外:模型不能更新/驗證或類似的東西。 – frennky 2011-02-01 06:46:29

+0

在這種情況下,爲什麼不使用ViewModel?這將包含您傳遞給Action的所有屬性,無需擔心丟失的內容。 – Jon 2011-02-01 09:38:15