ASP.NET MVC Html.ValidationSummary(true)不显示模型错误


194

我对Html.ValidationSummary有一些问题。我不想在ValidationSummary中显示属性错误。当我设置Html.ValidationSummary(true)时,它不会显示来自ModelState的错误消息。当对字符串的控制器操作中出现某些异常时

MembersManager.RegisterMember(member);

catch部分将错误添加到ModelState:

ModelState.AddModelError("error", ex.Message);

但是ValidationSummary不会显示此错误消息。当我设置Html.ValidationSummary(false)时,将显示所有消息,但我不想显示属性错误。我该如何解决这个问题?

这是我正在使用的代码:

模型:

public class Member
{
        [Required(ErrorMessage = "*")]
        [DisplayName("Login:")]
        public string Login { get; set; }

        [Required(ErrorMessage = "*")]
        [DataType(DataType.Password)]
        [DisplayName("Password:")]
        public string Password { get; set; }

        [Required(ErrorMessage = "*")]
        [DataType(DataType.Password)]
        [DisplayName("Confirm Password:")]
        public string ConfirmPassword { get; set; }
}

控制器:

[HttpPost]
public ActionResult Register(Member member)
{
    try
    {
        if (!ModelState.IsValid)
            return View();

        MembersManager.RegisterMember(member);
    }
    catch (Exception ex)
    {
        ModelState.AddModelError("error", ex.Message);

        return View(member);
    }
}

视图:

<% using (Html.BeginForm("Register", "Members", FormMethod.Post, 
                        new { enctype = "multipart/form-data" })) {%> 
    <p>
        <%= Html.LabelFor(model => model.Login)%>
        <%= Html.TextBoxFor(model => model.Login)%>
        <%= Html.ValidationMessageFor(model => model.Login)%>
    </p>

    <p>
        <%= Html.LabelFor(model => model.Password)%>
        <%= Html.PasswordFor(model => model.Password)%>
        <%= Html.ValidationMessageFor(model => model.Password)%>
    </p>

    <p>
        <%= Html.LabelFor(model => model.ConfirmPassword)%>
        <%= Html.PasswordFor(model => model.ConfirmPassword)%>
        <%= Html.ValidationMessageFor(model => model.ConfirmPassword)%>
    </p>

    <div>
        <input type="submit" value="Create" />
    </div>

    <%= Html.ValidationSummary(true)%>
<% } %>

Answers:


324

我相信ValidationSummary标志的工作方式是它只会显示ModelErrors string.empty作为键。否则,假定这是一个属性错误。您要添加的自定义错误的键为“错误”,因此在您调用ValidationSummary(true)时不会显示该错误。您需要添加带有空键的自定义错误消息,如下所示:

ModelState.AddModelError(string.Empty, ex.Message);

9
@LordCover:我猜这是“按设计工作”,而不是错误-默认情况下使用的ValidationSummary()重载排除了与模型本身的属性相关的ModelState错误。这使得这些错误可以由Html.ValidationMessageFor()调用来表示,每个调用属性都无需在摘要中重复它们。考虑到这一点,即使键与属性名称不匹配,也可以认为添加了非空键的任何模型错误均与模型属性相关联。
Daniel Schaffer

26
只是给其他实现者的提示:ModelState.AddModelError(string.Empty, ex);似乎也不起作用。您必须使用上述ModelState.AddModelError(string, string)过载。
wolfyuk

2
更新:在MVC4中似乎不再是这种情况。ModelState.AddModelError(“”,ex.Message); 作品
尼尔·汤普森

4
MVC5我仍然需要调用ex.Message使它工作。
smiggleworth 2014年

保存了一天!MVC5仍然存在一些问题:)
juF18

67

这样效果更好,因为您可以显示指定键的validationMessage:

    ModelState.AddModelError("keyName","Message");

并显示如下:

    @Html.ValidationMessage("keyName")

28

我知道这有点陈旧,已经以147票的高分被标记为答案,但是还有其他事情需要考虑。

您可以拥有所有模型错误,即属性name和string.Empty键,如果需要,可以在ValidationSummary中显示。ValidationSummary中有一个重载将执行此操作。

    //   excludePropertyErrors:
    //   true to have the summary display model-level errors only, or false to have
    //   the summary display all errors.
    public static MvcHtmlString ValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors);

在此处输入图片说明


5
是! 只要改变@Html.ValidationSummary(true, "", new { @class = "text-danger" })@Html.ValidationSummary(false, "", new { @class = "text-danger" })
Xeningem

7

可能是这样的:

[HttpPost]
public ActionResult Register(Member member)
{
    try
    {
       if (!ModelState.IsValid)
       {
          ModelState.AddModelError("keyName", "Form is not valid");
          return View();
       }
       MembersManager.RegisterMember(member);
    }
    catch (Exception ex)
    {
       ModelState.AddModelError("keyName", ex.Message);
       return View(member);
    }
}

并在显示中添加:

<div class="alert alert-danger">
  @Html.ValidationMessage("keyName")
</div>

要么

<div class="alert alert-danger">
  @Html.ValidationSummary(false)
</div>

5
@Html.ValidationSummary(false,"", new { @class = "text-danger" })

使用此行可能会有所帮助


在cshtml文件的上方添加行。
sachind '18

2

就我而言,由于退货,它不起作用。

而不是使用:

return RedirectToAction("Rescue", "CarteiraEtapaInvestimento", new { id = investimento.Id, idCarteiraEtapaResgate = etapaDoResgate.Id });

我用了:

return View("ViewRescueCarteiraEtapaInvestimento", new CarteiraEtapaInvestimentoRescueViewModel { Investimento = investimento, ValorResgate = investimentoViewModel.ValorResgate });

这是一个模型,因此ModelState.AddModelError("keyName","Message");必须与模型一起使用是不可行的。

这个答案说明了为什么。 使用DataAnnotations添加验证


0

如果几乎一切都看似正确,则需要注意的另一件事是确保验证摘要不会通过某些CSS覆盖显式隐藏,如下所示:

.validation-summary-valid {
    display: none;
}

@Html.ValidationSummary由于摘要是随validation-summary-valid类动态呈现的,因此这也可能导致隐藏。



-4

将其添加到视图的最下部:

@section脚本{@ Scripts.Render(“〜/ bundles / jqueryval”)}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.