私はあなたの苦境を見ることができます。特定のモデルオブジェクトの複数のプロパティ、またはオブジェクトグラフ内の異なるモデルオブジェクトの多くのプロパティに適用される可能性のある複雑な検証ルールに関しても、他の検証ソリューションを探しています (リンクされたオブジェクトを検証するのに十分な運がない場合)このような)。
インターフェイスの制限は、IDataErrorInfo
どのプロパティにもエラーがない場合にのみ、モデル オブジェクトが有効な状態を満たすことです。つまり、有効なオブジェクトとは、そのすべてのプロパティも有効なオブジェクトです。ただし、プロパティA、B、およびCが有効な場合、オブジェクト全体が有効であるという状況が発生する可能性があります..プロパティAが有効ではなく、BとCが有効な場合、オブジェクトは有効性を満たします。IDataErrorInfo
この条件/ルールをインターフェイス/DataAnnotations
属性で説明する方法がありません。
だから私はこのデリゲートアプローチを見つけました。MVC の有用な進歩の多くは、この記事を書いている時点では存在していませんでしたが、中心となる概念は役立つはずです。属性を使用してオブジェクトの検証条件を定義するのではなく、より複雑な要件を検証するデリゲート関数を作成します。それらは委任されているため、再利用できます。確かに手間はかかりますが、デリゲートを使用すると、検証ルール コードを 1 回記述し、すべての検証ルールを 1 つの場所 (おそらくサービス レイヤー) に保存し、(クールビット) MVC 2DefaultModelBinder
を使用して呼び出すことさえできるはずです。検証は自動的に行われます (コントローラ アクションを大量にチェックする必要はありません。Scott のブログでDataAnnotations
.「厳密に型指定された UI ヘルパー」見出しの前の最後の段落)!
Func<T>
上記の記事で提案されているアプローチを、 orのような匿名デリゲートを使用して少し強化できると確信しています。Predicate<T>
また、検証ルールのカスタム コード ブロックを作成すると、クロス プロパティ条件が有効になります (たとえば、ShippingSameAsBilling
プロパティがtrue の場合、配送先住所などのその他のルールを無視できます)。
DataAnnotations
は、オブジェクトの単純な検証ルールを非常に簡単にするのに役立ちます。コードはほとんどありません。しかし、要件が発展するにつれて、より複雑なルールを検証する必要があります。MVC2 モデル バインダーの新しい仮想メソッドは、今後の検証の発明を MVC フレームワークに統合する方法を提供し続けるはずです。