【问题标题】:How to get IEnumerable filled with ErrorMessages from ModelState in ASP.NET Core with LINQ如何使用 LINQ 在 ASP.NET Core 中从 ModelState 中获取充满错误消息的 IEnumerable
【发布时间】:2019-01-27 08:27:07
【问题描述】:

我有以下 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."
    ]
}

【问题讨论】:

  • 我正在使用 ModelState.IsValid 并返回一个 BadRequest(new { error = ModelState.Errors() } );在 ASP.Net Core 控制器中
  • return new { error = modelState.Value.Errors.Select(e => e.ErrorMessage).ToArray() }; 如果这不起作用,请尝试使用SelectMany 而不是Select。

标签: c# linq asp.net-core modelstate


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • Using List 强制你使用特定的 IEnumerable 实现
    【解决方案3】:

    也许这样的代码可以工作:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      • 2013-07-11
      相关资源
      最近更新 更多