如何显示来自ModelState的错误消息及其字段

时间:2019-07-07 06:14:43

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

我的数据有以下代码

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总是空字符串==> (" | ")

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

我尝试过

return BadRequest(ModelState);

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

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

2 个答案:

答案 0 :(得分: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)}"));

答案 1 :(得分:0)

尝试一下:

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