プロパティが[Required]
でnull可能であるとはどういう意味ですか? (下の例)[Required]
の場合はnull
(値なし)にできない可能性があり、null
の場合は可能性がない可能性があります[Required]
になります。
[Required]
public DateTime? OrderDate { get; set; }
プロパティをnull可能にして[Required]
属性でマークする理由は、アンダーポスト攻撃から保護するためです。また、プロパティのデフォルト値ではなく、ビューに初期の空の値を表示することもできます。これは通常、ビューモデルの値型プロパティで行われます。
アンダーポスティング攻撃とは、悪意のあるユーザーがリクエストを変更して、リクエスト内のプロパティの値を省略することです。プロパティがDateTime
(null不可)の場合、DefaultModelBinder
は値をデフォルト(01/01/0001
)に初期化し、ModelState
エラーは生成されません。結果として、その値は期待したものではない場合でも保存される可能性があります。
プロパティがDateTime?
(nullable)および[Required]
の場合、悪意のあるユーザーがリクエストでプロパティを省略した場合、値が期待されるため、ModelState
エラーが生成されますリクエストとビューが返されるため、無効なデータは保存されません。
Brad Wilsonの記事 ASP.NET MVCでの入力の検証とモデルの検証 およびというタイトルのセクションも参照してください。「投稿中」の問題。
Null可能であるため、フォームは0001-01-01T00:00:00
のような意味のない初期値を表示しません。
ユーザーに何かを入力させる必要があります。
ビューのデータアノテーションは必須です。ビューでは、フォームの投稿を受け入れる前に値が必要です。
値がNULL可能であることは、データベースで許可されているものに関連しています。データベースで値がnullであるか、値がnullとして永続化されている可能性があります。
それらは別の側面です。
クライアント検証ではrequired
ですが、DBマッピングではnullable
です