How to Choose the Best Way to Pass Multiple Models in ASP.NET MVC
2016-03-04 12:26
976 查看
Snesh Prajapati, 8 Dec 2014
http://www.codeproject.com/Articles/717941/How-to-Choose-the-Best-Way-to-Pass-Multiple-Models
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.
ViewModel
Partial View
ViewBag
ViewData
TempData
Tuple
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.
Great intellisense support and compile time error checking on View page.
ViewModel is good for security purpose also as Views have only what they exactly need. Core domain models are not exposed to user.
If there is any change in core domain model, you do not need to change anywhere in View code, just you need to modify corresponding ViewModel.
In this way, ViewModel promotes loose coupling in application.
It is very helpful for single page applications
You can use ViewModel approach to Partial View too.
Using Partial View, you can update a particular area of a View without refreshing the whole page using AJAX.
Syntax of
The value of
It is certainly a bad practice to overuse
No intelligence support and compile-time error checking.
Technically speaking, it is slow as compared to
The value of
It is certainly a bad practice to overuse
Use key syntax, so not as readable as
No intelligence support and compile-time error checking.
It requires type casting for data type and check for
No intellisense support in Visual Studio.
A quick remedy and need less coding efforts than
Value is passes as
Not a great intellisense support in Visual Studio.
[2] http://www.codeproject.com/Articles/193537/C-4-Tuples
[3] http://stackoverflow.com/questions/1500402/when-to-use-tempdata-vs-session-in-asp-net-mvc
[4] http://www.webcodeexpert.com/2013/12/what-is-use-of-viewbag-viewdata-and_3.html
http://www.codeproject.com/Articles/717941/How-to-Choose-the-Best-Way-to-Pass-Multiple-Models
Introduction
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, ViewBagand TempDatain 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.
Overview of Approaches
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:ViewModel
Partial View
ViewBag
ViewData
TempData
Tuple
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
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.Typical Usages
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).Advantages
ViewModel allows us to render multiple model types in a View as a single model.Great intellisense support and compile time error checking on View page.
ViewModel is good for security purpose also as Views have only what they exactly need. Core domain models are not exposed to user.
If there is any change in core domain model, you do not need to change anywhere in View code, just you need to modify corresponding ViewModel.
In this way, ViewModel promotes loose coupling in application.
Disadvantages
ViewModels add another layer between Models and Views so it increases the complexity a little bit. So for small and demo applications, we can use tuple or other ways to keep the things simple for demo.Partial View
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.Typical Usages
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.Advantages
It promotes reusability of code (Razor and HTML code) in application.It is very helpful for single page applications
You can use ViewModel approach to Partial View too.
Using Partial View, you can update a particular area of a View without refreshing the whole page using AJAX.
Disadvantages
If used excessively, then View becomes a just aggregation of Partial Views, so sometime readability is compromised.ViewBag
ViewBagis a dynamic property which comes fromControllerBaseclass. Internally
ViewBagproperties are stored as name/value pairs in the dictionary. It takes advantage of the new dynamic features in C# 4.0 so
ViewBagdoesn’t require typecasting for data types.
Typical Usages
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 ofViewBagare to set the title of a View using
ViewBag.Title, or display some message in View as
ViewBag.Message, etc.
Advantages
UsingViewBag, we can send data from controller to view with minimal efforts.
Syntax of
ViewBagis better than
ViewData. No need to use key.
ViewBagdoesn’t require type casting for data types.
Disadvantages
It is meant for transferring data one-way only that is from controller to view.The value of
ViewBagpersists only during current request. Its value cannot persist between requests so if redirection occurs, then its value becomes
null.
It is certainly a bad practice to overuse
ViewBag. It is not recommended in enterprise application, even though sometime it may use to transfer small data.
No intelligence support and compile-time error checking.
Technically speaking, it is slow as compared to
ViewDatabut in real world scenarios, the difference is just negligible. (And at first place, micro optimization is bad.)
ViewData
ViewDatais defined as property (type of
ViewDataDictionaryclass) in
ControllerBaseclass. Values stored in
ViewDatarequire typecasting to their datatype in View. The values in
ViewDataare accessible using a key.
Typical Usages
In ASP.NET MVC version 1 and 2, it is used for the same purpose asViewBag. Microsoft is supporting
ViewDatafor newer version but as
ViewBagis providing more benefits, it is better not to use
ViewDatawith latest versions of MVC.
Advantages
UsingViewData, we can send data from controller to view with inbuilt feature using keys.
Disadvantages
It is meant for transferring data one-way only that is from controller to view.The value of
ViewDatapersists only during current request. Its value cannot persist between requests so if redirection occurs, then its value becomes
null.
It is certainly a bad practice to overuse
ViewData. It is not recommended in enterprise application, even though sometime it may use to show small data.
Use key syntax, so not as readable as
ViewBagwhich uses property style syntax.
No intelligence support and compile-time error checking.
TempData
TempDatais defined as property in
ControllerBaseclass. It is a type of
TempDataDictionaryclass. Values stored in
TempDatarequire typecasting to datatype in View. The values in
TempDataare accessible using a key. It is similar to
ViewDatabut 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.
Typical Usages
Whenever you need to hold some information till subsequent request, it is good to useTempData. 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.
Advantages
You can pass value from one action to another action or one controller to another controller.Disadvantages
It may introduce security risk as described above.It requires type casting for data type and check for
nullvalues to avoid error.
No intellisense support in Visual Studio.
Tuple
Tupleis 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.
Typical Usages
It may be good for small and demo applications.Tupleis a feature of C# language meant for specific scenarios (described here), but if you are using it in ASP.NET MVC, you should use
Tupleonly when you do not want to create
ViewModel.
Advantages
It provides a way to aggregate models without creating new class (ViewModel)
A quick remedy and need less coding efforts than
ViewModel
Disadvantages
Tuples is fixed size maximum limit of 8 items.Value is passes as
item1,
item2.....It is difficult to identify the arguments just by seeing the code.
Not a great intellisense support in Visual Studio.
Conclusion
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.References
[1] http://stackoverflow.com/questions/664205/viewmodel-best-practices[2] http://www.codeproject.com/Articles/193537/C-4-Tuples
[3] http://stackoverflow.com/questions/1500402/when-to-use-tempdata-vs-session-in-asp-net-mvc
[4] http://www.webcodeexpert.com/2013/12/what-is-use-of-viewbag-viewdata-and_3.html
相关文章推荐
- 利用Aspose.Word控件实现Word文档的操作
- asp.net使用signalr实现集群集群下面的消息推送
- ASP.NET 5服务
- ASP.NET Web开发 Echarts图表空数据优化
- ASP.NET下载文件几种方式
- ASP.NET MVC 远程下载文件
- <aop:aspectj-autoproxy proxy-target-class="false"/>导致出现404状态码
- SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-012-AOP总结
- SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-011-注入AspectJ Aspect
- asp.net mvc发送邮件
- asp.net mvc发送邮件
- 7天 搞定 ASP.NET MVC - 第4天
- ASP.NET MVC5 默认用户管理
- SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-010-Introduction为类增加新方法@DeclareParents、<aop:declare-parents>
- SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-009-带参数的ADVICE2 配置文件为XML
- SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-009-带参数的ADVICE2
- SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-008-带参数的ADVICE
- SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-007-定义切面的around advice
- SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-006-定义切面使用xml
- SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-005-定义切面使用@Aspect、@EnableAspectJAutoProxy、<aop:aspectj-autoproxy>