問題タブ [modelmetadata]

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 投票する
2 に答える
7832 参照

asp.net-mvc - Entity Framework 検証エラー メッセージをオーバーライドする方法

複数の ASP.NET MVC Web アプリケーションをサポートする Entity Framework 4.1 モデルがあります。DataAnnotations を使用して、ラベル テキスト、検証ルール、およびエラー メッセージを定義およびローカライズします。

一部のアプリケーションでは、特定のフィールドのラベル テキストを標準のモデル定義テキストとは異なるものにする必要があります。これは、ラベル自体で簡単に実現できます。必要なテキストを、ビューに関連付けられたローカル リソース ファイルから取得します。ただし、ラベル テキストは、「{fieldname} の最大長は 50 文字である必要があります」などの検証エラー メッセージでも使用されます。

モデルクラスの注釈を変更せずに検証メッセージを変更する最良の方法は何ですか?

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

asp.net-mvc-3 - MVC 3、ナビゲーション中の ModelMetadata の奇妙な動作

私のモデルのプロパティの 1 つが属性で装飾されていHideます。ページをロードすると、このプロパティは表示されません (予想どおり)。「戻る」ボタンをクリックしてから「進む」ボタンをクリックすると、基本的に離れてから戻ると、このプロパティが表示されます。リフレッシュすると、プロパティが非表示になります。なんで?

モデルは、カスタム編集テンプレートを介してレンダリングされます。

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

asp.net-mvc - HtmlHelperでのモデルプロパティメタデータの変更

指定された小数点以下の桁数にフォーマットされた数値を表示するカスタムHtmlHelperを作成しようとしています。私の考えは、これを実現するためにModelMetadata.DataFormatStringプロパティを変更することです。モデルプロパティのメタデータプロパティをこのように変更することは可能ですか?どうすればいいのですか?私の試み(下記)は、必要に応じて数値をフォーマットしません。

もちろん、同じHtmlHelperでフォーマットされた値を別の方法で取得することもできますが、実行時にモデルのメタデータを動的に微調整できるかどうかを特に知りたいと思います。

0 投票する
2 に答える
2325 参照

c# - 同じフィールドでIMetadataAware属性を複数回使用できますか?

さまざまな人がさまざまな名前で表示する必要のあるフィールドがあります。

たとえば、次のユーザータイプがあるとします。

IMetadataAware属性を実装しました:

必要に応じて他の値をオーバーライドできますが、オーバーライドしない場合はデフォルト値にフォールバックするという考え方です。例えば:

問題は、同じタイプの属性が複数ある場合、最初の属性に対してDataAnnotationsModelMetadataProviderのみ実行OnMetadataCreatedされることです。
上記の例では、Address「アドレス」または「ADR」としてのみ表示できます。他の属性は実行されません。

異なる属性を使用しようとすると、、、、、DisplayForUserTypeすべてDisplayForUserType2DisplayForUserType3期待どおりに機能します。

私はここで何か間違ったことをしていますか?

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

lambda - Lambda 式を、式を構成するオブジェクトに分割するにはどうすればよいですか?

次のような式が与えられた場合:

m => m.Employee.Address.Line1

関係するオブジェクトを引き出したり、少なくともチェーンの最後のオブジェクト (つまり、上記の Address オブジェクト) を取り出したりして、式をたどることができる関数を作成する必要があります。したがって、上記の例では、関数は次のことを見つけます。

  • 「ここ」は m パラメーターのインスタンスです (そこから型を取得できます)
  • 「ここ」は従業員メンバーのインスタンスです
  • (つまり、チェーンを下に繰り返します)

その目的は、「パス」の構成情報を生成できるようにすることです。

少なくとも最終的な「包含」オブジェクトを取得できれば、型情報を生成できるだけでなく、オブジェクトが特定の属性またはメソッドをサポートしている場合はそのオブジェクトを呼び出して、オブジェクト (および取得するオブジェクト Type) から追加の構成情報を要求することもできます。コンテナのタイプの構成情報)。

次のような少し複雑なステートメントでも、これはさらに難しくなります。

m.Employee.Address[i].Line1

--- MVC の BASIC シナリオで私が行っていることのサンプルを提供するだけです。以下の GetContainingModel() は、読み込まれた DataAnnotationsMetadataProvider の CreateMetadata() 内で呼び出されます。CreateMetadata() に渡されるモデルは、Lambda ステートメントの ROOT にあるモデルであり、実際に必要なものではありません。そのため、ロジックは最終的な包含オブジェクトを見つけようとします。私が行っているようにリフレクションを使用したくない、またはさらに悪いことに、プライベートメンバーを取得するために手を差し伸べる(悪い)が、...私は提案を求めています。

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

asp.net-mvc - EditorTemplateで完全修飾メンバー名を取得するにはどうすればよいですか?

ASP.NET MVC 4サイトがあり、ネストされたプロパティをEditorTemplateに渡し、を使用してフィールド名を作成してViewData.ModelMetadata.PropertyNameいますが、これは、私がいるプロパティの完全なドット表記名ではなく、子プロパティのプロパティ名を取得します編集。

例が最もよく説明されます:

次のタイプが与えられます

私の編集ビューと作成ビューは次のとおりです。

_ImageUploader.cshtmlエディターテンプレートは次のとおりです

レンダリングされたHTMLは次のようになります

5行目と6行目で、私が呼び出したところに注意してください。ViewData.ModelMetadata.PropertyName子プロパティ名しか取得していませんが、"ImageUrl"必要です"Entity.ImageUrl"。この完全修飾名を取得するにはどうすればよいですか?

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 投票する
0 に答える
113 参照

asp.net-mvc-3 - Modelmetadata は外部モデルに入力されますが、内部モデルには入力されません。

モデルメタデータがどのように取り込まれるか、およびフレームワークで OnMetadataCreated メソッドがいつ呼び出されるかについての資料が必要です。ネストされたビューモデルを含むビューモデルを作成したとき、内側のビューモデルのプロパティに対して OnMetadataCreated が呼び出されませんでしたが、外側のモデルのプロパティに対して作成されました。

私の現在のソリューションは、ビューでリフレクションを使用して内部ビュー モデルのプロパティと属性にアクセスすることで、これを回避しています。(通常、これらの属性にアクセスし、OnMetadataCreated でそれらを操作します。)

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

.net - 詳細なプロパティ ナビゲーションを備えた .NET カスタムの厳密に型指定された HTML ヘルパー

私はあちこち検索し、強く型付けされたヘルパーの作成に関連するすべての投稿を読みましたが、私の問題に対処したものはありません。問題:

単純なプロパティを参照する場合、すべてがうまく機能します。

モデル内の別のクラスのプロパティにアクセスしようとすると、次のエラーが発生します。

エラーは次のとおりです。

プロパティ InspectionEditViewModel.Person.BadgeNumber が見つかりませんでした。

問題の行は次のとおりです。

これは、GetMetadataForProperty が InspectionEditViewModel で BadgeNumber を見つけられないことに関係していると思います。デフォルトでは、MVC の HTML ヘルパーはこれを問題なく実行できます。

編集:

私は何かを忘れていたことを知っていた、長い一日だった. ヘルパーのコードは次のとおりです。