NerdDinner の例 Professional ASP.NET MVC 1. には、コピーされたベローとして新しいディナーを作成する方法があります(無料の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);
}
ModelState.IsValid
は、モデル変数がModelState
に追加されているかどうかを示します。
デフォルトのモデルバインダーは、基本的な型変換の問題に対していくつかのエラーを追加します(たとえば、「int」である何かに非数値を渡す)。使用している検証システムに基づいて、ModelStateをより完全に設定できます。
サンプルのDataAnnotations
モデルバインダーは、モデルのDataAnnotations
属性から取得した検証エラーでモデルの状態を満たします。
エラータから:ModelState.AddRuleViolations(dinner.GetRuleViolations());
する必要があります:
ModelState.AddModelErrors(dinner.GetRuleViolations());
はい、JaredとKelly Orrは正しいです。編集例外のように次のコードを使用します。
foreach (var issue in dinner.GetRuleViolations())
{
ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
の代わりに
ModelState.AddRuleViolations(dinner.GetRuleViolations());