【问题标题】:Setting ModelState values in custom model binder在自定义模型绑定器中设置 ModelState 值
【发布时间】:2010-04-06 21:47:31
【问题描述】:

我在 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?

【问题讨论】:

    标签: asp.net-mvc-2 modelbinders


    【解决方案1】:

    显然,一旦您更改了某个键的值,就无法重新验证 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 上保持粘性。我一直在搜索和试验,直到找到你的这个。我向你保证,没有多少人知道这个技巧。你救了我的命!谢谢!
    • 我尝试了您的解决方案,它对我的​​情况很有效。你能在stackoverflow.com/questions/23145780/… 看看我的问题吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 2012-07-31
    • 2012-02-18
    • 2012-01-29
    • 1970-01-01
    • 2018-08-22
    相关资源
    最近更新 更多