要約すると、データベース フィールドに基づいて、実行時にインスタンス固有のデータ注釈属性を作成しようとしています。私が今持っているものは、初期モデルの作成には問題なく機能しますが、モデルがポストバックされてサーバー検証が行われると失敗します。
(ビューモデル内のコレクションで同じ入力モデルを使用していますが、コレクション内の各インスタンスに異なる検証を適用する必要があります....たとえば、入力の最初の出現は1〜100の範囲に制限される場合がありますしかし、同じ入力ページで求められる同じモデルの次の発生は、1000-2000 の範囲になります。別の値は、日付、または 6 文字の長さでなければならない文字列である可能性があります.......)
私がやったことと私の問題がどこにあるかを説明します:
DataAnnotationsModelMetadataProvider
の独自の実装を継承して提供しましたGetMetadataForProperty
(これは検証の問題とは関係ありません....まだ)
DataAnnotationsModelValidatorProvider
のファサード実装を継承して提供しましたGetValidators
。ここでやりたいことは、データベース レコードに基づいて新しい属性を作成し、それらの属性を基本実装に渡し、それに応じてバリデーターが作成されるようにすることです。
ただし...... GetValidators
は PROPERTY レベルで呼び出されます....バリデーターを適用したいプロパティ名で呼び出される場合、このプロパティ名に適用可能な DB レコードを見つけて、どの属性を見つけられるかを調べる必要があります。作成する必要があります....しかし...値フィールドのプロパティ名だけではDBレコードのキーを取得できません.....実際、DBキーは親モデルにあります.....では、どうやって手に入れるのでしょうか!?
静的変数 (YUK) を使用して、あるプロパティの呼び出し中にキーを保存し、値フィールド プロパティの別の呼び出し中にキーを取得しようとしました....しかし、モデルは一方向にシリアル化され、逆方向に逆シリアル化されるためです。キーが必要な属性と同期していないことになります。
少し複雑にするために、カスタム モデル バインダーも使用しています。ここの他の場所でアドバイスされているように CreateModel をオーバーライドしましたが、メタデータまたは追加の値を出力モデルの PROPERTY にアタッチする方法が見つかりません....モデル自体にのみ....しかし、どうすれば取得できますかPROPERTY の GetValidators 呼び出し内の MODEL メタデータ/追加値 ?
だから....私の質問は2つあります.....
1) カスタム モデル バインダーから ValidationProvider の GetValidators メソッドにデータベース キーを取得するのを手伝ってくれる人はいますか? それとも、カスタム メタデータ プロバイダーを使用しているのでしょうか?
2) データベース レコードに基づいて実行時にバリデータを作成する別のより簡単な方法はありますか?