Как отобразить сообщение об ошибке и его поля из ModelState - PullRequest
1 голос
/ 07 июля 2019

У меня есть следующие коды для моих данных

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

также не отображается, какое поле вызвало ошибку.

Примечание: я использую C # в .NET Core 2.2

Ответы [ 2 ]

1 голос
/ 07 июля 2019

Чтобы получить все сообщения об ошибках с соответствующими полями:

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

errors будет списком, который содержит все ошибки как анонимные объекты с Field и ErrorMessages, если вы хотите получить одну строку, содержащую поля с их ошибками:

var errorsString = string.Join(" | ", errors
    .Select(e => $"Field: {e.Field}, Error: {string.Join(", ", e.ErrorMessages)}"));
0 голосов
/ 07 июля 2019

попробуйте это:

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