#asp.net-mvc-3 #automapper
#asp.net-mvc-3 #automapper
Вопрос:
Я пытаюсь улучшить поток данных между моей моделью MVC 3 и представлениями (в основном CRUD). Я выбрал подход с использованием ViewModels и FormModels. Моя ViewModel содержит все, что нужно для представления представления FormData, выпадающих списков и т. Д. FormModel просто содержит поля FormData, которые отправляются формой и необходимы для обновления записи.
Мой вопрос в том, могу ли я использовать AutoMapper для сопоставления информации UserDTO с моим полем FormData в моей ViewModel?
Очевидно, что мое приведенное ниже сопоставление — это только сопоставление между двумя объектами, а не объект к свойству, но я попытался использовать параметры сопоставления ‘.ForMember’, но они снова для членов объекта, а не объекта для члена объекта. Я также посмотрел на пользовательские преобразователи типов, но не уверен, что это правильный путь.
Mapper.CreateMap<UserDto, UserViewModel>();
Mapper.CreateMap<UserViewModel, UserDto>();
public class UserViewModel
{
public User FormData { get; set; }
// DropDownLists
// Other view specific data
}
public class UserFormModel
{
public int UserId { get; set; }
[Required]
public string Name { get; set; }
[Required]
public string Age { get; set; }
[Required]
public string Email { get; set; }
}
Любая помощь будет высоко оценена.
Комментарии:
1. У вас есть какая-либо ошибка? В чем именно проблема?
2. Когда я проверяю, что конфигурация AutoMapper действительна с помощью Mapper. AssertConfigurationIsValid(); он сообщает мне, что поле FormData не сопоставлено, и мне нужно добавить пользовательское выражение сопоставления, игнорировать или переименовать свойство, которое я знаю. Мне просто нужно понять, как я делаю сопоставление, если это вообще возможно. Если нет, то просто вручную сопоставить?
3. Да, для каждого типа вам нужно установить сопоставление.
Ответ №1:
Вам нужно создать сопоставление с типом свойства FormData, а затем указать AutoMapper использовать эту карту.
(Следующее, скорее всего, не будет скомпилировано; я нахожусь в процессе воссоздания моей рабочей машины и работаю из памяти).
Mapper.CreateMap<UserDto, User>(); // set up property mapping
Mapper.CreateMap<UserDto, UserViewModel>()
.ForMember(vm => vm.FormData, map => map.MapFrom(dto => Mapper.Map<UserDto, User>(dto)));
Комментарии:
1. Большое спасибо за ваш ответ, но он все еще не работает. Все еще говорю, что ни одно из свойств не сопоставлено и что мне нужно выполнить пользовательское сопоставление. Потратил слишком много времени на это сейчас, так что можете просто сделать это вручную в любом случае!
2. На самом деле вернулся к нему и заставил его работать с точным предоставленным кодом. Единственной опечаткой было то, что я использовал. ForMember и нет . ForProperty. Большое спасибо.