63 votes

Modèle ValidationSummary personnalisé Asp.net MVC 3

Je travaille sur un projet avec Asp.Net MVC3

Dans une vue, j'ai @Html.ValidationSummary(true) et comme d'habitude cela produit

 <div class="validation-summary-errors">
    <ul>
        <li>Something bad Happened!</li>
    </ul>
</div>
 

Comment puis-je étendre ce résumé de validation à MyValidationSummary et produire le modèle de code html à peu près comme ceci:

 <div class="notification warning"> 
    <span></span> 
    <div class="text"> <p>Something bad Happened!</p> </div> 
</div>
 

136voto

flo Points 1409

Mon approche consiste à utiliser une coutume ValidationSummary.cshtml :

 @model ModelStateDictionary

@if(!Model.IsValid)
{
    <div class="validation-summary-errors">
        <ul>
            @foreach (var modelError in 
                     Model.SelectMany(keyValuePair => keyValuePair.Value.Errors))
            {
                <li>@modelError.ErrorMessage</li>
            }
        </ul>
    </div>
}
 

Placez cette vue partielle dans votre dossier partagé et faites-y référence à partir de votre code:

 Html.RenderPartial("ValidationSummary", @ViewData.ModelState);
 

De cette façon, vous gardez le plein contrôle de votre code HTML.

46voto

Muhammad Adeel Zahid Points 8420

Cette question, les détails de la procédure de l'écriture personnalisée récapitulatif de la validation.

MODIFIER Cela va faire ce que vous voulez:

 public static class LinqExt 
    {
        static string MyValidationSummary(this HtmlHelper helper, string validationMessage="") 
        {
            string retVal = "";
            if (helper.ViewData.ModelState.IsValid)
                return "";
            retVal += "<div class='notification-warnings'><span>";
            if (!String.IsNullOrEmpty(validationMessage))
                retVal += helper.Encode(validationMessage);
            retVal += "</span>";
            retVal += "<div class='text'>";
            foreach (var key in helper.ViewData.ModelState.Keys) 
            {
                foreach(var err in helper.ViewData.ModelState[key].Errors)
                retVal += "<p>" + helper.Encode(err.ErrorMessage) + "</p>";
            }
            retVal += "</div></div>";
            return retVal.ToString();
        }
    }

Le code est auto-explicatif; juste l'énumération par modelstate erreurs et d'emballage des erreurs dans les dom élément de votre choix. Il y a une erreur qui est si je l'utilise comme:

<%:Html.MyValidationSummary()%>

Il affiche des balises html sur la page comme texte plutôt que de le rendre.

<%=Html.MyValidationSummary()%>

Cela fonctionne très bien.

23voto

Leniel Macaferi Points 38324

Bâtiment sur flos réponse, je l'ai fait compatible avec Microsoft jQuery Discrète Validation et ajouté Bootstrap 3 panneau de style. Voici le nouveau code:

@model ModelStateDictionary

<div class="@(Html.ViewData.ModelState.IsValid ? "validation-summary-valid" : "validation-summary-errors") panel panel-danger"
     data-valmsg-summary="true">
    <div class="panel-heading">
        Please, correct the following errors:
    </div>
    <div class="panel-body">
        <ul>
            @foreach(var modelError in Model.SelectMany(keyValuePair => keyValuePair.Value.Errors))
            {
                <li>@modelError.ErrorMessage</li>
            }
        </ul>
    </div>
</div>

Vous pouvez lire à ce sujet en détail ici:

La création d'un custom ASP.NET MVC @Html.ValidationSummary de style avec Bootstrap 3 panneau

J'ai également créé un échantillon ASP.NET projet MVC pour montrer cette coutume ValidationSummary dans l'action. Obtenez-le ici:

https://github.com/leniel/AspNetMvcCustomHtmlValidationSummary

2voto

Matt Roberts Points 5488

Juste de poster ma réponse ici, car il fonctionne bien pour moi ;)

J'utilise une simple extension de la méthode qui prend un MvcHtmlString et le décode en arrière au format HTML:

    public static MvcHtmlString ToMvcHtmlString(this MvcHtmlString htmlString)
    {
        if (htmlString != null)
        {
            return new MvcHtmlString(HttpUtility.HtmlDecode(htmlString.ToString()));
        }
        return null;
    }

À l'aplomb de cela, j'ai ajouté le résumé de validation de l'aide pour mon chstml comme ceci:

@Html.ValidationSummary(true).ToMvcHtmlString()

Cela signifie, que je peux ajouter votre propre code HTML pour mes validation des résumés:

ModelState.AddModelError("", "<p>This message can have html in it</p>");

Et je peux même ajouter votre propre code HTML pour mon champ de la validation des messages:

ModelState.AddModelError("MyField", "<p>This message can have html in it</p>");

Et pour obtenir mon champ de la validation des messages à travailler avec le format HTML:

@Html.ValidationMessageFor(model => model.MyField).ToMvcHtmlString()

0voto

rob Points 519

Je voulais montrer seulement le message de haut niveau et rien d'autre. Nous avons déjà la validation à côté des champs ci-dessous. En travaillant sur la solution de @ Leniel-Macaferi, voici ce que j'ai fait pour que cela fonctionne avec la validation jQuery: (added style = "display: none;")

 <div class="@(Html.ViewData.ModelState.IsValid ? "validation-summary-valid" : "validation-summary-errors")"
     data-valmsg-summary="true">
    <div>
        There are still some fields not filled in before we can submit this. Please correct.
    </div>
    <div style="display: none;">
        <ul>
            @foreach (var modelError in Model.SelectMany(keyValuePair => keyValuePair.Value.Errors))
            {
                <li>@modelError.ErrorMessage</li>
            }
        </ul>
    </div>
</div>
 

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