我有一个实现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
}
}
答案 0 :(得分:3)
我没有看到这一点。您有一个控制器操作,它接收您手动纠正的用户输入,如果无效并且愿意在之后测试该模型是否有效。如果您已手动纠正它,为什么还要再次测试?你知道它会有效,不是吗?编写一个你要重写的验证规则有什么意义?
另请注意,您在POST控制器操作中纠正的所有内容(如更新模型属性)后面应跟ModelState.Remove("TheKeyOfThePropertyYouHaveManuallyUpdated")
,以便这些手动更改产生一些影响。