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

我有一些Html.ValidationSummary的问题。 我不想在ValidationSummary中显示属性错误。 而当我设置Html.ValidationSummary(true)它不显示来自ModelState的错误消息。 当控制器在string上有一些exception时

MembersManager.RegisterMember(member); 

catch部分向ModelState添加一个错误:

 ModelState.AddModelError("error", ex.Message); 

但ValidationSummary不显示此错误消息。 当我设置Html.ValidationSummary(假)所有消息正在显示,但我不想显示属性错误。 我该如何解决这个问题?

这是我正在使用的代码:

模型:

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

我相信ValidationSummary标志的工作方式是只显示Model.empty为string.empty作为关键。 否则,它被认为是属性错误。 没有validation您提供的string是/不是模型上的属性。

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

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

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

并像这样显示它:

  @Html.ValidationMessage("keyName") 

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

如果需要,可以将所有模型错误,命名属性和string.Empty键一样显示在ValidationSummary中。 在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); 

在这里输入图像描述

也许这样:

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

在我的情况下,因为返回而没有工作。

而不是使用:

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

我用了:

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

它是一个模型,所以它是模型状态.AddModelError ModelState.AddModelError("keyName","Message"); 必须与模型一起工作。

这个答案显示了原因。 使用DataAnnotations添加validation

如果几乎所有东西看起来都是正确的,那么要注意的另一件事是确保validation摘要不是通过像这样的CSS重写来显式隐藏的:

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

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

将其添加到您的视图的最下面部分:

@section脚本{@ Scripts.Render(“〜/ bundles / jqueryval”)}