How to Choose the Best Way to Pass Multiple Models in ASP.NET MVC
Snesh Prajapati, 8 Dec 2014
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, 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.
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
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.
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 of ViewBag are to set the title of a View using ViewBag.Title, or display some message in View asViewBag.Message, etc.
Advantages
- Using
ViewBag, we can send data from controller to view with minimal efforts. - Syntax of
ViewBagis better thanViewData. 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 becomesnull. - 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
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.
Typical Usages
In ASP.NET MVC version 1 and 2, it is used for the same purpose as ViewBag. Microsoft is supporting ViewDatafor newer version but as ViewBag is providing more benefits, it is better not to use ViewData with latest versions of MVC.
Advantages
- Using
ViewData, 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 becomesnull. - 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
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.
Typical Usages
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.
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
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.
Typical Usages
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.
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
How to Choose the Best Way to Pass Multiple Models in ASP.NET MVC的更多相关文章
- WPF – pass multiple parameters to a Command
public class SendCommand : ICommand { public void Execute(object parameter) { var labels = ((object[ ...
- How to pass multiple parameters in PowerShell invoke-restmethod
Link: http://www.tagwith.com/question_322855_how-to-pass-parameters-in-powershell-invoke-restmethod- ...
- MVC到底使用哪种方式传递Model,在ViewData、ViewBag、PartialView、TempData、ViewModel、Tuple之间取舍
在"MVC控制器传递多个Model到视图,使用ViewData, ViewBag, 部分视图, TempData, ViewModel, Tuple"中,体验了使用不同的方式传递多 ...
- Incorporating ASP.NET MVC and SQL Server Reporting Services, Part 1
Your ASP.NET MVC application needs reports. What do you do? In this article, I will demonstrate how ...
- WebForm vs MVC
What is ASP.NET? ASP.NET is a Microsoft’s Web application framework built on Common language runtime ...
- Fedora 22中的DNF软件包管理工具
Introduction DNF is the The Fedora Project package manager that is able to query for information abo ...
- (转) [it-ebooks]电子书列表
[it-ebooks]电子书列表 [2014]: Learning Objective-C by Developing iPhone Games || Leverage Xcode and Obj ...
- DotNet 资源大全中文版(Awesome最新版)
Awesome系列的.Net资源整理.awesome-dotnet是由quozd发起和维护.内容包括:编译器.压缩.应用框架.应用模板.加密.数据库.反编译.IDE.日志.风格指南等. 算法与数据结构 ...
- 【ASP.NET Identity系列教程(二)】运用ASP.NET Identity
注:本文是[ASP.NET Identity系列教程]的第二篇.本系列教程详细.完整.深入地介绍了微软的ASP.NET Identity技术,描述了如何运用ASP.NET Identity实现应用程序 ...
随机推荐
- [转]你真的了解setTimeout和setInterval吗?
原文: http://qingbob.com/difference-between-settimeout-setinterval/ setTimeout和setInterval的基本用法我们一带而过: ...
- 实例甜点 Unreal Engine 4迷你教程(2)之用C++改变Image小部件的颜色
完成本迷你教程之前,请前往完成以下迷你教程: ·实例甜点 Unreal Engine 4迷你教程之如何用C++将纹理绘制在UserWidget的Image小部件上: 目标:实现UMG中的此功能: 在上 ...
- Cassandra学习五 使用Key的正确姿势
NoSQL一般是反范式的,比如提倡数据冗余,使得不至于写出非常复杂的SQL语句. Cassandra之中一共包含下面5中Key: Primary Key: 用来获取某一行的数据,可以是一列或多列 ...
- 浏览器访问IPv6地址
http://[IPv6]:port/index.html http://[3ffe:3201:1200:1::91]:8080/index.html 目前现在的网络运营商基本都不支持基于IPv6地址 ...
- catkin 工作空间 - Package 组成
package 是 ROS 软件的基本组织形式,ROS 就是由一个个的 package 组成的 package 是 catkin 的编译基本单元 一个 package 可以包含多个可执行文件(节点) ...
- 前端学习---css基本知识
css基本知识 我们先看一个小例子: <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- ado connection string
Provider=SQLOLEDB.1;Password=123;Persist Security Info=True;User ID=sa;Initial Catalog=mydb;Data Sou ...
- Windows下安装配置免安装MySQL5.7服务器
Windows下安装配置免安装MySQL5.7服务器 1.下载.解压安装包 从MySQL官方网站上下载mysql-5.7.19-winx64.zip 下载完成后,把安装包解压到D:\DevSoft ...
- js监听文本框内容变化
js监听文本框内容变化 原理很简单,就是在外部先声明一个用来记录input值的变量,然后每0.1秒比较这个值与input的值,如果发生改变,则运行自己的代码,同时改变变量.从而实现对input值改变的 ...
- Redis搭建(四):Sharding集群模式
一. 方案 1. 介绍redis集群分为服务端集群(Cluster)和客户端分片(Sharding)服务端集群:redis3.0以上版本实现,使用哈希槽,计算key的CRC16结果再模16834.此处 ...