我编写了HttpPost方法并添加了验证错误以进行测试。
[HttpPost]
public ActionResult UpdateDate(MyModel model)
{
model.MyEmail = "test";
ModelState.AddModelError("MyEmail", "Email is invalid");
return View("Index", model);
}
我逐步完成了代码和模型.MyEmail更新了“test”。当调用返回视图(“索引”,“模型”)时,电子邮件是原始电子邮件值而不是“测试”,因此没有验证错误。这是为什么?
感谢。
答案 0 :(得分:1)
当Html.TextBoxFor
辅助方法尝试为您的模型属性生成输入字段标记时,它将首先查找ModelStateDictionary,如果它从您的视图模型属性获取值,它将使用那个价值。因此,在您的情况下,即使您将视图模型属性值更新为其他值,也不会使用更新的值。
如果您真的想要获取在action方法中更新的属性值,则需要从ModelStateDictionary中显式删除该项。
您可以使用ModelState.Remove("SomeKeyForYourFormField")
方法删除您将用表单字段名称替换"SomeKeyForYourFormField"
的单个项目。
[HttpPost]
public ActionResult UpdateDate(MyModel model)
{
model.MyEmail = "test";
ModelState.AddModelError("MyEmail", "Email is invalid"); // No effect ! Read further
ModelState.Remove("MyEmail");
return View("Index", model);
}
如果您希望清除ModelStateDictionary中的所有项目,也可以使用ModelState.Clear()
方法。
由于我们正在清除"MyEmail
"的ModelStateDictionary条目,因此您不会在视图中看到验证错误,因为您在ModelStateDictionary ModelState.Remove("MyEmail")被执行时,>将被清除 。
您可以交换这些行的顺序并亲自查看行为。
当然,要查看验证错误,您需要在视图中为视图模型的相应属性调用ValidationMessgeFor
辅助方法。
@model MyModel
@using (Html.BeginForm("UpdateDate","Home"))
{
@Html.TextBoxFor(f=>f.MyEmail)
@Html.ValidationMessageFor(g=>g.MyEmail)
<input type="submit" />
}