【问题标题】:asp.net mvc httpPost Return View("Action", Model) is not working to show validation errorasp.net mvc httpPost Return View("Action", Model) 无法显示验证错误
【发布时间】:2016-01-14 17:39:57
【问题描述】:

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

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

    return View("Index", model);
}

我逐步浏览了代码和模型。MyEmail 已更新为“测试”。当调用 return View("Index","model") 时,电子邮件是原始电子邮件值而不是“测试”,因此没有验证错误。这是为什么呢?

谢谢。

【问题讨论】:

  • 参考this answer的第二部分,了解为什么在使用HtmlHelpers时更改模型属性没有效果。如果您想在 POST 之后更改属性的值,请遵循 PRG 模式并重定向。

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


【解决方案1】:

Html.TextBoxFor helper 方法尝试为您的模型属性生成输入字段标记时,它将首先查找ModelStateDictionary,如果它从中为您的视图模型属性获取值,它将使用该值。因此,在您的情况下,即使您将视图模型属性值更新为其他值,也不会使用更新后的值。

如果您真的想在操作方法中获取更新的属性值,则需要从 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" />
}

【讨论】:

    猜你喜欢
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多