【问题标题】:How to display Error Message and its Fields from ModelState如何从 ModelState 显示错误消息及其字段
【发布时间】:2019-07-07 18:13:49
【问题描述】:

我的数据有以下代码

public class PersonDto 
{
    public string name ; 
    public DateTime dateOfBirth;
}

现在我有了控制器来保存数据。

假设我不填写dateOfBirth,会产生错误

[HttpPost("create")]
public async Task<IActionResult> CreateClient([FromBody] PersonDto cpDto)
{
    if (!ModelState.IsValid)
    {
        var errors = ModelState.Values.SelectMany(v => v.Errors);
        var message = string.Join(" | ", ModelState.Values
                .SelectMany(v => v.Errors)
                .Select(e => e.ErrorMessage));

        Console.WriteLine(message);
        return BadRequest(message);
    }

    ......... (other code)
}

假设我没有输入dateOfBirth,应该会产生错误吧。

我的问题是当我保存时会生成错误消息,但似乎 ErrorMessage 总是空字符串 ==> (" | ")

如果我进入调试模式,我可以看到哪些字段产生了错误,但我不知道如何显示哪些字段产生了错误(只是收到 Invalid fields 错误消息)。

我试过了

return BadRequest(ModelState);

它也不显示哪个字段导致了错误。

注意:我在 .NET Core 2.2 中使用 C#

【问题讨论】:

    标签: c# error-handling .net-core-2.2


    【解决方案1】:

    要获取所有错误消息及其相应的字段:

    var errors = ModelState
        .Where(kv => kv.Value.Errors.Any())
        .Select(kv => new
        {
            Field = kv.Key,
            ErrorMessages = kv.Value.Errors.Select(e => e.ErrorMessage),
        });
    

    errors 将是一个列表,其中包含所有错误作为具有FieldErrorMessages 的匿名对象,如果您想获得一个包含错误字段的字符串:

    var errorsString = string.Join(" | ", errors
        .Select(e => $"Field: {e.Field}, Error: {string.Join(", ", e.ErrorMessages)}"));
    

    【讨论】:

      【解决方案2】:

      试试这个:

       var messages = ModelState
                          .Where(x => x.Value.Errors.Count > 0)
                          .ToDictionary(
                              kvp => kvp.Key,
                              kvp => kvp.Value.Errors.Select(e => e.ErrorMessage).ToArray()
                          );
      

      将 dto 更改为:

       public class PersonDto
              {
                  [Required(ErrorMessage = "Please enter name")]
                  public string name { get; set; }
                  [Required(ErrorMessage = "Please enter date")]
                  public DateTime dateOfBirth { get; set; }
              }
      

      【讨论】:

        最近更新 更多