asp.net mvc httpPost返回视图(“Action”,Model)无法显示验证错误

时间:2016-01-14 17:39:58

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

我编写了HttpPost方法并添加了验证错误以进行测试。

[HttpPost]
public ActionResult UpdateDate(MyModel model)
{
    model.MyEmail = "test";
        ModelState.AddModelError("MyEmail", "Email is invalid");

    return View("Index", model);
}

我逐步完成了代码和模型.MyEmail更新了“test”。当调用返回视图(“索引”,“模型”)时,电子邮件是原始电子邮件值而不是“测试”,因此没有验证错误。这是为什么?

感谢。

1 个答案:

答案 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" />
}