149

Professional ASP.NET MVC 1.0NerdDinnerの例では、次のように新しいディナーを作成する方法があります (無料の 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); 
} 
4

4 に答える 4

152

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

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

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

于 2009-05-19T07:07:39.383 に答える
26

正誤表 より: 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

于 2009-07-14T02:20:19.447 に答える