Asp.net mvc 2 在自定义模型绑定器中设置模型状态值
我在ASP.NET MVC 2中使用的自定义模型绑定器如下所示:Asp.net mvc 2 在自定义模型绑定器中设置模型状态值,asp.net-mvc-2,modelbinders,Asp.net Mvc 2,Modelbinders,我在ASP.NET MVC 2中使用的自定义模型绑定器如下所示: public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { if (controllerContext == null) { throw new ArgumentNullException("control
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=..work行)
但是,ModelState不会更新。我之所以知道这一点,是因为我对业务对象的Slug属性进行了必要的修改,尽管我在自定义模型绑定器中修改了ModelStateDictionary,为其提供了Slug(如上面所示),但ModelState.IsValid仍然为false
如果我在调试会话中将ModelState[“Slug”]放在我的监视窗口中,它会说它有错误(1),所以它显然是空的,因此会失败
如何在自定义模型绑定器代码中正确更改ModelState?显然,一旦更改某个键的值,就无法重新验证ModelState。IsValid仍然为false,因为为某个键设置新值不会触发重新验证 解决方案是首先删除触发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));
您的解决方案需要在stackoverflow时保持粘性。我一直在到处寻找和试验,直到我找到了你的这个。我向你保证,没有多少人知道这个把戏。你救了我的命!非常感谢。我试过你的解决方案,它对我的情况有点奏效。你能看看我的问题吗?非常感谢。