ASP.NET MVC 2:2つのオブジェクトをテンプレートに渡す方法は?
-
01-10-2019 - |
質問
この例の「ルックアップ」は次のとおりです IList<string>
州の略語の。一般に、ドメインモデルPocosはこれらのオプションを含めません。ビューモデルは通常、元のドメインモデルとルックアップオブジェクトの両方を参照するこの責任を負いますが、ドメインモデルがネストされ、MVCテンプレートを使用している場合はどうなりますか(元のモデルのルートプロパティにはアクセスできませんか?
テンプレートの別のオブジェクトに1つのオブジェクトとモデルにルックアップを含める方法はありますか?ビュー内のテンプレートに固有のビューモデルをオンザフライで組み立てることは許可されていますか(そこからネストされたデータを含める必要があります)。ルックアップ値を引き下げる静的な方法は悪いと思います。
何か案は?
メモ(私の知る限り):
リポジトリからのドメインモデルPocoは、構造が変更されません。たとえば、顧客オブジェクトと米国の状態のDDLオプションの両方を持つために単一のモデルが必要な場合、通常、顧客オブジェクトと顧客ルックアップリストを参照するViewModelがあります。
ただし、ネストされたドメインモデル(集約ルート)がある場合、ネストされたオブジェクトにはルックアップリストを置く場所がなく、MVCテンプレートはルートレベルビューモデルにアクセスできません(ビューモデルは部分モデルです)。
編集:
DDLリストをViewModelのルートレベルに配置する方法はありますか?次に、顧客オブジェクトに到達したら、ルートレベルのDDLリストと現在の顧客オブジェクトをテンプレートに送信する新しいViewModelを作成しますか?これにより、モデル内の複製データが排除され、すべてのビューに単一のモデルを使用します。唯一の悪いのは、あなたのビューでデータアセンブリコードのようなコントローラーです(これは同じくらい悪いです)。
解決
いくつかの提案。まず、ビューに個別のビューモデルを使用します。ドメインモデルを直接使用しないでください。これらのビューモデルは、ビューで必要な追加のデータを運ぶことができます。次に、オーバーロードを使用できます displayfor/編集者 追加のビューデータをテンプレートに渡します。そうすれば、テンプレートは特定のドメインモデルに固有のものでありながら、ビューモデルの追加データにアクセスできます。
他のヒント
状態の略語のような静的な不変のリストの場合、アプリケーション状態またはキャッシュエントリを使用できます。これらのタイプのリストは、データベースからApplication_startにロードできます。