Matter to discuss is that if Model passing full
information to a View, it's straight to use and simple to code too. Then what's
matter with ViewModel? when it need to be used? As per industry experience, we
have 2 scenarios where it needs to be implemented.
- View need to handle 2 Models and both models to
be in side a single container
- View to handle indicators like, whether a user
logged or not? Whether to render a portion or not which are logic belongs to
View and we can't keep these under a Model
So you are very much in a position to explain to
your client about why need to implement a View Model. Below I am explaining 2
different types of implementation of View Model. The 2nd one will use one more
standard layer as Mapper.
1. ViewModel as a type to keep Entity
Information and to pass it to the View -
public class MyController : Controller
{
public ActionResult Index()
{
OrderModel orderModel = <<Call
to get Model>>
EnquiryModel enquiryModel = <<Call
to get Model>>
DetailOrderViewModel viewModel= new DetailOrderViewModel
{
ShouldRenderLoginSection
= !User.Identity.IsAuthenticated,
LoggedInName
= User.Identity.Name ?? "",
OrderModel
= orderModel,
EnquiryModel=
enquiryModel
};
returnView(viewModel);
}
}
public classDetailOrderViewModel
{
public bool ShouldRenderLoginSection
{ get; set; }
public stringLoggedInName { get; set;
}
public OrderModel
OrderModel
{ get; set; }
public EnquiryModel
EnquiryModel{
get; set;
}
}
?
Above you see a scenario to display Order
details. Order details may contain enquiry information like whether this order
has been came through an inquiry or it's a direct Order etc.. We kept a
ViewModel to keep all information and then passed this ViewModelto the View.
Here ViewModel is acting as a simple container for multiple entities
2. ViewModel as a type to keep Entity
Information through a Mapper -
public class MyController : Controller
{
public ActionResult Index()
{
OrderModel orderModel = <<Call
to get Model>>
EnquiryModel
enquiryModel = <<Call
to get Model>>
DetailOrderViewModel
viewModel= MyEntityViewModelMapper.ConvertFromBusinessEntity(orderModel,enquiryModel
);
returnView(viewModel);
}
}
public classDetailOrderViewModel
{
public bool ShouldRenderLoginSection
{ get; set; }
public stringLoggedInName { get; set;
}
public OrderModel
OrderModel
{ get; set; }
public EnquiryModel
EnquiryModel{
get; set;
}
}
public
class MyEntityViewModelMapper
{
//Mapping/Assignments here
}
See
above implementation that the manual assignment no where applied and it has been
moved to a separate Mapper class. This is the preferred implementation as we got
clear separation. Now you guys please come up with feed backs as you may have
some better suggestions.v