ASP.NET MVC 3: New ViewModel is dynamic ViewData

  • submit to reddit

I am developer and technology maniac who is working on Microsoft and PHP technologies. I have ASP.NET MVP title and I hold MCAD, MCSD and MCTS certificates. When I have free time I usually play with new technologies, hack something, read books, participate in communities and speak in events. I am also active blogger and my ASP.NET blog is the place you can find some interesting reading about my discoveries and personal thoughts. Gunnar is a DZone MVB and is not an employee of DZone and has posted 81 posts at DZone. View Full User Profile

ASP.NET MVC 3 introduces new ViewModel property of Controller that you can use to assign different properties to the model of your view. ViewModel is dynamic by type. In this posting I will show you how to use ViewModel property in your ASP.NET MVC applications.

Suppose you have controller for products that has method Details() to show details of product requested by visitor. We want to use dynamic ViewModel to get data to details view.

So, here is our controller that uses dynamic ViewModel.

public ActionResult Details(int productId)
{
var product = _repository.GetProductById(productId);

if (Request.IsAuthenticated)
ViewModel.VisitorName = HttpContext.User.Identity.Name;
else
ViewModel.VisitorName = "visitor";

ViewModel.ProductName = product.Name;
ViewModel.ProductUnitPrice = product.UnitPrice;
ViewModel.ProductDescription = product.Description;

// ...

return View();
}

And here is the fragment of view that shows product details.

<h2><%= ViewModel.ProductName  %> (<%= ViewModel.ProductPrice  %> EUR)</h2>
<p>
<%= ViewModel.ProductDescription %>
</p>
User can see besides other stuff the fragment like this.


Let’s try now what happens when we use good old ViewData instead of ViewModel.

public ActionResult Details(int productId)
{
var product = _repository.GetProductById(productId);

if (Request.IsAuthenticated)
ViewData["VisitorName"] = HttpContext.User.Identity.Name;
else
ViewData["VisitorName"] = "visitor";

ViewData["ProductName"] = product.Name;
ViewData["ProductUnitPrice"] = product.UnitPrice;
ViewData["ProductDescription"] = product.Description;

// ...

return View();
}

Don’t make any other changes to code. Compile your project and refresh product page. Guess what … the result is same as before! Why should ViewData and ViewModel be synchronized? Think about controller unit test and it should be clear.

Conclusion

ViewModel property of Controller is great addition to ASP.NET MVC and it makes our code and views more readable. Instead of using ViewData or strongly typed views we can use ViewModel to form our model objects dynamically and give them to views.

References
0

(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)

Comments

Hassan Turhal replied on Sun, 2012/01/22 - 12:41pm

I don't like the use of ViewData at all.

1) You don't define what is required.

2) No compile time errors

I create a class now i.e. ProductViewModel

public class ProductViewModel{

   public Product Product {get; set;}

   public decimal Price {get; set;}

}

And send this as my view to the model.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.