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

我在使用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)%>
<% } %>
241724 次浏览

I believe the way the ValidationSummary flag works is it will only display ModelErrors for string.empty as the key. Otherwise it is assumed it is a property error. The custom error you're adding has the key 'error' so it will not display in when you call ValidationSummary(true). You need to add your custom error message with an empty key like this:

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

This works better, as you can show validationMessage for a specified key:

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

and display it like this:

    @Html.ValidationMessage("keyName")

I know this is kind of old and has been marked as answers with 147 up votes, but there is something else to consider.

You can have all the model errors, the property named and string.Empty keys alike, be shown in the ValidationSummary if you need to. There is an overload in the ValidationSummary that will do this.

    //   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

In my case it was not working because of the return.

Instead of using:

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

I used:

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

It´s a Model, so it is obvius that ModelState.AddModelError("keyName","Message"); must work with a model.

This answer show why. Adding validation with DataAnnotations

Maybe like that:

[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);
}
}

And in display add:

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

OR

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

ADD it in the lowermost part og your View:

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

If nearly everything seems right, another thing to look out for is to ensure that the validation summary is not being explicitly hidden via some CSS override like this:

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

This may also cause the @Html.ValidationSummary to appear hidden, as the summary is dynamically rendered with the validation-summary-valid class.

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

Using this line may be helpful

You can try,

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

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 " })