属性是[必需]和可空的是什么意思?

时间:2017-04-28 21:14:28

标签: c# asp.net-mvc data-annotations

属性[Required]和可空的含义是什么意思? (例如下面)似乎如果它是[Required]它不可能是null(没有价值),如果它能够是null它就不能“{1}}可能是[Required]

[Required]
public DateTime? OrderDate { get; set; }

4 个答案:

答案 0 :(得分:20)

使属性可为空并使用[Required]属性标记的原因是为了防止欠发布攻击。它还允许您在视图中显示初始空值,而不是属性的默认值。这通常使用视图模型中的值类型属性来完成。

欠发布攻击是指恶意用户修改请求以省略请求中属性的值。如果属性为DateTime(不可为空),则DefaultModelBinder会将值初始化为默认值(01/01/0001),并且不会生成ModelState错误。因此,即使它不是您所期望的,也可以保存该值。

如果属性为DateTime?(可为空)和[Required],则如果恶意用户确实在请求中省略了该属性,则会生成ModelState错误,因为值为在请求中预期,并且将返回视图,因此将无法保存无效数据。

另请参阅Brad Wilson的文章Input Validation vs. Model Validation in ASP.NET MVC以及标题为 The Under-Posting“问题的部分

答案 1 :(得分:6)

它可以为空,因此表单不会显示像0001-01-01T00:00:00这样没有意义的初始值。

需要强制用户输入内容。

答案 2 :(得分:4)

必需是视图的数据注释。视图将要求它在接受表单帖子之前具有值。

值可以为空可与数据库中允许的内容相关。数据库中的值可以为null,或者值可以保持为null。

它们是不同的方面。

答案 3 :(得分:2)

客户端验证为required,但DB映射为nullable