属性 是 [Required] 并且可以为 null 是什么意思?

What does it mean for a property to be [Required] and nullable?

属性 为 [Required] 且可为 null 是什么意思? (下面的例子)似乎如果它是 [Required] 它不可能是 null (没有价值),如果它能够是 null 它不可能是 [Required].

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

客户端验证是 required,数据库映射是 nullable

视图的数据注释是必需的。视图将要求它在接受表单 post.

之前具有一个值

该值是否可为空与数据库中允许的值有关。数据库中的值可能为 null,或者该值可能被持久化为 null。

它们是不同的方面。

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

需要强制用户输入内容。

使 属性 可以为 null 并标有 [Required] 属性的原因是为了防止 under-posting 攻击。它还允许您在视图中显示初始空值而不是 属性 的默认值。这通常是通过视图模型中的值类型属性完成的。

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

如果 属性 是 DateTime?(可空)和 [Required],那么如果恶意用户确实在请求中省略了 属性,那么 ModelState 会产生错误,因为请求中需要一个值,并且会返回视图,因此不会保存无效数据。

另请参阅 Brad Wilson 的文章 Input Validation vs. Model Validation in ASP.NET MVC 和标题为 "Under-Posting" 问题 的部分。