AutoMapViewResult от поставить ваши контроллеры на диете видео от Джимми Богарда
Я посмотрел это видео пару раз, и мне действительно нравится созданный им собственный 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. Для этого требуется еще один вызов AutoMapper, чтобы заполнить свойство ViewModel.
Я нашел группу Google для AutoMapper, в которой Джимми как бы объясняет некоторые подходы к этому.
Комментарии Джимми Богарда к этому:
У нас есть несколько способов сделать это, в зависимости от того, как меняется список выбора. Если это жесткий список элементов, то за ним часто стоит какая-то модель (например, State или Country), поэтому наша модель представления просто имеет этот один тип, а шаблоны нашего редактора позаботятся о том, чтобы фактически получить список состояний.
Если он варьируется в зависимости от какого-либо параметра, мы должны передать фактический список выбора вниз и, в основном, выполнить манипуляцию Mapper.Map + post-map (не в AutoMapper), чтобы заполнить фрагменты. Мы используем AutoMapper, чтобы заполнить основные части, и детали с чем-то еще.
Наконец, у нас может быть что-то вроде подхода выбора типа списка поставщиков:
Html.InputFor (m => m.UserRoles, opt => opt.SelectListProvider ());
НТН,
Джимми
Я предполагаю, что шаблон EditorFor будет использовать DependencyResolver для того, чтобы получить правильный сервис для запроса вашей коллекции, для которой вы можете создать свой DropDownList или ListBox. Я не знаю, принадлежит ли этот код блоку кода на стороне сервера в шаблоне EditorFor. Что-то в этом мне не кажется правильным, но я могу ошибаться. Я всегда чувствовал, что любые вызовы доступа к данным будут выполняться в теле действия, а не из представления.
Я не совсем уверен, что он подразумевает под своими вторыми и третьими рекомендациями.
Я должен верить, что кто-то решил эту проблему и имеет элегантное решение для этого. Любые рекомендации или идеи будут с благодарностью.