J'ai l'extension C # suivante:

public static class ModelStateHelper
    {
        public static IEnumerable Errors(this ModelStateDictionary modelState)
        {
            if (!modelState.IsValid)
            {
                return modelState.ToDictionary(kvp => kvp.Key,
                kvp => kvp.Value.Errors
                .Select(e => e.ErrorMessage).ToArray())
                .Where(m => m.Value.Any());

            }

            return null;
        }
    }

Cette extension est appelée à partir du contrôleur pour générer un JSON et le JSON suivant est généré:

{
    "error": [
        {
            "key": "Password",
            "value": [
                "The Password field is required."
            ]
        },
        {
            "key": "Username",
            "value": [
                "The Username field is required."
            ]
        }
    ]
}

Comment cette méthode d'extension peut-elle être modifiée pour ne renvoyer qu'une liste de messages d'erreur? Comme ça:

{
    "error": [
        "The Password field is required.",
        "The Username field is required."
    ]
}
1
Gustavo Piucco 27 janv. 2019 à 11:27

3 réponses

Meilleure réponse

Tout d'abord, ne nommez pas votre classe d'extension "FooHelper" car Helper n'a aucun sens. Puisque c'est votre ModelStateExtenstions appelons-le ainsi. Vous voulez également obtenir IEnumerable<string>, alors renvoyez-le de cette façon.

Voici le code suivant:

 public static class ModelStateExtenstions
{
    public static IEnumerable<string> GetErrorMessages(this ModelStateDictionary modelState)
    {
        if (!modelState.IsValid)
        {
            return modelState.ToDictionary(kvp => kvp.Key, kvp => kvp.Value)
                          .Select(e => String.Join(" ", e.Value.Errors.Select(x => x.ErrorMessage)));
        }

        return Enumerable.Empty<string>();
    }
}

Puisqu'une propriété peut avoir plusieurs messages d'erreur, j'ai décidé de les rejoindre avec un espace vide. J'espère que ceci vous aidera.

3
LukaszBalazy 27 janv. 2019 à 09:00

Et en utilisant SelectMany:

var allErrors = ModelState.Values.SelectMany(v => v.Errors).Select(x=>x.ErrorMessage).ToList();

Extension:

public static class ModelStateHelper
{
    public static List<string> Errors(this ModelStateDictionary modelState)
    {
        if (!modelState.IsValid)
        {
          return ModelState.Values.SelectMany(v => v.Errors).Select(x=>x.ErrorMessage).ToList();
        }
        return new List<string>();
    }
}
3
M D 27 janv. 2019 à 09:50

Peut-être qu'un code comme celui-ci fonctionne:

public static class ModelStateHelper
{
    public static IEnumerable Errors(this ModelStateDictionary modelState)
    {
        if (!modelState.IsValid)
        {
            return modelState.Errors();
        }

        return null;
    }
}
2
Milad D Zand 27 janv. 2019 à 08:53