1

私はEntity FrameworkとモデルクラスDonationFormをビューモデルクラス "CreateDonationForm"でラップしています。MVC3モデルクラスの条件付きバリデーション

DRYの原則に沿って、モデルクラス(ビューモデルだけではありません)に検証アノテーションを追加しました。これにより、再利用可能になります。ただし、クラスのすべてのプロパティが常に使用されるわけではありません(実際には互いに排他的です)。たとえば特定の電話番号プロパティが関連する場合、Regexアノテーションに準拠させて、必要なものにしたいと考えています。しかし、別の状況では、私はnull値をサブミットして(そしてデータベースにパースすることで)逃げたいと思っています。この記事に続き

:フィールドが与えられた関係ありませんでしたフィールドのグループの一部であったときHow do I use IValidatableObject?

私は(モデルクラスはIValidatableObjectを実装して作られたとselectiely ValidationResultオブジェクトから検証エラーを取り除くためにカスタム検証を実装フォーム上のユーザーの他の選択肢)。それは働いて、私はそれらのエラーが消去されていたValidationResultsのListを返すことができました。

しかし、私がSaveChanges()を呼び出すと、保存を妨げる検証エラーが発生します。検証はまだデータベース/モデルクラスレベルで行われています。 (データベースはEF 4.1コードファーストを使用してModelクラスから生成されました)

条件付き書式設定ルールを適用し、Modelクラスで注釈を使用する方法は可能ですか?これは本質的に言っています - これらの検証ルールを適用します。そうでなければこれらの検証ルールを適用しません。ここで私をコーチしてください。私はMVCの新しさです。私は、適切なやり方でやろうとしています。ビューモデルにバリデーションを入れて、基礎となるモデルクラスに値をマップするのがうまくいくようです。しかし、それは正しく感じません。 Modelクラス自体の検証属性を持つことに大きな価値があり、同じアノテーションを作成ビューモデルと更新ビューモデルの両方に配置する際の無駄な繰り返し作業がたくさんあります。私はここでMVC Fwと戦っているように感じます。あなたが提供できる洞察力があれば、大いに感謝します。

答えて

4

クールな原則がありますが、小さな違反があなたの人生を楽にします。 EFモデルからデータアノテーションを取り除き、それらが属しているビューモデルに配置します。ビューモデルではまだIValidatableObjectを使用し、複数のビューモデルで使用される複数の再利用可能なヘルパーメソッドから検証を作成できます(DRYの原則を達成できます)。

あなたが本当に頑固とは、あなたがすでにそうであるようにEFでの検証をオフにして、上層にそれを処理EFモデルで検証を持つようにしたい場合:

dbContext.Configuration.ValidateOnSaveEnabled = false; 
EFレベルの検証は、お使いの検証ルールの単純なシナリオのためである

操作間で変更しないでください。

関連する問題