SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Scott Guthrie氏 Blog翻訳

EFコードファーストとASP.NET MVC 3でクラスレベルのモデル検証

連載:ScottGu's Blog翻訳


ASP.NET MVC 3とIValidatableObject

 ASP.NET MVC 2には、ASP.NET MVCのモデルのバインディング・インフラストラクチャも使用して、自動的にモデルオブジェクト上のDataAnnotation属性に従い、強制実行するサポートが含まれていました。

 ASP.NET MVC 3では、さらに進み、IValidatableObjectインターフェイスにも従います。モデル検証に対するこの組み合わせのサポートにより、検証エラーが発生した時に、適切なエラーメッセージを表示することが簡単になります。

 この動きを確認するために、ユーザーがProductを新規作成できる簡単なCreateフォームを考えてみましょう。

caption

 以下のように、2つの「Create」アクションメソッドを持つProductsControllerクラスを使用して、上記のCreate機能を実装できます。

caption

 1つ目のCreateメソッドは、HTTP-GETリクエストを処理して、入力用のHTMLフォームを表示する/Products/Create URLのバージョンを実装します。2つ目のCreateメソッドは、HTTP-POSTリクエストを処理して、送信されたフォームのデータを取得し、それらが有効かどうかを確認し、もし有効であればデータベースへ保存する/Products/Create URLのバージョンを実装します。もし検証エラーがあった場合、その入力された値を再表示します。

 「Create」ビューのRazorビューテンプレート(フォームを描画する)は以下のようになります。

caption

 上記のコントローラ+ビューの実装でいいところの1つが、その中に検証ロジックを1つも書いていないことです。検証ロジックとビジネスルールは、その代わり、モデル層内全体で実装されます。ProductsControllerは、その変更を保存するのか、エラーのあるフォームを再表示するのかを決定するために(ModelState.IsValidヘルパーメソッドを呼び出して)データの有効性をチェックするだけです。

 ビュー内のHtml.ValidationMessageForヘルパーメソッドの呼び出しでは、ProductモデルのDataAnnotationsとIValidatableObject.Validateメソッドが返したエラーメッセージを表示するだけです。

 フォームに無効な値を入力して、送信してみれば、上記のシナリオの動作確認ができます。

caption

 [Create]ボタンを押したときに、どのようにエラーメッセージが取得されるのか確認してください。

 これは、[Discontinued]のチェックボックスをチェックして、UnitsOnOrderの値を入力(これはビジネスルールに1つ違反しています)しているためです。

 ASP.NET MVCが、どのようにそのエラーメッセージを強調して、UnitsOnOrderテキストボックスの横に表示したのか疑問に思われるかもしれません。これは、ASP.NET MVC 3が、モデルのバインディングを実施する時にIValidatableObjectインターフェイスに従い、検証に失敗したエラーメッセージを取得するようになったからです。

 Productモデルクラスにあるビジネスルールには、違反された時に「UnitsOnOrder」プロパティを強調することが示されています。

caption

 設定しているプロパティ名がヒントになるため、Html.ValidationMessageForヘルパーメソッドは、ビジネスルールのエラーメッセージを(UnitsOnOrderの編集ボックスの横に)表示することが分かるのです。

caption

DRYに保つ

 ASP.NET MVCおよびEFコードファーストにより、1か所で検証とビジネスルールを保持し(モデル層内で)、コントローラとビューを調べ回る必要がありません。

 モデル層に検証ロジックを保持すると、アプリケーションにさらにコントローラやビューを追加した時に、検証/ビジネスロジックが重複しなくなります。これにより、1か所(モデル層)で検証/ビジネスロジックを素早く変更し、アプリケーションにあるすべてのコントローラ/ビューにそれを即座に反映できます。また、アプリケーションのコードをクリーンで保守しやすくし、今後のアプリケーションの展開や更新がより簡単になります。

まとめ

 EFコードファースト(CTP5以降)では、DataAnnotationsおよびIValidatableObjectインターフェイスが両方ともサポートされています。このため、モデルへ検証およびビジネスルールを追加して、データベースに変更が永続化される時、EFが必ずそれらを自動的に実行することが、簡単にできるようになります。

 ASP.NET MVC 3も、DataAnnotationsおよびIValidatableObjectの両方をサポートするようになっています。そのため、EFコードファーストのモデル層でそれらを使用し、Web層内のコントローラ/ビューに自動的にそれらに従いサポートさせることが、さらに簡単になりました。これにより、クリーンで保守性の高いアプリケーションを構築することが簡単になります。

 検証/ビジネスロジックを実施するために、DataAnnotationsまたはIValidatableObjectを使用する必要はありません。お好みで、独自の検証アーキテクチャを適用したり、より上級な検証フレームワーク/パターンを使用できます。しかしながら、多くのアプリケーションでは、このビルトインサポートが、恐らく十分で、ソリューションをビルドする生産性の高い方法になると思います。

 Hope this helps,

 Scott

 P.S. ブログに加え、現在Twitterを使って簡単な更新やリンク共有を行っています。twitter.com/scottguで、私をフォローしてください。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Scott Guthrie氏 Blog翻訳連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト Chica(チカ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Scott Guthrie(Scott Guthrie)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5658 2011/01/24 17:12

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー