Asp.net-Mvc-2

在自定義模型綁定器中設置 ModelState 值

  • April 7, 2010

我在 ASP.NET MVC 2 中使用自定義模型綁定器,如下所示:

   public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
   {
       if (controllerContext == null)
       {
           throw new ArgumentNullException("controllerContext");
       }
       if (bindingContext == null)
       {
           throw new ArgumentNullException("bindingContext");
       }

       BaseContentObject obj = (BaseContentObject)base.BindModel(controllerContext, bindingContext);
       if(string.IsNullOrWhiteSpace(obj.Slug))
       {
           // creating new object
           obj.Created = obj.Modified = DateTime.Now;
           obj.ModifiedBy = obj.CreatedBy = controllerContext.HttpContext.User.Identity.Name;
           // slug is not provided thru UI, derivate it from Title; property setter removes chars that are not allowed
           obj.Slug = obj.Title;
           ModelStateDictionary modelStateDictionary = bindingContext.ModelState;
           modelStateDictionary.SetModelValue("Slug", new ValueProviderResult(obj.Slug, obj.Slug, null));
...

當我從這個活頁夾返回到控制器動作時,作為動作參數提供的我的業務對像被正確更改(obj.Created = …. 行工作)。

但是,ModelState 沒有更新。我知道這一點是因為我在我的業務對象的 Slug 屬性上有Required,雖然我在我的自定義模型綁定器中更改了 ModelStateDictionary,為它提供了一個 Slug(如您在上面看到的),但 ModelState.IsValid 仍然是錯誤的。

如果我在調試會話中將 ModelState[“Slug”] 放在我的 Watch 視窗中,它會說它有錯誤 (1),所以顯然它是空的,因此失敗了。

如何正確更改自定義模型綁定器程式碼中的 ModelState?

顯然,一旦您更改了某個鍵的值,就無法重新驗證 ModelState。IsValid 保持為假,因為為某個鍵設置新值不會觸發重新驗證。

解決方案是首先刪除觸發 IsValid 為 false 的鍵,然後重新創建它並將值分配給它。當您這樣做時,ModelState 會自動重新驗證,如果一切正常,IsValid 返回 true。

像這樣:

bindingContext.ModelState.Remove("Slug");
bindingContext.ModelState.Add("Slug", new ModelState());
bindingContext.ModelState.SetModelValue("Slug", new ValueProviderResult(obj.Slug, obj.Slug, null));

引用自:https://stackoverflow.com/questions/2588588