ASP.NETMVC2モデルによる検証(4)カスタム検証を使用しないサーバー側検証

ASP.NETMVC2モデルによる検証(2)カスタム検証で書いた検証は、
モデルのプロパティを検証するものでした。

では、対象のプロパティ以外に、別のプロパティを参照する必要がある場合はどうでしょうか?
例えばパスワードをチェックする場合、入力されたIDをキーとしてパスワードをデータベースから取得し、
入力されたパスワードとの整合性を比較するはずです。。。

このようにパスワードというプロパティのチェックでありながら、別のIDというプロパティも参照する場合、
従来のASP.NET MVCではコントローラー内にエラーチェックを実装する形になると思います。

ただしASP.NET MVC 2 では、検証属性・カスタム検証ともモデル内で検証ロジックを実装する形となるので
できれば上記の場合もモデルでエラーチェックを実装したいです。

で、モデル内にエラーチェックを実装してみました。以下がその実装例です。

◆カスタム検証を使用しない検証の例
まずはモデルに検証用のメソッドを記述します。
f:id:UnderSourceCode:20130504105543j:plain
ここではIsValidメソッドとして実装し、IsValidプロパティとはしていません。
これはプロパティとして実装すると、コントローラーで明示的に呼び出す前に
自動的に処理が実行されてしまうからです。(理由は不明・・・。分かる人教えてください(笑))

ロジックとしてはエラーを判定し、エラーであるデータフィールド名とエラーメッセージを設定しています。
(27・28行目、33・34行目)
ここで指定したフィールド名、エラーメッセージは下のコントローラーで使用します。

そしてコントローラーのAction内で、明示的に呼び出します。
f:id:UnderSourceCode:20130504105555j:plain
ここではModelState.IsValidプロパティで検証属性のエラーを、model.IsValidメソッドで今回実装したエラーを
それぞれ判定しています。
そしてエラーの場合は、ModelState.AddModelErrorにてフィールド名、エラーメッセージを指定し
Viewに渡しています。(34・35行目)
ここで参照しているフィールド名、エラーメッセージは、上のロジック内で設定したものです。

このようにモデル内で検証を行うメリットは、MVC パターンの構造を維持できることだと考えています。
エラーチェックというデータに関するロジックはモデル内で行い、コントローラーではデータドメインについては扱わない形です。