Как получить IEnumerable заполненный ErrorMessages из ModelState в ASP.NET Core с LINQ - PullRequest
0 голосов
/ 27 января 2019

У меня есть следующее расширение C #:

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;
        }
    }

Это расширение вызывается из контроллера для генерации JSON, и генерируется следующий JSON:

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

Как этот метод расширения можетбыть изменены, чтобы вернуть только список сообщений об ошибках?Как это:

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

Ответы [ 3 ]

0 голосов
/ 27 января 2019

Прежде всего, пожалуйста, не называйте свой класс расширения "FooHelper", так как Helper бессмысленен.Поскольку это ваш ModelStateExtenstions, давайте назовем это так.Также вы хотите получить IEnumerable<string>, поэтому возвращайте его таким образом.

Вот следующий код:

 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>();
    }
}

Поскольку в одном свойстве может быть несколько сообщений об ошибках, я решил объединить их с пустым пространством,Надеюсь, это поможет вам.

0 голосов
/ 27 января 2019

А с помощью SelectMany:

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

Расширение:

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>();
    }
}
0 голосов
/ 27 января 2019

Возможно, такой код работает:

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

        return null;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...