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

Pis*_*ity 20 c# asp.net-mvc data-annotations

对于一个属性[Required]和可空的属性意味着什么?(下面的例子)似乎如果它[Required]不可能null(没有价值),如果它能够是null它不可能是[Required].

[Required]
public DateTime? OrderDate { get; set; }
Run Code Online (Sandbox Code Playgroud)

小智 27

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

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

如果属性是DateTime?(可空)[Required],然后如果恶意用户确实省略了请求中的属性,那么ModelState将生成错误,因为请求中有一个值,并且视图将被返回,因此无效数据将不会得救

另请参阅Brad Wilson 在ASP.NET MVC中的文章输入验证与模型验证以及标题为"欠发布"问题的部分.


Max*_*oro 7

它可以为空,因此表单不会显示初始值0001-01-01T00:00:00,因为它没有任何意义.

需要强制用户输入内容.


Sag*_*b.g 6

required用于客户端验证,但nullable用于数据库映射


Tra*_*s J 6

必需是视图的数据注释。在接受表单发布之前,视图将要求它具有一个值。

该值可以为空与数据库中允许的内容有关。一个值在数据库中可能为空,或者该值可能被持久化为空。

它们是不同的方面。