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

msi*_*msi 187 asp.net-mvc asp.net-mvc-2-validation

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

MembersManager.RegisterMember(member);
Run Code Online (Sandbox Code Playgroud)

catch部分向ModelState添加错误:

ModelState.AddModelError("error", ex.Message);
Run Code Online (Sandbox Code Playgroud)

但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; }
}
Run Code Online (Sandbox Code Playgroud)

控制器:

[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);
    }
}
Run Code Online (Sandbox Code Playgroud)

视图:

<% 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)%>
<% } %>
Run Code Online (Sandbox Code Playgroud)

Jab*_*Jab 318

我相信ValidationSummary标志的工作方式是它只显示ModelErrors string.empty作为键.否则,假设它是属性错误.没有验证您提供的字符串是/不是模型上的属性.

ModelState.AddModelError(string.Empty, ex.Message);
Run Code Online (Sandbox Code Playgroud)

  • 只是其他实现者的注释:`ModelState.AddModelError(string.Empty,ex);`似乎也不起作用.您必须使用`ModelState.AddModelError(string,string)`overload,如上所示. (26认同)
  • @LordCover:我猜这是"按设计工作"而不是错误 - 默认情况下使用的ValidationSummary()的重载排除了与模型本身属性相关的ModelState错误.这使得这些错误由Html.ValidationMessageFor()调用每个单独的属性来表示,而不会在摘要中重复这些错误.考虑到这一点,似乎任何使用非空键添加的模型错误都假定与模型属性相关联,即使该键与属性的名称不匹配也是如此. (9认同)
  • MVC5我仍然需要调用ex.Message才能使它工作. (4认同)
  • 更新:在MVC4中,似乎不再是这种情况.ModelState.AddModelError("",ex.Message); 作品 (2认同)

小智 65

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

    ModelState.AddModelError("keyName","Message");
Run Code Online (Sandbox Code Playgroud)

并显示如下:

    @Html.ValidationMessage("keyName")
Run Code Online (Sandbox Code Playgroud)


Lev*_*kon 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);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 是! 只需将`@ Html.ValidationSummary(true,"",new {@class ="text-danger"})更改为`@ Html.ValidationSummary(false,"",new {@class ="text-danger"}) ` (5认同)

Pio*_*nut 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

并在显示中添加:

<div class="alert alert-danger">
  @Html.ValidationMessage("keyName")
</div>
Run Code Online (Sandbox Code Playgroud)

要么

<div class="alert alert-danger">
  @Html.ValidationSummary(false)
</div>
Run Code Online (Sandbox Code Playgroud)


小智 6

@Html.ValidationSummary(false,"", new { @class = "text-danger" })
Run Code Online (Sandbox Code Playgroud)

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