2009-05-19 28 views
126

NerdDinnerの例では、Professional ASP.NET MVC 1.0という名前の新しいディナーを作成しました(無料のNerdDinnerバージョンの89ページ)。NerdDinnerのASP.NET MVCで有効なModelState.IsValidとは何ですか?

そこで、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); 
} 

答えて

124

ModelState.IsValid任意のモデル誤差がModelStateに追加されている場合を示しています。

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

サンプルDataAnnotationsモデルバインダーは、モデルのDataAnnotations属性から取得した検証エラーでモデル状態を埋めます。正誤表から

+0

ブラッド場合DataAnnotations「で飾られているモデルを見つけるためにどのような方法がありますのIsValid "ModelStateなし。 (例えば、オブジェクトがファイルからロードされたりコンソールアプリケーションなどで使用されているとします。 –

+1

いいえ、ModelState.IsValidはモデルバインド中に検証(またはデータ変換)エラーがあったかどうかを知る唯一の方法です。 –

+0

@ブラッド、「あなたが使っている検証システムに基づいてModelStateをより完全に埋めることができる」と言えば、それはどのように達成されますか? ViewModelのModelState検証コードをクラック・オープンする方法はありますか?私はEF4を使用しているので、私の妥当性確認のほとんどは、自動的にすぐに使用できます。 – WEFX

24

ModelState.AddRuleViolations(dinner.GetRuleViolations());

は次のようになります。

ModelState.AddModelErrors(dinner.GetRuleViolations());

参考:http://www.wrox.com/WileyCDA/WroxTitle/Professional-ASP-NET-MVC-1-0.productCd-0470384611,descCd-ERRATA.html

+4

2015年時点で、 'AddModelErrors'メソッドは存在しません。 –

+4

2016年時点で、 'ModelState.AddModelErrors()'メソッドが存在する – John

+4

2017年時点で、非複数の 'ModelState.AddModelError'メソッドが存在します。 – Zachafer

関連する問題