Я сам знакомлюсь с MVC, но вчера я исследовал эту же тему и пришел к выводу, что не следует напрямую включать объект модели во ViewModel. Поэтому я понимаю, что было бы плохой практикой включать вашу CustomerModel непосредственно в CustomerViewModel.
Вместо этого вы хотите перечислить каждое из свойств CustomerModel, которое вы хотите включить в вашу ViewModel. Затем вы хотите либо вручную сопоставить данные из CustomerModel с CustomerViewModel, либо использовать такой инструмент, как AutoMapper, который автоматически делает это с помощью строки кода, подобной этой, внутри вашего метода действия:
public ViewResult Example()
{
// Populate/retrieve yourCustomer here
Customer yourCustomer = new CustomerModel();
var model = Mapper.Map<CustomerModel, CustomerViewModel>(yourCustomer);
return View(model);
}
В этом случае Mapper.Map вернет модель CustomerViewModel, которую вы можете передать в View.
Вам также необходимо включить в метод Application_Start следующее:
Mapper.CreateMap<CustomerModel, CustomerViewModel>();
В общем, я нашел AutoMapper довольно простым для работы. Это происходит автоматически, когда имена полей совпадают, если они не совпадают или у вас есть вложенный объект, вы можете указать эти сопоставления в строке CreateMap. Поэтому, если ваша CustomerModel использует объект Address вместо отдельных свойств, вы должны сделать это:
Mapper.CreateMap<CustomerModel, CustomerViewModel>()
.ForMember(dest => dest.StreetAddress, opt => opt.MapFrom(src => src.Address.Street));
Пожалуйста, кто-нибудь поправит меня, если я ошибаюсь, потому что я тоже разбираюсь в MVC.