Reputation: 2865
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?
ASP.NET MVC 4
Upvotes: 3
Views: 1844
Reputation: 9572
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.
Upvotes: 1
Reputation: 218832
Define only the necessary properties your View requires in the ViewModel
. Your ViewModel may look similar to your Domain model. But youur view model needs only properties required by the view. Not all the properties.
Ex :You may have a customer domain model with properties CustomerID, FirstName,LastName,CreatedDate,CreatedBy,LastModifiedDate
.
public class CustomerDomainModel
{
public int CustomerID { set;get;}
public string FirstName { set;get;}
public string LastName { set;get;}
public DateTime CreatedDate { set;get;}
public DateTime LastModifiedDate { set;get;}
public int CreatedBy { set;get;}
}
But in your view (UI - form) , you may need to show the fields for only FirstName
and LastName
. So your viewModel may have only those 3 properties ( FirstName & LastName + another property to have the CustomerID
also)
public class CustomerViewModel
{
//My view is going to use only these 3 fields.
// Hence no other properties i am defining here
public int CustomerID { set;get;}
public string FirstName { set;get;}
public string LastName { set;get;}
}
To map between these 2 (Domain object to ViewModel) , you may consider using Automapper
Upvotes: 1