Почему обязательный атрибут при проверке модели работает для некоторых, но не для некоторых других? - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть следующий метод Controller Post:

[Route("")]
[ResponseType(typeof(CardPost))]
[HttpPost]
public IHttpActionResult PostCard([FromBody] CardPost CardMetaData)
{
    if (!ModelState.IsValid)
    {
    BadRequest(ModelState);
    }//Property is not caught by ModelState
    if (CardMetaData.Property == 0)
    {
        return BadRequest();
    }
 //Else insert to DBContext
}

Я пытаюсь связать и проверить данные, используя следующий класс Model:

class CardPost
{
    [Required(ErrorMessage = "property is required")]
    [JsonProperty("property")]
    public int Property { get; set; }

    [Required(ErrorMessage = "Card Nr. is required")]
    [StringLength(6,ErrorMessage ="Card Nr. is 6 characters")]
    [JsonProperty("number")]
    public string Number{ get; set; }

    [Required(ErrorMessage ="Card Code is required")]
    [JsonProperty("code")]
    public string Code{ get; set; }

    [Required(ErrorMessage = "blocked is required")]
    [JsonProperty("blocked")]
    public bool Blocked { get; set; }       
}

Обязательный атрибут отлично работает для числа и кода, но свойства и блокированные неверы выдают исключение, даже если они не включены в запрос POST. Обходной путь должен сделать ручную проверку, как указано выше, но мне интересно, что за этим стоит? Проблема отображается только в одном из моих контроллеров.

1 Ответ

1 голос
/ 11 апреля 2019

Свойства оцениваются после установки значения по умолчанию, поэтому int с украшением [Required] ничего не делает, потому что значение int по умолчанию равно 0. Таким образом, даже если свойство не существует в полезной нагрузке, проверка не будет запущена.Если свойство имеет тип string или int?, То передача значения null или отсутствие свойства в полезной нагрузке вызовет ошибку проверки.

Вариант 1: объявить int как обнуляемый тип int?Вариант свойства 2: используйте аннотацию [BindRequired]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...