問題タブ [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.

0 投票する
1 に答える
3217 参照

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 などの一部のメタデータ属性は考慮されません。

0 投票する
1 に答える
1397 参照

c# - ModelMetadata TemplateHint は常に null

ModelMetadataProviderJQuery UI Autocomplete ウィジェットに目立たない属性を提供するカスタムを作成しようとしています。

次のようなカスタム属性があります。

そして、次のようなエディター テンプレート:

string次のAutocompleteAttributeようなタイプのプロパティを持つviewModelがあります。

ビューでこのviewModelを使用すると、生成されたhtmlをチェックすると、次<input>のような属性を持つタグが取得されますdata-autocomplete-url="UrlPlaceholder"

次にやりたいことは、viewModel を使用するビューで次のように URL を指定できるようにすることです。

私のAutoCompleteForUrlヘルパーは、プロパティ名をキーとして使用して、生成された URL をディクショナリに保存するだけです。

次に、カスタムを作成し、ModelMetadataProviderこのコード行を使用して global.asax に登録しましたModelMetadataProviders.Current = new CustomModelMetadataProvider();

私がやりたいことは、JQuery UI オートコンプリート ウィジェットで使用される URL をmetadata.AdditionalValuesディクショナリに挿入して、オートコンプリート エディター テンプレートで使用できるようにすることです。

私のカスタムModelMetadataProviderは次のようになります。

更新されたエディター テンプレートは次のようになります。

問題は、TemplateHintカスタム モデル メタデータ プロバイダーでプロパティが「オートコンプリート」と等しくならないため、URL を生成するロジックが呼び出されないことです。の基本実装を呼び出したので、この時点でTemplateHintプロパティが設定されると思っていたでしょう。CreateMetadataDataAnnotationsModelMetadataProvider

確認できることは次のとおりです。

  • CustomModelMetadataProviderは、呼び出される他のコードが含まれているため、正しく登録されています。
  • 生成される Html に という属性が含まれているため、正しいエディター テンプレートが取得されます"data-autocomplete-url"
  • オートコンプリート テンプレートにブレークポイントを配置すると、Visual Studio はデバッガーに移動します。

だから、誰かが私のためにこれに光を当てることができますか? ModelMetadataProviderシステムについて誤解していることは何ですか?

0 投票する
1 に答える
1717 参照

asp.net-mvc - Betty のアプローチで AutoMapper を使用して DataAnnotation メタデータを ViewModel に転送する方法

AutoMapper を使用してデータ注釈メタデータを ViewModel に転送する Betty のコード ソリューションを実装する方法を明確にする必要があります (こちらを参照)。または、より良い方法があれば、それを共有してください。Betty の回答の実装は、AutoMapper をよく知っている人には明らかかもしれませんが、私はそれが初めてです。

以下は簡単な例です。Betty のソリューションを機能させるには、このコードに何を追加すればよいでしょうか。

現在の AutoMapper の実装:

Application_Start の global.asax でこれを試しました。

また、Betty の GetMappedAttributes を次のように変更する必要がありました。

propertyMap.DestinationProperty.GetCustomAttributesに: propertyMap.DestinationProperty.MemberInfo.GetCustomAttributes

(または、MemberInfo の代わりに、MemberType ですか?) これを構築することもできます。

しかし、何も機能していないようです。

0 投票する
1 に答える
899 参照

asp.net-mvc - ASP.NET MVC 5 / メタデータ サービス - DataAnnotations - これはまだ好ましい方法ですか?

バージョン 3 かそこら以降、ASP.NET MVC の進化をたどっていません。当時の MVC3 では、MVC DisplayNameFor などの魔法のエンティティ メタデータ情報をブーストする最も簡単で好ましい方法は、DataAnnotations を使用することでした。[MetadataType]クラスがコード生成された場合、属性を使用する可能性があります。

これが MVC 5 でも推奨されるアプローチなのか (V4 と V5 のニュースを読んでも具体的なことはわかりませんでした)、それともよりカスタマイズ可能な (組み込みの) メタデータ エンジンがいくつかあるのか疑問に思っています。

私の本当の問題は、別のアセンブリでエンティティ クラスに注釈を付ける方法です。私のプロジェクトは、EDMX ファイルとエンティティ クラスが別のアセンブリに存在する方法で構築されています (プロジェクトの Web、PowerShell などのモジュールによって再利用されます)。

0 投票する
1 に答える
6919 参照

asp.net-mvc - 新しいプロパティを MVC ModelMetadata に追加

私は、AdditionalValues などの代替アプローチを見ていますが、テンプレート ビューで使用可能な ModelMetadata オブジェクトに新しいプロパティを追加できるシナリオになる可能性があるかどうか疑問に思っています。

たとえば、次のようにすることができます。

これを Editor および Display テンプレートで使用して、レンダリングされる HTML 要素に MVVM 属性を追加したいと考えています。

私は完全に迷っていますが、これまでの私の努力は次のとおりです。

次に、グローバル asax で次を使用します。

問題は、認識されないビューで MyProperty を使用しようとした場合です。これは、VS がカスタム ModelMetadata クラスを認識していないためです。

これが可能かどうかさえわかりませんか?

0 投票する
0 に答える
733 参照

caching - カスタム モデル メタデータ プロバイダーのキャッシュの問題

ラベルとエラー メッセージを動的に制御できるようにするために、カスタム を作成しましたDataAnnotationsModelMetadataProvider。属性では、プロパティDisplayにキーを保存し、カスタムを使用して、カスタム CMS からの文字列値をキーに置き換えます。問題は、2 つの値のセットがあることです。1 つは Web ビュー用で、もう 1 つはモバイル ビュー用です。実行時に、クライアントがモバイル デバイス上にあるかどうかを確認し、それに応じて値を置き換えます。NameDataAnnotationsModelMetadataProvider

このセットアップをテスト実行した後、奇妙な問題に遭遇しました。がAppDomain最初に作成されName、さまざまなデータ注釈のプロパティが文字列値に置き換えられると、すべて正常に機能します。デバッグでカスタムDataAnnotationsModelMetadataProviderを 2 回目に入力すると、名前のプロパティには、前回の実行で置き換えた値が既に入力されていることがわかります。データ注釈のプロパティは実行時に変更できないことを理解していたので、これは私にとって奇妙でした。モデル メタデータ キャッシュがどこかで発生しているようです。が呼び出されるたびに値を置き換えるカスタム ソリューションに基づいているためDataAnnotationsModelMetadataProvider、可能であればこのキャッシュを無効にしたいと考えています。

今のところ、ShortNameプロパティをキー格納プロパティとして使用し始め、プロパティを置き換えましたName。このようにして、実行ごとに文字列を再設定できます。しかし、これは初期の設計ではなく、 のようなキー ストア プロパティはありませんValidationAttributes

このキャッシュを無効にする方法はありますか? いずれにせよ、すべての CMS データは別のレイヤーのメモリにキャッシュされるため、キャッシュのためにキャッシュは必要ありません。

0 投票する
1 に答える
1003 参照

c# - ASP.Net WebAPI で Fluentvalidation API を実装するバリデーターを取得するにはどうすればよいですか?

例:

UserController.Create() メソッドと UserViewModel オブジェクトを提供するだけで、どのようにして UserValidator オブジェクトまたは型を取得できるのでしょうか?

0 投票する
1 に答える
1480 参照

asp.net-mvc-3 - カスタム表示名属性でモデル名を取得する

これが私の開発要件です。

ラベルの値はデータベースに保存されていますが、データ注釈を宣言的な方法で使用したいと考えています。これは、モデルをより読みやすくするためです。

そして、ここに私のアプローチがあります、

カスタムの DisplayNameAttribute を作成することにしました。ここでは、モデルによって提供される既定値が、データベースから取得された値によって上書きされます。

モデルで定義されたプロパティは次のとおりです。

カスタム表示名属性クラスは次のとおりです。

さて、上記のコードでわかるように、ModelName は必要なものですが、持っていません!!

デバッグ中に ModelMetadataProviders.Current を掘り下げ、現在のモデルが実際に使用可能かどうかを確認します。しかし、それは非公開の静的メンバーの一部であるため、コードからアクセスできません。

ここに画像の説明を入力

リフレクションを通じてモデル名を取得するための以下のメソッドを作成しました。

しかし、問題は、types コレクションがすべてのモデル (ユーザーが少なくとも 1 回訪れた) のエントリを提供することです。そして、現在活動中の、知る手がかりはありません!!

ここに画像の説明を入力

0 投票する
0 に答える
145 参照

model-view-controller - Automapper 5 でメタデータをエンティティから ViewModel にコピーする

私の MVC アプリケーションでは、Autofac IoC コンテナーを Automapper と共に使用しています。カスタム ViewModel を実装する機会が得られます。

主な質問: Automapper 5.1.1 を使用してエンティティからビューモデルにメタデータをコピーするにはどうすればよいですか?

Bettysソリューションを実装しようとしましたが、このアプローチを使用して新しいプロバイダーを正しく登録できません。

コードも以下に示します。

また

Mapper.Engine のようなプロパティはありません。

2 番目のアプローチを実装すると、無効な操作の例外が発生しました。

追加情報: マッパーが初期化されていません。適切な構成で Initialize を呼び出します。コンテナーなどを介してマッパー インスタンスを使用しようとしている場合は、静的な Mapper.Map メソッドへの呼び出しがないことを確認し、ProjectTo または UseAsDataSource 拡張メソッドを使用している場合は、適切な IConfigurationProvider を渡すようにしてください。実例。

では、AutoMapper.Mapper.Configuration をどのように初期化すればよいでしょうか?

お時間とご協力いただきありがとうございます。

または、メタデータをビューモデルにマップするための別のより良い方法があるでしょうか?