197 votes

ASP.NET MVC Html.ValidationSummary (true) n'affiche pas les erreurs de modèle

J'ai un problème avec le Html.ValidationSummary. Je ne veux pas afficher les erreurs de propriété dans ValidationSummary. Et quand je Html.ValidationSummary(vrai) il n'affiche pas les messages d'erreur de ModelState. Lorsqu'il y a une Exception dans l'action du contrôleur sur chaîne

MembersManager.RegisterMember(member);

section catch ajoute une erreur dans la ModelState:

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

Mais ValidationSummary ne pas afficher ce message d'erreur. Lorsque j'ai mis le code Html.ValidationSummary(faux) tous les messages sont affichés, mais je ne veux pas afficher les erreurs de propriété. 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);
            }
        }

Vue:

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

331voto

Jab Points 8901

Je crois que la façon dont l'indicateur ValidationSummary fonctionne est qu'il affichera seulement ModelErrors pour string.empty comme clé. Sinon, il est supposé 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);
 

69voto

ingvesund Points 193

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")
 

28voto

Levitikon Points 2258

Je sais que c'est un peu vieux et a été marqué comme des réponses avec 147 voix, mais il y a autre chose à considérer.

Vous pouvez avoir toutes les erreurs de modèle, la propriété nommée et les clés string.Empty, être montrées dans le ValidationSummary si vous avez besoin. Il y a une surcharge dans le ValidationSummary qui fera 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);
 

entrez la description de l'image ici

3voto

Dans mon cas, ça ne fonctionnait pas à cause du retour.

À la place 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 });
 

C'est un modèle, donc il est évident que ModelState.AddModelError("keyName","Message"); doit travailler avec un modèle.

Cette réponse montre pourquoi. Ajout de validation avec DataAnnotations

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X