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)%>
<% } %>
177
demandé sur Daniel 2010-05-12 15:15:05

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);
306
répondu Jab 2010-09-27 03:29:53

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")
58
répondu ingvesund 2013-02-27 11:55:01

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

enter image description here

28
répondu Levitikon 2013-11-13 22:50:15

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>
6
répondu Piotr Knut 2014-11-02 18:30:05

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

0
répondu Allan Patrick Patzlaff 2017-05-23 12:03:05

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 .

0
répondu alex 2015-05-12 20:37:03

ajouter dans la partie la plus basse de votre vue:

@Scripts de section { @Script.Render ("~/bundles/jqueryval")}

-4
répondu ronIT 2015-04-06 11:12:56