1. ホーム
  2. asp.net-mvc

[解決済み] NerdDinnerでASP.NET MVCでModelState.IsValidは何のために有効なのか?

2022-05-04 10:37:24

質問

について NerdDinner プロフェッショナル 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); 
} 

解決方法は?

ModelState.IsValid にモデルエラーが追加されているかどうかを知らせます。 ModelState .

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

サンプル DataAnnotations モデルバインダーは、モデルの状態を DataAnnotations 属性を使用します。