198

我对 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)%>
<% } %>
4

10 回答 10

333

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

ModelState.AddModelError(string.Empty, ex.Message);
于 2010-05-12T13:26:53.213 回答
69

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

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

并像这样显示它:

    @Html.ValidationMessage("keyName")
于 2013-02-27T11:55:01.763 回答
28

我知道这有点老了,已经被标记为 147 票的答案,但还有其他事情需要考虑。

如果需要,您可以在 ValidationSummary 中显示所有模型错误、named 属性和 string.Empty 键等。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);

在此处输入图像描述

于 2013-11-13T22:50:15.397 回答
9

也许是这样:

[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>
于 2014-10-12T14:04:04.217 回答
6
@Html.ValidationSummary(false,"", new { @class = "text-danger" })

使用这条线可能会有所帮助

于 2018-12-31T04:43:49.187 回答
3

就我而言,由于退货,它无法正常工作。

而不是使用:

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 添加验证

于 2014-09-27T23:43:44.810 回答
0

如果几乎一切看起来都正确,另一件需要注意的事情是确保验证摘要没有通过一些CSS覆盖显式隐藏,如下所示:

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

这也可能导致@Html.ValidationSummary显示隐藏,因为摘要是与类一起动态呈现的validation-summary-valid

于 2015-05-12T20:37:03.370 回答
0

你可以试试,

<div asp-validation-summary="All" class="text-danger"></div>
于 2019-08-30T19:34:56.070 回答
0

use can use bellow lines

    @if (!ViewData.ModelState.IsValid)
                {
                    @Html.ValidationSummary("", new { @class = "alert alert-warning alert-dismissible fade show" })
                }

and for each field use somthing like this:

                    @Html.ValidationMessageFor(m => m.Email, null, new { @class = "field-validation-error " })
于 2021-12-10T09:13:22.247 回答
-5

将其添加到您的视图的最下方:

@section 脚本 { @Scripts.Render("~/bundles/jqueryval") }

于 2015-04-06T10:43:43.050 回答