ASP.NET MVC Html.ValidationSummary (true) n'affiche pas les erreurs du modèle
j'ai un problème avec Html.ValidationSummary. Je ne veux pas afficher d'erreurs de propriétés dans ValidationSummary. Et quand je mets Html.ValidationSummary (true) il n'affiche pas les messages d'erreur de ModelState. Quand il y a une certaine Exception dans l'action du controller sur la chaîne
MembersManager.RegisterMember(member);
section catch ajoute une erreur au ModelState:
ModelState.AddModelError("error", ex.Message);
mais ValidationSummary n'affiche pas ce message d'erreur. Lorsque j'ai mis HTML.ValidationSummary (false) tous les messages s'affichent, mais je ne veux pas afficher d'erreurs de propriétés. Comment puis-je résoudre ce problème?
voici le code que j'utilise:
Modèle:
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; }
}
contrôleur:
[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)%>
<% } %>
7 réponses
je crois que la façon dont le drapeau de ValidationSummary fonctionne est qu'il affichera seulement les erreurs de Modèlepour string.empty
comme la clé. Autrement, on suppose qu'il s'agit d'une erreur de propriété. Il n'y a aucune validation que la chaîne que vous fournissez est/n'est pas une propriété sur le modèle.
ModelState.AddModelError(string.Empty, ex.Message);
cela fonctionne mieux, car vous pouvez afficher validationMessage pour une clé spécifiée:
ModelState.AddModelError("keyName","Message");
et l'afficher comme ceci:
@Html.ValidationMessage("keyName")
je sais que c'est un peu vieux et a été marqué comme des réponses avec 147 voix vers le haut, mais il y a quelque chose d'autre à considérer.
vous pouvez avoir toutes les erreurs de modèle, la propriété nommée et la chaîne.Les clés vides aussi bien, être affiché dans le ValidationSummary si vous avez besoin. Il y a une surcharge dans le résumé de validation qui va faire cela.
// 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);
peut-être comme ça:
[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);
}
}
et dans display ajouter:
<div class="alert alert-danger">
@Html.ValidationMessage("keyName")
</div>
ou
<div class="alert alert-danger">
@Html.ValidationSummary(false)
</div>
dans mon cas, ça ne marchait pas à cause du retour.
au lieu d'utiliser:
return RedirectToAction("Rescue", "CarteiraEtapaInvestimento", new { id = investimento.Id, idCarteiraEtapaResgate = etapaDoResgate.Id });
j'ai utilisé:
return View("ViewRescueCarteiraEtapaInvestimento", new CarteiraEtapaInvestimentoRescueViewModel { Investimento = investimento, ValorResgate = investimentoViewModel.ValorResgate });
est un modèle, il est donc évident que ModelState.AddModelError("keyName","Message");
doit fonctionner avec un modèle.
cette réponse montre pourquoi. ajout de la validation avec les données
si presque tout semble correct, une autre chose à surveiller est de s'assurer que le résumé de validation n'est pas caché explicitement via quelque CSS override like this:
.validation-summary-valid {
display: none;
}
cela peut aussi faire apparaître le @Html.ValidationSummary
caché, car le résumé est dynamiquement rendu avec la classe validation-summary-valid
.
ajouter dans la partie la plus basse de votre vue:
@Scripts de section { @Script.Render ("~/bundles/jqueryval")}