How can I use complex objects with my view model?


I'm just getting started with MVC and have my first project under development. I've been trying to wrap my head around an issue with my viewmodel and a domain object.

My view model consists of a customer object and an address object. The problem is, even though all the properties of the customer and address display on the view, I can only save changes if I explicitly define each property in the view model. In other words, I need to duplicate the properties of the customer and address objects in the view model. This solves all my problems.

My question is, do I need to explicitly define each property in the view model or is there a way I can just define the view model with a Customer property of type Customer and an Address property of type Address (which would be much simpler)?

Based on I what I'm finding online, I think the answer is I must define each property in the view model. If that is correct, are there any ways to automatically do this mapping for me?


AutoMapper is quite popular for mapping.

Regarding your ViewModel definitions, you want your ViewModel to correspond directly to the your View. There shouldn't be a property in your ViewModel that isn't used on the View. If you've got logic-less Views (which you should!), then often the properties on your ViewModel will be directly related to the fields you have on your View.

Of course, there are times when two ViewModels will use exactly the same properties and there's nothing stopping you from doing something like this:

public class CustomerViewModel {
    public string Name { get; set; }
    public AddressViewModel Address { get; set; }

public class AddressViewModel {
    public string AddressLine1 { get; set; }

The problem is as soon as you start doing this, it's oh so much easier to let yourself slip in a property that isn't used somewhere once or twice, maybe throw in some ViewModel inheritance and you end up with very messy ViewModels.

Generally I've found that the recommendation is to have flat ViewModels. For instance, if you have two Views that need Customer and Address information, just take the hit, create a separate ViewModel for both Views and duplicate the properties in both of them.