如何使用LINQ从ASP.NET Core中的ModelState获取IEnumerable填充ErrorMessages

问题描述 投票:0回答:3

我有以下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."
    ]
}
c# linq asp.net-core modelstate
3个回答
3
投票

首先,请不要将您的扩展类命名为“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>();
    }
}

由于一个属性可以有多个错误消息,我决定用空白空间加入它们。希望这会帮助你。


3
投票

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

2
投票

也许像这样的代码有效:

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

        return null;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.