492 votes

Comment obtenir toutes les erreurs de ASP.Net MVC modelState ?

Je veux obtenir tous les messages d'erreur du modelState sans connaître les valeurs des clés. En bouclant pour récupérer tous les messages d'erreur que le ModelState contient.

Comment puis-je le faire ?

6 votes

Si vous ne faites qu'afficher les erreurs, alors @Html.ValidationSummary() est un moyen rapide de les afficher tous dans razor.

12 votes

foreach (var error in ViewData.ModelState.Values.SelectMany(modelState => modelState.Errors)) { DoSomething(error); }

0 votes

Merci à tous de m'avoir aiguillé dans la bonne direction. Comme @viggity l'a dit, les clés sont importantes et ceci a fonctionné pour moi : ModelState.Where(e=>e.Value.Errors.Count > 0).ToList()

582voto

mmutilva Points 5226

Utilisation de LINQ :

IEnumerable<ModelError> allErrors = ModelState.Values.SelectMany(v => v.Errors);

87 votes

Modifié pour retourner IEnumerable<string> avec juste le message d'erreur: : var allErrors = ModelState.Values.SelectMany(v => v.Errors.Select(b => b.ErrorMessage)) ;

7 votes

C'est génial, mais malheureusement Watch/Immediate Windows ne supporte pas les lambdas :(

0 votes

Ne fonctionne pas pour moi. Les valeurs ne contiennent pas de définition pour Select many. Dois-je inclure quelque chose, une bibliothèque, LINQ ou autre ?

577voto

Oren Trutner Points 12125
foreach (ModelState modelState in ViewData.ModelState.Values) {
    foreach (ModelError error in modelState.Errors) {
        DoSomethingWith(error);
    }
}

Voir aussi Comment obtenir la collection des Model State Errors dans ASP.NET MVC ? .

25 votes

Très utile. Notez que dans certains scénarios, tels que les échecs de liaison et les mauvaises demandes, il y aura des entrées ModelState avec une chaîne vide pour les éléments suivants Value.ErrorMessage et à la place un Value.Exception.Message

8 votes

Les erreurs sont agréables mais parfois vous voulez aussi la clé du modelstate (c'est-à-dire le nom du champ). Vous pouvez obtenir cela en changeant la première ligne en ceci : foreach (KeyValuePair<string, ModelState> kvp in htmlHelper.ViewData.ModelState) { et insérez cette ligne en dessous : var modelState = kvp.Value; . Vous pouvez obtenir la clé à partir de kvp.Key

211voto

Dunc Points 4360

En s'appuyant sur la version LINQ, si vous souhaitez regrouper tous les messages d'erreur en une seule chaîne de caractères :

string messages = string.Join("; ", ModelState.Values
                                        .SelectMany(x => x.Errors)
                                        .Select(x => x.ErrorMessage));

7 votes

L'autre option est de faire ce qui suit : ModelState.Values.SelectMany(x => x.Errors).Select(x => x.ErrorMessage).JoinString(" ; ") ;

3 votes

@Tod, est-ce que IEnumerable.JoinString() est votre propre méthode d'extension ? Voir stackoverflow.com/q/4382034/188926

2 votes

Hey Dunc - oui, je soupçonne que j'ai ajouté cette méthode d'extension à ma base de code et que je l'ai oubliée en pensant qu'il s'agissait d'une méthode du framework LOL :(

36voto

Yasser Points 9307

J'ai pu le faire en utilisant un peu de LINQ,

public static List<string> GetErrorListFromModelState
                                              (ModelStateDictionary modelState)
{
      var query = from state in modelState.Values
                  from error in state.Errors
                  select error.ErrorMessage;

      var errorList = query.ToList();
      return errorList;
}

La méthode ci-dessus renvoie une liste d'erreurs de validation.

Autres lectures :

Comment lire toutes les erreurs du ModelState en ASP.NET MVC

19voto

Simon_Weaver Points 31141

Pendant le débogage, je trouve utile de mettre un tableau au bas de chacune de mes pages pour montrer toutes les erreurs de ModelState.

<table class="model-state">
    @foreach (var item in ViewContext.ViewData.ModelState) 
    {
        if (item.Value.Errors.Any())
        { 
        <tr>
            <td><b>@item.Key</b></td>
            <td>@((item.Value == null || item.Value.Value == null) ? "<null>" : item.Value.Value.RawValue)</td>
            <td>@(string.Join("; ", item.Value.Errors.Select(x => x.ErrorMessage)))</td>
        </tr>
        }
    }
</table>

<style>
    table.model-state
    {
        border-color: #600;
        border-width: 0 0 1px 1px;
        border-style: solid;
        border-collapse: collapse;
        font-size: .8em;
        font-family: arial;
    }

    table.model-state td
    {
        border-color: #600;
        border-width: 1px 1px 0 0;
        border-style: solid;
        margin: 0;
        padding: .25em .75em;
        background-color: #FFC;
    }
 </style>

1 votes

S'il y a un cas limite où cela échoue, veuillez modifier la réponse pour le corriger.

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