NerdDinner の ASP.NET MVC で ModelState.IsValid が有効になるのは何ですか? 質問する

NerdDinner の ASP.NET MVC で ModelState.IsValid が有効になるのは何ですか? 質問する

上のオタクディナーの例プロフェッショナル ASP.NET MVC 1.0以下にコピーしたように、新しいディナーを作成する方法があります (無料の NerdDinner バージョンの 89 ページ)。

そこで、ModelState.IsValid が true かどうかをチェックします。モデルがデータベースに対して有効かどうかをチェックしているようです (つまり、無効な形式の日付などのデータ型の変換はキャッチしますが、ビジネス ルールはキャッチしません)。これは本当ですか?

フォームを送信するときに日付にエラーがあると、ModelState.IsValid は false になり、エラーが返されますが、AddRuleViolations は実行されなかったため、日付に対してのみエラーが返されます。ModelState.IsValid のチェックを完全に削除すると、日付が無効な場合にマークが付くなど、すべてのエラー (例外による) が発生します。それでは、なぜ ModelState.IsValid のチェックがそこに存在するのでしょうか。何か見落としているのでしょうか。

// 
// POST: /Dinners/Create 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(Dinner dinner) {
    if (ModelState.IsValid) {
        try {
            dinner.HostedBy = "SomeUser"; 

            dinnerRepository.Add(dinner);
            dinnerRepository.Save();

            return RedirectToAction("Details", new {id = dinner.DinnerID }); 
        } catch {
            ModelState.AddRuleViolations(dinner.GetRuleViolations());
        } 
    } 
    return View(dinner); 
} 

ベストアンサー1

ModelState.IsValidモデル エラーが追加されたかどうかを通知しますModelState

デフォルトのモデル バインダーは、基本的な型変換の問題 (たとえば、"int" であるものに数値以外の値を渡すなど) に対していくつかのエラーを追加します。使用している検証システムに基づいて、ModelState をより完全に設定できます。

サンプルモデル バインダーは、モデルの属性DataAnnotationsから取得した検証エラーをモデル状態に入力します。DataAnnotations

おすすめ記事