Do you apply View Models in ASP.NET MVC

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.

  1. View need to handle 2 Models and both models to be in side a single container
  2. 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



Next Recommended Reading Loop through Model items in ASP.NET MVC