我有以下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; }
}
Required属性对于Number和Code都工作正常,但是即使未包含在POST请求中,Property和Blocked也不会抛出Exception。 一种解决方法是如上所述进行手动验证,但我想知道这背后是什么吗? 问题仅在我的一个控制器中显示。
答案 0 :(得分:1)
设置默认值后会评估属性,因此带有[Required]装饰的int不会执行任何操作,因为int的默认值为0。因此,即使该属性在有效负载上不存在,也不会触发验证。如果属性是字符串或int?类型,则在有效负载上传递null或不包括该属性将触发验证错误。
选项1:将int声明为可为null的int类型?属性 选项2:使用[BindRequired]批注