問題タブ [modelmetadataprovider]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
asp.net-mvc-2 - DataAnnotationsModelMetadataProviderのソースコード
何らかの理由で、このクラスを反映しようとすると、.NETReflectorが例外をスローします。それは他のすべてのために働きます。
のソースコードは何DataAnnotationsModelMetadataProvider
ですか?
asp.net-mvc - IoC を使用して MVC3 でカスタム ModelMetadataProvider を提供する
現在、これを使用して Global.asax ファイルのデフォルトの ModelMetadataProvider をオーバーライドしています
これは完全に機能します。しかし、MVC3 の IDependancyResolver 機能を使用して、代わりに IoC が ModelMetadataProvider 実装を提供できるようにしたいと考えています。私はそれを行うために StructureMap を使用しています (NuGet を使用してプロジェクトにインストールしただけです) が、何らかの理由で期待どおりに動作しません。
のコンストラクターにブレークポイントを設定しましたRedSandMetadataProvider()
が、ヒットしています。またGetServices()
、自動的に追加された SmDependencyResolver.cs ファイルの関数にブレークポイントを設定して、コンストラクターを呼び出していたのが IoC であることを確認しました。すべて問題ないように見えます。コンストラクターは 2 回目のページ読み込みで呼び出されると思いますが、呼び出されません。私GetMetadataForProperty()
のMetadataProviderの私の機能。Global.asax で設定すると、これが正しく呼び出されることがわかりましたが、IoC を使用して同じ結果を達成しようとするたびに、自分のクラスで呼び出されたコンストラクターが表示されます。それだけです。タイプのStrctureMap登録に.Singleton()を追加しようとしましたが、コンストラクターがはるかに早く呼び出されますが、オブジェクトが構築された後に実際に使用されることはありません。
何か不足していますか?
custom-attributes - CreateMetadata を使用して ModelMetadata をカスタマイズする
ユーザーが選択リストから値を初めて選択すると、テキストPick one
と値を含むデフォルト オプションが表示されます-1
。
これを支援するために、カスタム属性がありますNotEqualAttribute
。ドロップダウン リストが必要な場合は、正しく機能させるために両方の属性を使用する必要があります。
VM は次のようになります。
これを使用することをお勧めします:
別の StackOverflow の質問では、プロパティが明示的に設定されていない限り、null 非許容プロパティをオプションRequired
にする方法について説明しています。
これを実行しようとしましたが、新しい属性をIEnumerable<Attribute>
コレクションに追加する方法やModelMetadata
、メタデータ プロバイダーに追加する方法がわかりません。
asp.net-mvc-3 - AutoMapperを使用してビューモデルにメタデータを運ぶための手法
AutoMapperを使用して、ドメインオブジェクトをビューモデルにマップします。ドメインレイヤーにメタデータがあり、ビューレイヤーとModelMetadataに引き継ぐ必要があります。(このメタデータはUIロジックではありませんが、ビューに必要な情報を提供します)。
今のところ、私の解決策は、(ASP.NET MVCとは独立して)別のMetadataProviderを使用し、規則を使用して、AssociatedMetadataProviderを介して関連するメタデータをModelMetadataオブジェクトに適用することです。このアプローチの問題は、AutoMappingを使用する場合と同じように、ドメインからModelMetadataをバインドするときに同じ規則をテストする必要があることです。これを、より直交させる方法があるはずです。誰かがこれを達成するためのより良い方法をお勧めできますか?
asp.net-mvc - JsonResult のカスタム モデル メタデータ プロバイダー
から継承してカスタム メタデータ プロバイダを作成しましたDataAnnotationsModelMetadataProvider
。GetMetadataforProperty
カスタム プロバイダには、とのオーバーライド実装が含まれていますCreateMetadata
。
コントローラー クラス メソッドから戻るActionResult
と、カスタム メタデータ プロバイダーのコードが実行されます。ただし、 を返すJsonResult
と、カスタム メタデータ プロバイダーのコードはヒットしません。
何か不足していますか?どんな助けでも大歓迎です。
asp.net-mvc - ASP.NET MVC 3 のモデル メタデータ プロバイダーは動的メタデータをサポートしていますか?
ASP.NET MVC 3 でいくつかのカスタム モデル メタデータを実装しようとしています。一部のメタデータは構成された値に基づいて変更される可能性があるため、データ注釈属性を使用できません。そのため、メタデータを設定できるソリューションが必要です。すべてのリクエスト。カスタム モデル メタデータ プロバイダーについて読んでいますが、動的メタデータ シナリオのサポートについては何も見つかりません。
MVC フレームワークは、モデル メタデータ プロバイダーからのメタデータをキャッシュしますか?それとも、すべての要求で CreateMetadata メソッドが呼び出されますか? カスタム モデル メタデータ プロバイダーは、動的メタデータの優れたソリューションですか?それともビュー モデルに配置するだけでよいですか?
編集:これは必ずしも私が話している検証メタデータではないため、検証固有のソリューションを探しているわけではありません。ビューによって表示または使用される単なるメタデータである可能性があります (たとえば、HTML 5 データ属性)。
もう 1 つの例は、データベース主導のフィールド ラベルです。通常、Display 属性の Name プロパティを使用しますが、データベース内の値に基づいて表示名を動的に設定する場合、これは機能しません。
c# - 動的にビルドされた MVC3 ViewModel に MetaData を追加する方法は?
私が取り組んでいるプロジェクトの重要な機能の 1 つは、ユーザーが既存のフィールド タイプ (よく知られているタイプなど) のプールに基づいてフォームを構成できることです ("フォーム" のように)。 「ユーザー名」、「生年月日」などだけでなく、「文字列」、「DateTime」などの「ジェネリック型」もあります)。
以前は、「よく知られている」型に対して正常に機能する静的な ViewModel があり、次のように見えました。
すべての既知のプロパティがリストされ、コンテキストに応じてそれらを表示または非表示にしていました。
しかし、最後の要件が来て、すべてが変わりました。ユーザーは、必要な数のジェネリック型フィールドを追加できるようになりました。これを行うために、この InputModel を完全に動的にすることにしました。次のようになります。
これは魅力のように機能します。Razor ビューは、コレクションを反復処理し、コレクションの各プロパティに対応するコントロールを標準以上の方法で作成するだけで済みます。
...そして、入力されたフォームとしてデータをうまく取得します。
=> これは問題なく動作しますが、クライアント側の検証はありません。このためには、いくつかのメタデータが必要になります...モデルを動的に作成しているため、注釈を介してはもうありません。
これらの MetaData を提供するために、CustomModelMetadataProvider
継承するを作成し、Global.asaxDataAnnotationsModelMetadataProvider
に新規登録しました。ModelMetadataProvider
このCreateMetadata()
関数は、ViewModel の作成時に呼び出され、ViewModel の各プロパティに対して呼び出されます。
問題の始まり: 現在のプロパティにいくつかのメタデータを追加するには、まず、現在見ているプロパティを特定する必要があります (「名前」の最大長は 200 ですが、「生年月日」はそうでないため、割り当てることができません)。デフォルトではすべてのプロパティに maxlength があります)。Value
そして、すべてのプロパティが同じ名前と同じコンテナタイプを持っているため、どういうわけかまだそれを行うことができませんでしたModelProperty
。
リフレクションを介してプロパティのコンテナーにアクセスしようとしましたが、ModelAccessor のターゲットは ViewModel 自体であるため (ラムダ式のためm => m.Properties
)、次の構成により、ModelProperty だけでなく ViewModel 全体が得られます。
これを何度もめくっていますが、手元にある ModelProperty を特定する方法が見つかりません。これを行う方法はありますか?
更新:しばらくあらゆる方向にこれをひっくり返した後、最終的に別の方向に進みました。基本的に、控えめな JavaScript を使用して、属性やメタデータに触れることなく MVC の検証機能を使用しています。value-data="true"
つまり、HTML 属性(および他のすべての必須属性) を@Html.TextBoxFor()
ステートメントに追加します。これは、すべてのアトミック検証 (必須、文字列長など) でうまく機能します。
asp.net-mvc - 単体テストでのカスタム ModelMetadataProvider の使用
MVC はかなり新しいので、これが簡単な質問であることを願っています。
へのアクセスを必要とするカスタム バインディング属性を作成しましたhttpContext
。httpContext
単体テスト中にモックを挿入するために、カスタム属性のいずれかにプロパティを設定する を作成しましたInjectingMetadataProvider
。Context
次のテストでこれを機能させることができました。
InjectingMetadataProvider
ただし、 my toを設定する行をコメントアウトするとModelMetadataProviders.Current
、InjectingMetadataProvider.CreateMetadata()
オーバーライドに属性の空のリストが渡され、カスタム属性にコンテキストが設定されないため、テストが失敗します。
Current
とにかく明示的に使用しているときに、なぜそれを設定する必要があるのですか? テストで静的なものを設定したくありません。
フレームワークに不慣れなため、現時点では少し暗闇の中で感じているので、私は何か愚かなことをしているかもしれません.
asp.net-mvc - ViewModelのカスタムMetadataProviderを構成します
メタデータプロパティを動的に設定できるようにしたいViewModelがあります。たとえば、他のモデルプロパティの値を使用して、DisplayNameと検証のエラーメッセージをカスタマイズできるようにしたいと思います。Brad Wilsonの記事に従って、カスタムMetadataProviderを使用してこれを行う予定です。
プロバイダーを選択したViewModelでのみ使用したい。だから私の質問は、どうやってそれを設定するのですか?を使用した例を見てきModelMetadataProviders.Current = new MyModelMetadataProvider()
ましたが、これはおそらくすべてのモデルクラスエンティティにカスタムプロバイダーを使用します。単一のViewModelのプロバイダーを構成することは可能ですか?
asp.net - ASP.NET MVC - ビューの宣言されたモデルではなく、モデル オブジェクト タイプから使用されるモデルのメタデータ
私はそれを実装するクラスで宣言されたモデルのインターフェースを持っています:
異なるメタデータを使用したモデルの実装もあります。
このモデル インターフェイスを使用するビューがあります。
そして、モデルの適切なバインドと初期化を行うコントローラーがあります。
問題:
コントローラーのアクションで NOT NULL モデルのビューを返す場合 ( return View(new MyModelImplementation(){...}); )、画面に表示される結果は次のとおりです。
ただし、コントローラーのアクションが null モデルの結果を返す場合 ( return View(null); )、結果は次のようになります。
ご覧のとおり、Lambda html ヘルパーと文字列式ヘルパーの動作は異なります。これらはまったく一貫しておらず、一部の動作はバグのように見えます。
- (予想) Lambda ヘルパーの場合、DisplayName は IMyModel から取得されます
- (予期しない)文字列式の場合、すべてのメタデータは MyModelImplementation クラスから取得されます (別の言い方をすると、Html.DisplayNameFor(m=>m.MyIntProperty) を使用する場合 - インターフェイス (ビューで宣言されたモデル タイプ) からのメタデータが表示されます)。ただし、Html を使用する場合.DisplayName("MyIntProperty") model.GetType()) のメタデータを使用します。
- (予想外)すべての検証規則と文字列は、宣言されたモデル タイプ (IMyModel) ではなく、常に MyModelImplementation (model.GetType()) メタデータから取得されます。
- (予想)文字列式ヘルパーの場合 モデルのプロパティは、ビューに渡されたモデルが NULL の場合にのみインターフェイスから取得されます
- (予期しない)ビューに渡されたモデルが NULL の場合、文字列式ヘルパーのサブモデルのプロパティ メタデータがまったく取得/尊重されない
質問:
この ASP.NET MVC のバグ/機能に対する最善の回避策は何ですか? デフォルトでHtml拡張機能がビューで宣言されたモデルタイプのメタデータを常に使用するように強制する方法は? MetadataTypeAttribute を使用しようとしましたが、この場合、モデルを実装する人は、許可したくないインターフェイスで指定された元のメタデータを上書きする自由を取得します。だから私はカスタム ModelMetadataProvider 実装を探しています。また、MetadataType の場合、RequiredAttribute などの一部のメタデータ属性は考慮されません。