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