【问题标题】:ASP.NET MVC Html.ValidationSummary(true) does not display model errorsASP.NET MVC Html.ValidationSummary(true) 不显示模型错误
【发布时间】:2010-05-12 11:15:05
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • @LordCover:我猜这是“按设计工作”而不是错误 - 默认使用的 ValidationSummary() 的重载排除了与模型本身属性相关的 ModelState 错误。这使得这些错误由 Html.ValidationMessageFor() 对每个单独的属性调用表示,而不会在摘要中重复它们。请记住,使用非空键添加的任何模型错误似乎都假定与模型属性相关联,即使该键与属性名称不匹配。
    • 只是给其他实现者的注释:ModelState.AddModelError(string.Empty, ex); 似乎也不起作用。如上所示,您必须使用 ModelState.AddModelError(string, string) 重载。
    • 更新:在 MVC4 中,这似乎不再是这种情况。 ModelState.AddModelError("", ex.Message);作品
    • MVC5 我仍然需要调用 ex.Message 才能使其工作。
    • 拯救了这一天! MVC5 仍然有一些问题:)
    【解决方案2】:

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

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

    并像这样显示它:

        @Html.ValidationMessage("keyName")
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 是的!只需将@Html.ValidationSummary(true, "", new { @class = "text-danger" }) 更改为@Html.ValidationSummary(false, "", new { @class = "text-danger" })
      【解决方案4】:

      可能是这样的:

      [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 文件中添加以上行。
        【解决方案6】:

        在我的情况下,由于退货,它无法正常工作。

        而不是使用:

        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

        【讨论】:

          【解决方案7】:

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

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

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

          【讨论】:

            【解决方案8】:

            你可以试试,

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

            【讨论】:

            • 注意 - 这必须是
              ,如果是 则不会渲染。
            【解决方案9】:

            使用可以使用波纹管

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

            并且对于每个字段都使用这样的东西:

                                @Html.ValidationMessageFor(m => m.Email, null, new { @class = "field-validation-error " })
            

            【讨论】:

              【解决方案10】:

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

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

              【讨论】:

                猜你喜欢
                • 2012-04-18
                • 1970-01-01
                • 2019-05-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-07-17
                • 1970-01-01
                相关资源
                最近更新 更多