web-dev-qa-db-ja.com

NerdDinnerのASP.NET MVCで有効なModelState.IsValidとは何ですか?

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); 
} 
134
pupeno

ModelState.IsValidは、モデル変数がModelStateに追加されているかどうかを示します。

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

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

134
Brad Wilson

エラータから: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

25
Kelly Orr

はい、JaredとKelly Orrは正しいです。編集例外のように次のコードを使用します。

foreach (var issue in dinner.GetRuleViolations())
{
    ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}

の代わりに

ModelState.AddRuleViolations(dinner.GetRuleViolations());
0
Phoe Htoo