0

要約すると、データベース フィールドに基づいて、実行時にインスタンス固有のデータ注釈属性を作成しようとしています。私が今持っているものは、初期モデルの作成には問題なく機能しますが、モデルがポストバックされてサーバー検証が行われると失敗します。

(ビューモデル内のコレクションで同じ入力モデルを使用していますが、コレクション内の各インスタンスに異なる検証を適用する必要があります....たとえば、入力の最初の出現は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) データベース レコードに基づいて実行時にバリデータを作成する別のより簡単な方法はありますか?

4

3 に答える 3

0

これは古い質問であることは承知していますが、他の多くの人がこれから恩恵を受けることができるように、これに答えています.

xml から属性を読み込んでいる以下の記事を参照してください。

XML からの C# MVC .NET データ注釈属性の読み込み、フォーム検証

同じアプローチに従うことができると思います.xmlから読み取る代わりに、データベースから読み取って、モデルのデータ型に基づいてこれらのルールを動的に追加できます

以下のアプローチも参照できます

属性を動的にアタッチする DataAnnotations

于 2018-01-23T08:50:28.570 に答える
0

FluentValidationフォーラムでもこれを尋ねましたが、ここでの回答の欠如とそこからのFluentの使用に対するアドバイスは、私自身の解決策を見つけることにつながりました(これはほぼ確実に、私が本当に悪い/珍しい/何かをしていることを意味することを理解しています不要!)

私が最終的に行ったことは、カスタム MetaDataProvider を介して実行しようとするのではなく、クライアント モデル全体に​​アクセスできるカスタム モデル バインダーの CreateModel メソッドにコントローラーの静的変数を割り当てることです。これは問題なく機能しているようで、アプリの v1 に向けて進みます。

私はこのソリューションにあまり満足していませんが、今後数か月でこの領域全体をリファクタリングする予定ですので、動的検証を一般的な方法で実装する方法について他のコメントやアイデアをいただければ幸いです。

于 2014-04-29T08:09:19.300 に答える