Comment puis-je obtenir la collection d’erreurs d’état du modèle dans ASP.NET MVC?

Comment puis-je obtenir la collection d’erreurs dans une vue?

Je ne souhaite pas utiliser le résumé de validation ou le message de validation de l’aide HTML. Au lieu de cela, je veux vérifier les erreurs et, le cas échéant, les afficher dans un format spécifique. Également sur les contrôles d’entrée, je veux vérifier une erreur de propriété spécifique et append une classe à l’entrée.

PS J’utilise le moteur Spark View Engine, mais l’idée devrait être la même.

Alors j’ai pensé que je pouvais faire quelque chose comme …

 0}"> DispalyErrorSummary()  ....and also...  .... 

Ou quelque chose comme ça.

METTRE À JOUR

Ma solution finale ressemblait à ceci:

  0}" id="Name" name="Name" /> 

Cela ajoute uniquement la classe d’erreur css si cette propriété a une erreur.

 <% ViewData.ModelState.IsValid %> 

ou

 <% ViewData.ModelState.Values.Any(x => x.Errors.Count >= 1) %> 

et pour une propriété spécifique …

 <% ViewData.ModelState["Property"].Errors %> // Note this returns a collection 

Pour simplement obtenir les erreurs du ModelState, utilisez ce Linq:

 var modelStateErrors = this.ModelState.Keys.SelectMany(key => this.ModelState[key].Errors); 

Version condensée de la réponse de @ ChrisMcKenzie :

 var modelStateErrors = this.ModelState.Values.SelectMany(m => m.Errors); 

Cela vous donnera une chaîne avec toutes les erreurs avec la séparation des virgules

 ssortingng validationErrors = ssortingng.Join(",", ModelState.Values.Where(E => E.Errors.Count > 0) .SelectMany(E => E.Errors) .Select(E => E.ErrorMessage) .ToArray()); 

Merci Chad! Pour montrer toutes les erreurs associées à la clé, voici ce que j’ai trouvé. Pour une raison quelconque, l’assistant Html.ValidationMessage de base affiche uniquement la première erreur associée à la clé.

  <%= Html.ShowAllErrors(mykey) %> 

HtmlHelper:

  public static Ssortingng ShowAllErrors(this HtmlHelper helper, Ssortingng key) { SsortingngBuilder sb = new SsortingngBuilder(); if (helper.ViewData.ModelState[key] != null) { foreach (var e in helper.ViewData.ModelState[key].Errors) { TagBuilder div = new TagBuilder("div"); div.MergeAtsortingbute("class", "field-validation-error"); div.SetInnerText(e.ErrorMessage); sb.Append(div.ToSsortingng()); } } return sb.ToSsortingng(); } 

Voici le VB.

 Dim validationErrors As Ssortingng = Ssortingng.Join(",", ModelState.Values.Where(Function(E) E.Errors.Count > 0).SelectMany(Function(E) E.Errors).[Select](Function(E) E.ErrorMessage).ToArray()) 

En rassemblant plusieurs réponses d’en haut, voici ce que j’ai fini par utiliser:

 var validationErrors = ModelState.Values.Where(E => E.Errors.Count > 0) .SelectMany(E => E.Errors) .Select(E => E.ErrorMessage) .ToList(); 

validationErrors devient finalement une List qui contient chaque message d’erreur. De là, il est facile de faire ce que vous voulez avec cette liste.

entrer la description de l'image ici

Si vous ne savez pas quelle propriété a causé l’erreur, vous pouvez, en utilisant la reflection, faire une boucle sur toutes les propriétés:

 public static Ssortingng ShowAllErrors(this HtmlHelper helper) { SsortingngBuilder sb = new SsortingngBuilder(); Type myType = typeof(T); PropertyInfo[] propInfo = myType.GetProperties(); foreach (PropertyInfo prop in propInfo) { foreach (var e in helper.ViewData.ModelState[prop.Name].Errors) { TagBuilder div = new TagBuilder("div"); div.MergeAtsortingbute("class", "field-validation-error"); div.SetInnerText(e.ErrorMessage); sb.Append(div.ToSsortingng()); } } return sb.ToSsortingng(); } 

Où T est le type de votre “ViewModel”.