Asp.net-Mvc-2
在自定義模型綁定器中設置 ModelState 值
我在 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));