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 ?
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 ?
Utilisation de LINQ :
IEnumerable<ModelError> allErrors = ModelState.Values.SelectMany(v => v.Errors);
Modifié pour retourner IEnumerable<string> avec juste le message d'erreur: : var allErrors = ModelState.Values.SelectMany(v => v.Errors.Select(b => b.ErrorMessage)) ;
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 ?
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 ? .
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
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
L'autre option est de faire ce qui suit : ModelState.Values.SelectMany(x => x.Errors).Select(x => x.ErrorMessage).JoinString(" ; ") ;
@Tod, est-ce que IEnumerable.JoinString() est votre propre méthode d'extension ? Voir stackoverflow.com/q/4382034/188926
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 :(
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
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>
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.
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()