В. Net Core API ModelState.IsValid не захватывает обязательные параметры - PullRequest
0 голосов
/ 08 мая 2020

. Net Core 3.1 API. Я прочитал множество тем, в которых спрашивается, почему ModelState.IsValid не работает должным образом. Большинство из них предназначены для веб-страниц, а не для API. А те, которые я нашел об API, либо не совсем применимы, либо не привели меня к пониманию.

У меня есть модель, которая выглядит так:

public class MyModel
{
    [Required(ErrorMessage = "Prop1 is required.")]
    public int Prop1 { get; set; }

    public List<int> IntList { get; set; }
}

И я есть конечная точка API:

[ApiController]
[Route("api/[controller]")]
public class FooBarController : ControllerBase
{
    [HttpPost]
    public async Task<IActionResult> Post([FromBody] MyModel request)
    {
        if (!ModelState.IsValid)
            return BadRequest(ModelState);

        // do stuff

        return Ok(results);

    }
}

Теперь, в Postman, если я передаю это как тело, он работает, как ожидалось:

{ "Prop1": 1001}

Но если я передаю это, я ожидал будет выдана ошибка Prop1 is required.:

{ "Prop2": 1001}

Однако ошибки нет. Модель все еще действительна, и я просто получаю пустой набор.

1 Ответ

2 голосов
/ 08 мая 2020

Целые числа имеют значение по умолчанию 0, поэтому после инициализации значение prop1 будет равно 0, поэтому он проходит проверку [Required]. Если вы сделаете prop1 обнуляемым, тогда required должен перехватить, если он отсутствует.

Или, если вы не хотите, чтобы ваше свойство было обнуляемым, вы можете добавить валидатор диапазона:

[Required(ErrorMessage = "Prop1 is required.")]
[Range(1, int.MaxValue, ErrorMessage = "Prop1 must be greater than 0.")]
public int Prop1 { get; set; }

В прошлом году в одном из проектов я создал атрибут, похожий на [NotNullOrDefault], который работал бы с целыми числами, равными 0, или с нулевыми строками, или с чем-либо еще, не имеющим значения по умолчанию.

...