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

时间:2010-05-12 11:15:05

标签: asp.net-mvc asp.net-mvc-2-validation

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

9 个答案:

答案 0 :(得分:315)

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

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

答案 1 :(得分:62)

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

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

并显示如下:

    @Html.ValidationMessage("keyName")

答案 2 :(得分:28)

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

如果需要,您可以在ValidationSummary中显示所有模型错误,名为property和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);

enter image description here

答案 3 :(得分: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>

OR

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

答案 4 :(得分:1)

就我而言,由于回归而无法正常工作。

而不是使用:

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");必须与模型一起工作才是显而易见的。

这个答案说明了原因。 Adding validation with DataAnnotations

答案 5 :(得分:1)

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

使用此行可能会有所帮助

答案 6 :(得分:0)

如果几乎​​所有内容都是正确的,另外需要注意的是确保验证摘要不会通过某些 CSS 覆盖显式隐藏,如下所示:

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

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

答案 7 :(得分:0)

您可以尝试

<div asp-validation-summary="All" class="text-danger"></div>

答案 8 :(得分:-4)

在视图的最下方添加它:

@section Scripts {@ Scripts.Render(&#34;〜/ bundles / jqueryval#34;)}