web-dev-qa-db-fra.com

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

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

MembersManager.RegisterMember(member);

la section catch ajoute une erreur à ModelState:

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

Mais ValidationSummary n'affiche pas ce message d'erreur. Lorsque je définis Html.ValidationSummary (false), tous les messages s'affichent, mais je ne souhaite 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; }
}

Manette:

[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)%>
<% } %>
182
msi

Je pense que le drapeau ValidationSummary fonctionne comme suit: il affichera uniquement ModelErrors pour string.empty en tant que clé. Sinon, 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é du modèle.

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

Cela fonctionne mieux, car vous pouvez afficher validationMessage pour une clé spécifiée:

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

et l'affiche comme ceci:

    @Html.ValidationMessage("keyName")
60
ingvesund

Je sais que c'est un peu vieux et a été marqué comme réponses avec 147 votes en plus, 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 identiques, être affichées dans ValidationSummary si vous en avez besoin Cela entraînera une surcharge dans le 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);

enter image description here

28
Levitikon

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 l'affichage ajouter:

<div class="alert alert-danger">
  @Html.ValidationMessage("keyName")
</div>

OR

<div class="alert alert-danger">
  @Html.ValidationSummary(false)
</div>
6
Piotr Knut

Tu peux essayer,

<div asp-validation-summary="All" class="text-danger"></div>
0
Adrita Sharma

Si presque tout semble correct, vous devez également vous assurer que le résumé de validation n'est pas explicitement masqué via unCSSoverride comme ceci:

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

Cela peut également entraîner le masquage de @Html.ValidationSummary, car le récapitulatif est rendu dynamiquement avec la classe validation-summary-valid.

0
alex
@Html.ValidationSummary(false,"", new { @class = "text-danger" })

Utiliser cette ligne peut être utile 

0
S.D

Dans mon cas, cela 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, il est donc évident que ModelState.AddModelError("keyName","Message"); doit fonctionner avec un modèle.

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

0