为什么模型验证中的Required属性仅适用于某些属性,而不适用于某些其他属性?

时间:2019-04-11 11:59:09

标签: asp.net-web-api2 model-validation

我有以下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。 一种解决方法是如上所述进行手动验证,但我想知道这背后是什么吗? 问题仅在我的一个控制器中显示。

1 个答案:

答案 0 :(得分:1)

设置默认值后会评估属性,因此带有[Required]装饰的int不会执行任何操作,因为int的默认值为0。因此,即使该属性在有效负载上不存在,也不会触发验证。如果属性是字符串或int?类型,则在有效负载上传递null或不包括该属性将触发验证错误。

选项1:将int声明为可为null的int类型?属性 选项2:使用[BindRequired]批注