属性 是 [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" 问题 的部分。
属性 为 [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" 问题 的部分。