In this article, we will discuss how to choose the most suitable way to pass multiple models from controller to view in ASP.NET MVC. We have seen 6 such approaches, i.e., ViewModel, Patial View, Tuple, ViewData, ViewBag and TempData in the previous article "Using Multiple Models in a view in ASP.NET MVC4". We may get confused while selecting a way to be used in a particular scenario. In this article, I will share my findings on this topic.
If you have not read our previous article on Using Multiple Models in a view in ASP.NET MVC4, please have a look because the current article is based on that. The previous article has detailed discussion on how we can pass multiple models from controller to view along with a demo application in ASP.NET MVC 4. It will help you to understand the current article better.
All six approaches described in the previous article have their own pros and cons. What to pick when depends upon the specific scenario in hand and obviously it is a debatable topic. Before taking any decision, we need to identify the requirement exactly then only we should choose one of those approaches by comparing the pros and cons. In this article, I would like to arrange those approaches from most to least frequently used in ASP.NET MVC applications as given below:
An application can use more than one approach based on the requirement at a particular point. We need to consider the best one as per the current need.
Now we will discuss the above approaches, their usages, associated pros and cons in detail.
ViewModel is a pattern that allow us to have multiple models as a single class. It aggregates models or contains their properties exactly as per the need of a view. ViewModel should not have methods. It should be a collection of properties needed for a view.
It is the most widely used approach to pass multiple models to View in enterprise applications. It is the standard way you can use when you need to display multiple models in the view (applicable in case of partial view too).
A Partial View is a sub-view that you can include in a parent view. In many cases, we have a situation where many Views have shared/common presentation, that common presentation is separated into a Partial View and used in other Views.
This approach is also frequently used in enterprise applications along with ViewModels. It is used where you need to share the same code (Razor and HTML code) in more than one View.
ViewBag is a dynamic property which comes from ControllerBase
class. Internally ViewBag
properties are stored as name/value pairs in the dictionary. It takes advantage of the new dynamic features in C# 4.0 soViewBag
doesn’t require typecasting for data types.
ASP.NET MVC 3.0 and latest versions, it is supposed to be used where a property is directly associated to View and do not fit as a model (a model is supposed to be a class encapsulating business data and behaviors). Typical examples of ViewBag
are to set the title of a View using ViewBag.Title
, or display some message in View asViewBag.Message
, etc.
ViewBag
, we can send data from controller to view with minimal efforts.ViewBag
is better than ViewData
. No need to use key.ViewBag
doesn’t require type casting for data types.ViewBag
persists only during current request. Its value cannot persist between requests so if redirection occurs, then its value becomes null
.ViewBag
. It is not recommended in enterprise application, even though sometime it may use to transfer small data.ViewData
but in real world scenarios, the difference is just negligible. (And at first place, micro optimization is bad.)ViewData
is defined as property (type of ViewDataDictionary
class) in ControllerBase
class. Values stored in ViewData
require typecasting to their datatype in View. The values in ViewData
are accessible using a key.
In ASP.NET MVC version 1 and 2, it is used for the same purpose as ViewBag
. Microsoft is supporting ViewData
for newer version but as ViewBag
is providing more benefits, it is better not to use ViewData
with latest versions of MVC.
ViewData
, we can send data from controller to view with inbuilt feature using keys.ViewData
persists only during current request. Its value cannot persist between requests so if redirection occurs, then its value becomes null
.ViewData
. It is not recommended in enterprise application, even though sometime it may use to show small data.ViewBag
which uses property style syntax.TempData
is defined as property in ControllerBase
class. It is a type of TempDataDictionary
class. Values stored in TempData
require typecasting to datatype in View. The values in TempData
are accessible using a key. It is similar to ViewData
but the difference is that it allow us to send and receive the data from one controller to another controller and from one action to another action. It is possible because it internally uses session variables.
Whenever you need to hold some information till subsequent request, it is good to use TempData
. It should be used when you need to hold some information like validation messages, error message or some small data which are not having any sensitive information. As it maintains the session to pass value, you should not keep sensitive data in TempData
.
null
values to avoid error.Tuple
is a new class introduced in .NET Framework 4.0. It is an ordered sequence, immutable, fixed-size collection of heterogeneous (allows us to group multiple kind of data types) objects.
It may be good for small and demo applications. Tuple
is a feature of C# language meant for specific scenarios (described here), but if you are using it in ASP.NET MVC, you should use Tuple
only when you do not want to create ViewModel
.
ViewModel
)ViewModel
item1
, item2
.....It is difficult to identify the arguments just by seeing the code.In this article, we learned how to choose the best way to pass multiple models in ASP.NET MVC application. I hope this article will help you to understand and use those concepts in your applications in an efficient way. Your queries and comments are most welcome in this respect. Thanks.
How to Choose the Best Way to Pass Multiple Models in ASP.NET MVC
原文:http://www.cnblogs.com/imust2008/p/5241641.html