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