代码之家  ›  专栏  ›  技术社区  ›  mare

在自定义模型绑定器中设置模型状态值

  •  15
  • mare  · 技术社区  · 14 年前

    我正在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=……工作)。

    但是,模型状态没有更新。我之所以知道这一点,是因为我需要业务对象的slug属性,尽管我在自定义模型活页夹中修改了ModelStateDictionary,为它提供了一个slug(如上所示),modelState.isvalid仍然是假的。

    如果我在调试会话中将modelstate[“slug”]放在监视窗口中,它会说它有错误(1),所以显然它是空的,因此失败了。

    如何正确更改自定义模型绑定器代码中的模型状态?

    1 回复  |  直到 14 年前
        1
  •  20
  •   mare    14 年前

    显然,一旦更改某个键的值,就无法重新验证模型状态。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));
    
    推荐文章