上のオタクディナーの例プロフェッショナル 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