ASP.NET MVC Html.ValidationSummary(true) 不显示模型错误
Posted
技术标签:
【中文标题】ASP.NET MVC Html.ValidationSummary(true) 不显示模型错误【英文标题】:ASP.NET MVC Html.ValidationSummary(true) does not display model errors 【发布时间】: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)%>
<% %>
【问题讨论】:
【参考方案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")
【讨论】:
以上是关于ASP.NET MVC Html.ValidationSummary(true) 不显示模型错误的主要内容,如果未能解决你的问题,请参考以下文章
七天学会ASP.NET MVC ——ASP.NET MVC 数据传递
ASP.NET MVC 5、ASP.NET Core MVC 5 有啥区别?