У меня проблема с атрибутом [BindRequired], он не делает состояние моей модели недействительным:
public class PostModel
{
[BindRequired]
public DateTime Date { get; set; }
}
Контроллер:
[ApiController]
public class BindTestController : ControllerBase
{
[HttpPost("test")]
public IActionResult SetValue([FromBody] PostModel request)
{
if (!ModelState.IsValid)
return BadRequest();
return Ok();
}
}
если я опубликую тело следующим образом:
{}
Мое состояние модели действительно.
Каков хороший способ проверить, что Date присутствует на моем теле, и аннулировать модель?
Спасибо





Вы можете использовать RequiredAttribute вместо BindRequiredAttribute. В ASP.NET Core последнее применимо только для параметров «не тела».
Добавьте RequiredAttribute к вашему свойству DateTime, затем вам нужно сделать DateTime обнуляемым, иначе вы получите значение по умолчанию для DateTime, которое равно {0001-01-01T00:00:00}.
Итак, в основном сделайте следующее:
public class PostModel
{
[Required]
public DateTime? Date { get; set; }
}
Что касается того, почему BindRequired не сработал, я думаю (не уверен на 100%, это просто то, что я думаю), что, поскольку вы используете [ApiController], сначала будет использоваться [FromBody] по умолчанию, затем привязка произойдет после десериализации Json.NET, поэтому, когда deserialization случается, что значение DateTime будет установлено на Default(DateTime). Чтобы решить эту проблему, вы можете использовать старый способ, как показано выше, вместо использования BindRequired или добавить [JsonRequired].
Примечание:, когда вы используете [JsonRequired] с [ApiController], проверка происходит до того, как она достигнет вашей конечной точки. Также обратите внимание, что BindRequired хорошо работает с обычным контроллером MVC.
Я обновляю ответ, чтобы объяснить причину (хотя и не совсем уверен в этом): D.
Что вы подразумеваете под «нормальным контроллером MVC»?
Когда вы не используете ApiController, потому что ApiController добавит [FromBody] к вашему действию, и привязка будет немного другой (как описано в ответе).
очень жаль, что мы не можем использовать [BindRequired] и избежать лишнего кода со значениями, допускающими значение NULL.