ASP.NET MVC Comment convertir ModelState erreurs en json
Comment obtenez-vous une liste de tous les ModelState des messages d'erreur? J'ai trouvé ce code pour obtenir toutes les clés:
( Retour d'une liste de clés avec ModelState erreurs)
var errorKeys = (from item in ModelState
where item.Value.Errors.Any()
select item.Key).ToList();
Mais comment pourrais-je obtenir les messages d'erreur comme un IList IQueryable?
Je pouvais aller:
foreach (var key in errorKeys)
{
string msg = ModelState[error].Errors[0].ErrorMessage;
errorList.Add(msg);
}
Mais c'est de le faire manuellement - il y a sûrement un moyen de le faire à l'aide de LINQ? L' .Propriété ErrorMessage est si loin sur la chaîne que je ne sais pas comment écrire le LINQ...
Vous devez vous connecter pour publier un commentaire.
Vous pouvez mettre rien vous voulez à l'intérieur de la
select
clause:MODIFIER: Vous pouvez extraire plusieurs erreurs en séparer les éléments de la liste par l'ajout d'un
from
clause, comme ceci:Ou:
2ème ÉDITION:
Vous êtes à la recherche d'un
Dictionary<string, string[]>
:.Where(kvp => kvp.Value.Errors.Count > 0)
.Where(kvp => kvp.Value.Errors.Any())
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 le ExceptionMessagesIci, c'est la pleine mise en œuvre avec tous les morceaux réunis:
D'abord créer une méthode d'extension:
Puis appelez la méthode d'extension et de retourner les erreurs de l'action du contrôleur (le cas échéant) de json:
Et puis, finalement, le spectacle de ces erreurs sur le côté client (en jquery.la validation de style, mais peut facilement être changé à n'importe quel autre style)
.Where(m => m.Value.Count() > 0)
pourrait aussi être écrit comme.Where(m => m.Value.Any())
.J'aime utiliser
Hashtable
ici, alors que je reçois objet JSON avec les propriétés que les clés et les erreurs de la valeur sous forme de chaîne de tableau.De cette façon, vous obtenez la réponse suivante:
Il ya beaucoup de façons différentes de faire ce que tous les travaux. Voici maintenant, je le fais...
BadRequest(ModelState)
et il serialiaze il en JSON pour vous.@JK il m'a beaucoup aidé, mais pourquoi pas:
Prendre un coup d'oeil au Système.Web.Http.Résultats.OkNegotiatedContentResult.
Il convertit tout ce que vous jeter dans il en JSON.
J'ai donc fait cela
Ce qui a entraîné l':
Je suis encore à vérifier ce qui se passe quand il n'y a plus d'une erreur pour chaque champ, mais le point est le OkNegoriatedContentResult est génial!
Eu le linq/lambda idée de @SLaks
La façon la plus simple pour ce faire est de simplement retourner un
BadRequest
avec le ModelState lui-même:Par exemple sur un
PUT
:Si nous utilisons les données des annotations sur, par exemple, un numéro de portable, comme ça, dans le
Update
classe:Ce sera le retour de la façon suivante sur une requête invalide:
Moyen Simple d'y parvenir en utilisant une fonctionnalité intégrée
Résultat JSON sera
ToDictionary est une Énumération d'extension dans le Système.Linq emballés dans le Système.Web.Extensions dll http://msdn.microsoft.com/en-us/library/system.linq.enumerable.todictionary.aspx. Voici ce que l'complet de la classe ressemble pour moi.
Pourquoi ne pas retourner l'original
ModelState
objet pour le client, et ensuite utiliser jQuery pour lire les valeurs. Pour moi, il semble beaucoup plus simple, et utilise la commune de la structure de données (.netModelState
)pour retourner le
ModelState
Json, il suffit de le passer à la classe Json constructeur (fonctionne avec n'IMPORTE quel objet)C#:
js:
Variation avec le type de retour au lieu de retourner IEnumerable
J'ai fait et de l'extension qui retourne la chaîne avec séparateur "" (vous pouvez utiliser votre propre):
si vous utilisez jsonresult puis retour
ou vous pouvez simplement retourner le modelStateErrors, je n'ai pas essayé. Ce que j'ai fait est d'assigner la collection d'Erreurs à mon ViewModel et puis la boucle..Dans ce cas je peux retourner à mes Erreurs via json. J'ai une classe de modèle, j'ai voulu obtenir la source/clé mais je suis encore à essayer de comprendre.