属性[Required]
和可空的含义是什么意思? (例如下面)似乎如果它是[Required]
它不可能是null
(没有价值),如果它能够是null
它就不能“{1}}可能是[Required]
。
[Required]
public DateTime? OrderDate { get; set; }
答案 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