IValidateObject如何清除/重置ModelState.IsValid

时间:2011-04-14 21:20:15

标签: asp.net-mvc asp.net-mvc-3

我有一个实现IValidateObject的类。我在控制器的操作中做了一些额外的工作后,我的业务规则得到了满足。我遇到的问题是ModelState.IsValid仍然是假的。我试图找到如何重置或重新运行,以便更新ModelState。我尝试了TryUpdateModel,它触发了Validate方法,如果我单步执行我的规则现在有效,但是ModelState.IsValid仍然是假的(我可以看到它仍在抱怨相同的规则)。

    [HttpPost]
    public ActionResult Create(MyModel model)
    {
        //ModelState.IsValid is False at this point

        //model.Do More Stuff To Satisfy IValidateObject rule. At this point all my rules are valid

        TryUpdateModel(model); // <-- If run TryUpdateModel and step through, I can see my rule is valid 

        if (ModelState.IsValid) // this is still False
        {
            //Save
        }
    }

更新

我最后打电话给

ModelState.Clear();

[HttpPost]

   public ActionResult Create(MyModel model)
   {   
        //model.Do More Stuff To Satisfy IValidateObject rule. At this point all my rules are valid
        ModelState.Clear();

        TryUpdateModel(model); 

        if (ModelState.IsValid)
        {
            //Save
        }
    }

1 个答案:

答案 0 :(得分:3)

我没有看到这一点。您有一个控制器操作,它接收您手动纠正的用户输入,如果无效并且愿意在之后测试该模型是否有效。如果您已手动纠正它,为什么还要再次测试?你知道它会有效,不是吗?编写一个你要重写的验证规则有什么意义?

另请注意,您在POST控制器操作中纠正的所有内容(如更新模型属性)后面应跟ModelState.Remove("TheKeyOfThePropertyYouHaveManuallyUpdated"),以便这些手动更改产生一些影响。