私はこのビデオを数回見ましたが、ソース オブジェクトから宛先オブジェクトへのマッピングを処理する、彼が作成したカスタム ActionResult がとても気に入っています。私の問題は、多くの場合、ViewModel のコレクション プロパティがビューに DropDownList または Listbox として表示されますが、ソース オブジェクトでは使用できないことです。したがって、別のサービスを呼び出してソース オブジェクトのコレクションを取得し、これを VeiwModel のプロパティにマップします。
例:
LetterEditModel editModel = _mappingEngine.Map<Letter, LetterEditModel>(_letterRepository.GetLetter(1));
editModel.Departments = _mappingEngine.Map<Department[], SelectOptionModel[]>(_departmentRepository.GetAllDepartments());
Departments は Letter オブジェクトのプロパティではないため、DropDownList のオプションを取得するには、別のクエリを作成する必要があります。これには、ViewModel プロパティを設定するために、別の AutoMapper 呼び出しが必要です。
ジミーがこれに対するいくつかのアプローチを説明しているAutoMapperの Google グループを見つけました。
これに関するジミー・ボガードのコメント:
選択リストがどのように変化するかに応じて、これを行う方法がいくつかあります。項目のハード リストの場合、多くの場合、その背後に何らかのモデル (State や Country など) が存在するため、ビュー モデルにはその 1 つのタイプのみがあり、エディター テンプレートが実際に状態のリストを取得します。
パラメーターによって異なる場合は、実際の選択リストを渡し、基本的に Mapper.Map + マップ後の操作 (AutoMapper ではない) を実行して、部分を埋める必要があります。AutoMapper を使用して主要部分を埋め、詳細を他の要素で埋めます。
最後に、選択リスト プロバイダー タイプのアプローチのようなものをビューに含めることができます。
Html.InputFor(m => m.UserRoles, opt => opt.SelectListProvider());
HTH、
ジミー
EditorFor テンプレートは、DropDownList または ListBox を生成できるコレクションを照会するために正しいサービスを取得するために DependencyResolver を使用していると思います。そのコードが EditorFor テンプレートのサーバー側コード ブロックに属しているかどうかはわかりません。これについての何かが私には正しくないように思えますが、私は完全に間違っている可能性があります. 私は常に、データ アクセスの呼び出しはビューからではなく、アクションの本体で行われると感じていました。
彼の 2 番目と 3 番目の推奨事項が何を意味するのか、私にはよくわかりません。
誰かがこの問題を解決し、これに対するエレガントな解決策を持っていると信じなければなりません。任意の推奨事項やアイデアをいただければ幸いです。