Comment obtenir une liste de tous les messages d'erreur ModelState? J'ai trouvé ce code pour obtenir toutes les clés: ( Retour d'une liste de clés avec des erreurs ModelState )
var errorKeys = (from item in ModelState
where item.Value.Errors.Any()
select item.Key).ToList();
Mais comment pourrais-je obtenir les messages d'erreur en tant qu'IList ou IQueryable?
Je pourrais aller:
foreach (var key in errorKeys)
{
string msg = ModelState[error].Errors[0].ErrorMessage;
errorList.Add(msg);
}
Mais c'est le faire manuellement - il existe sûrement un moyen de le faire en utilisant LINQ? La propriété .ErrorMessage est si loin dans la chaîne que je ne sais pas comment écrire le LINQ ...
.Where(kvp => kvp.Value.Errors.Count > 0)
Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
vous devez utiliservar errorList = modelState.Where(elem => elem.Value.Errors.Any()) .ToDictionary( kvp => kvp.Key, kvp => kvp.Value.Errors.Select(e => string.IsNullOrEmpty(e.ErrorMessage) ? e.Exception.Message : e.ErrorMessage).ToArray());
Sinon, vous n'aurez pas les ExceptionMessagesVoici la mise en œuvre complète avec toutes les pièces réunies:
Créez d'abord une méthode d'extension:
Appelez ensuite cette méthode d'extension et retournez les erreurs de l'action du contrôleur (le cas échéant) en tant que json:
Et puis enfin, montrez ces erreurs côté client (dans le style jquery.validation, mais peut être facilement changé en tout autre style)
la source
.Where(m => m.Value.Count() > 0)
peut également s'écrire.Where(m => m.Value.Any())
.J'aime utiliser
Hashtable
ici, de sorte que j'obtienne un objet JSON avec des propriétés comme clés et des erreurs comme valeur sous forme de tableau de chaînes.De cette façon, vous obtenez la réponse suivante:
la source
Il existe de nombreuses façons de faire cela qui fonctionnent toutes. Voici maintenant je le fais ...
la source
BadRequest(ModelState)
et il le sérialisera dans JSON pour vous.Le moyen le plus simple de le faire est de simplement renvoyer un
BadRequest
avec le ModelState lui-même:Par exemple sur un
PUT
:Si nous utilisons des annotations de données sur, par exemple, un numéro de mobile, comme celui-ci, dans la
Update
classe:Cela renverra ce qui suit sur une demande invalide:
la source
@JK cela m'a beaucoup aidé mais pourquoi pas:
la source
Jetez un œil à System.Web.Http.Results.OkNegotiatedContentResult.
Il convertit tout ce que vous y jetez en JSON.
Alors j'ai fait ça
Cela a abouti à:
Je n'ai pas encore vérifié ce qui se passe lorsqu'il y a plus d'une erreur pour chaque champ, mais le fait est que OkNegoriatedContentResult est brillant!
J'ai eu l'idée linq / lambda de @SLaks
la source
Un moyen simple d'y parvenir en utilisant la fonctionnalité intégrée
Le résultat JSON sera
la source
ToDictionary est une extension Enumerable trouvée dans System.Linq emballée dans la dll System.Web.Extensions http://msdn.microsoft.com/en-us/library/system.linq.enumerable.todictionary.aspx . Voici à quoi ressemble le cours complet pour moi.
la source
Pourquoi ne pas renvoyer l'
ModelState
objet d' origine au client, puis utiliser jQuery pour lire les valeurs. Pour moi, cela semble beaucoup plus simple et utilise la structure de données commune (.netModelState
)pour retourner le
ModelState
as Json, passez-le simplement au constructeur de classe Json (fonctionne avec N'IMPORTE QUEL objet)C #:
js:
la source
Variation avec type de retour au lieu de renvoyer IEnumerable
la source
J'ai fait une extension qui retourne la chaîne avec le séparateur "" (vous pouvez utiliser le vôtre):
la source
si vous utilisez jsonresult puis retournez
ou vous pouvez simplement renvoyer le modelStateErrors, je ne l'ai pas essayé. Ce que j'ai fait, c'est d'assigner la collection Errors à mon ViewModel, puis de la boucler .. Dans ce cas, je peux renvoyer mes Erreurs via json. J'ai une classe / un modèle, je voulais obtenir la source / la clé mais j'essaie toujours de le comprendre.
la source