ViewData、ViewBag、TempData、Session的区别与联系
简介
这篇文章是我在学习ASP.NET MVC程序传值方式梳理总结的笔记。在ASP.NET MVC中,页面间和Controller与View之间主要有以下几种小量数据传值方式, ViewData、ViewBag、TempData、Session变量。 我们是幸运的,微软提供给了我们这么多传值方法,但选择越多越让人抓狂,这些技术每一种都有自己的优点和缺点,我应该何时使用哪一种传值方式呢?
正文
上面的这四种方法中,ViewData和ViewBag其实是一回事, ViewBag其实是对ViewData的封装, 其内部其实是使用ViewData实现数据存储的。唯一的不同点是,ViewBag可以存储动态类型(dynamic)的变量值, 而ViewData只能存储String Key/Object Value字典数组。 所以我们可以将这四种方法归为三大类, ViewData和ViewBag, TempData, Session。
ViewData["Message"] = "Hello ASP.NET MVC";
// Or
ViewBag.Message = "Hello ASP.NET MVC";
TempData也是一个String Key/Object Value字典数组。 和ViewData与ViewBag不同的是其所存储的数据对象的生命周期。 如果页面发生了跳转(Redirection),ViewBag和ViewData中的值将不复存在, 但是TempData中的值依然还在。 换句话讲, ViewBag和ViewData存储的值的生命周期只有在从Controller到View中, 而TempData中的数据不仅在从Controller到View中有效,在不同的Action之间或者从一个页面跳转到另一页面(Controller to Controller)后依然有效。
TempData["Message"] = "Hello ASP.NET MVC";
Session其实和ViewData类似,也是一个String Key/Object Value字典数组。但是,Session是存储在客户端的Cookies中,所以它的生命周期是最长的。 但是,正因为其存储的客户端, 所以必须确保没有敏感机密的信息存储其中。
Session["Message"] = "Hello ASP.NET MVC";
下面我们对每一个传值方法的特点进行以下总结。
ViewData
- ViewData是一个继承自ViewDataDictionary类的Dictionary对象。
- ViewData用来从Controller向对应的View传递值。
- ViewData的只在当前当前的请求中有效,生命周期和View相同,其值不能在多个请求中共享。
- 在重定向(redirection)后,ViewData中存储的变量值将变为null。
- 在取出ViewData中的变量值是,必须进行合适的类型转换(隐式或显式)和空值检查。
下面我们来看一个简单的例子,演示一下如何使用ViewData来从Controller向View传值。
public ActionResult Index()
{
ViewData["Message"] = "This is a message from ViewData"; return View();
}
然后,我们从视图中取出这个变量,
执行后,你将会在浏览器中看到如下的结果,
可能你注意到了,我在从ViewData中取出变量Message时并没有对其进行类型转换,那时因为我们存储的是一个简单类型的变量值。假如存储的是复杂对象,在取出是必须进行类型转换。
综上, ViewData更适合从Controller向View传递简单对象数据时使用。
ViewBag
- ViewBag是一个动态类型变量(dynamic),这是C# 4.0引入的新特性,变量类型会在运行时进行解析。
- ViewBag基本上是ViewData的包装,也是用来从Controller向View来传递值的。
- ViewBag也只在当前的请求中有效。
- 在重定向(redirection)后,ViewBag中存储的变量值将变为null
- 因为ViewBag是动态类型,所以我们在取得其值时,不需要进行类型转换。
同样,我们通过一个简单的例子来演示一下如何利用ViewBag从Controller向View传递数据。
public ActionResult Index()
{
ViewBag.Message = "This is a message from ViewBag"; return View();
}
然后,在视图中取出数据并显示,
最后,执行程序,你将会在浏览器中看到如下结果,
综上, ViewBag更适合从Controller向View传递复杂对象数据时使用, 因为取出存储在其中的数据变量时无需进行类型转换。
TempData
- TempData是一个继承自TempDataDictionary类的字典对象,它默认情况下是基于Session存储机制之上的。(备注: 你也可以让你的TempData基于其他存储机制之上, 我们可以提供我们自定义的ITempDataProvider来完成,具体可以参见: Session-less Controllers and TempData in ASP.NET MVC)
- TempData是用来在多个Actions或从当前请求向子请求, 页面发生了重定向(Redirection)时传递共享数据。
- 只有在目标视图(View)完全加载后才有效。
- 在取出TempData存储的变量值时,必须进行合适的类型转换(隐式或显式)和空值检查。
下面,我们透过一个例子来演示一下如何在两个Action方法中传递数据。
首先,创建一个客户Model类,如下:
public class Customer
{
public int Id { get; set; }
public string Code { get; set; }
public double Amount { get; set; }
}
然后,在Controller中加入如下代码:
public ActionResult DisplayCustomer1()
{
Customer customer = new Customer
{
Id = 1001,
Code = "100101",
Amount = 100
}; TempData["OneCustomer"] = customer; return RedirectToAction("DisplayCustomer2");
} public ActionResult DisplayCustomer2()
{
Customer customer = TempData["OneCustomer"] as Customer; return View(customer);
}
最后,创建一个强类型视图(Strong Typed View)来显示客户信息。
执行程序,浏览器中会显示如下结果:
综上, TempData主要用在需要在多个Actions或者页面重定向时共享传递数据时使用。
Session
- Session也是ASP.NET MVC程序传递值的一种方式,但与TempData不同,用户的整个会话中Session都不会过期。
- Session在同一用户会话过程中的所有请求中有效,比如,刷新页面。
- Session中的值也需要进行类型转换(隐式或显式)和非空检查。
我们仍然使用上面的这个例子,假如我们不用TempData而是使用Session, 也可以得到同样的结果。
public ActionResult DisplayCustomer1()
{
Customer customer = new Customer
{
Id = 1001,
Code = "100101",
Amount = 100
}; Session["OneCustomer"] = customer; return RedirectToAction("DisplayCustomer2");
} public ActionResult DisplayCustomer2()
{
Customer customer = Session["OneCustomer"] as Customer; return View(customer);
}
Session的生命周期是最长的,但是它默认使用的是Cookies来存储数据,所以使用的时候必须注意数据保密的问题。
综上, Session主要用在需要在多个Controllers, Actions and Views共享数据(非敏感数据)时使用。
图说传递方式的生命周期
Maintains data between | ViewData/ViewBag | TempData ( For single request) | Session |
Controller to Controller | No | Yes | Yes |
Controller to View | Yes | Yes | Yes |
View to Controller | No | No | Yes |
后记
本文试图通过介绍ASP.NET MVC程序中传递小量数据的几种机制的优缺点和适用场景。 本文只是一篇学习笔记,笔者初学ASP.NET MVC, 理解难免有偏差, 如有错误, 还望指正。
参考资料:
- http://www.coderewind.com/article/how-to-get-started-with-asp-net-mvc
- http://www.dotnet-tricks.com/Tutorial/mvc/9KHW190712-ViewData-vs-ViewBag-vs-TempData-vs-Session.html
- http://www.codeproject.com/Articles/259560/Learn-MVC-Model-view-controller-Step-by-Step-in-7
- http://blog.csdn.net/shuaishenkkk/article/details/8570463
- A Beginner's Tutorial on Various Ways of Passing Data in ASP.NET MVC Application
- Using TempData while <sessionState mode="Off" />
ASP.NET MVC学习笔记系列
ViewData、ViewBag、TempData、Session的区别与联系的更多相关文章
- 【MVC4 之 ViewData ViewBag TempData】
ViewData (一个字典集合类型):传入的key必须是string类型,可以保存任意对象信息,特点:它只会存在这次的HTTP的要求中而已,并不像session可以将数据带到下一个Http要求. V ...
- 2.ViewBag、ViewData、TempData之间的区别
1.ViewBag and ViewData(非跨视图访问) 1)ViewBag是一种dynamic动态类型,用户可以自定义属性并为其赋值,它会在运行时动态解析(例:可以作为变量.数组等各种对象传递并 ...
- ViewBag、ViewData、TempData之间的区别
1.ViewBag and ViewData(非跨视图访问) 1)ViewBag是一种dynamic动态类型,用户可以自定义属性并为其赋值,它会在运行时动态解析(例:可以作为变量.数组等各种对象传递并 ...
- ViewData ViewBag TempData
ViewData(一个字典集合类型):传入的key必须是string类型,可以保存任意对象信息,特点:它只会存在这次的HTTP的要求中而已,并不像session可以将数据带到下一个Http要求. ...
- MVC中 ViewBag、ViewData和TempData区别
MVC3中 ViewBag.ViewData和TempData的使用和区别 public dynamic ViewBag { get; } public ViewDataDictionary View ...
- ViewBag、ViewData和TempData使用方法、区别与联系
一.区别与联系 ViewData 和 TempData 都可以传递弱类型数据,区别如下:TempData 只在当前 Action 中有效,生命周期和 View 相同:保存在Session中,Contr ...
- MVC3中 ViewBag、ViewData和TempData的使用和区别(转载)
在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),ViewData 是 ...
- ASP.NET MVC传递Model到视图的多种方式总结(二)__关于ViewBag、ViewData和TempData的实现机制与区别
在ASP.NET MVC中,视图数据可以通过ViewBag.ViewData.TempData来访问,其中ViewBag 是动态类型(Dynamic),ViewData 是一个字典型的(Diction ...
- MVC3中 ViewBag、ViewData和TempData的使用和区别
在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),ViewData 是 ...
随机推荐
- Android - 自定义控件和属性(attr和TypedArray)
http://blog.csdn.net/zjh_1110120/article/details/50976027 1.attr format 取值类型 以ShapeView 为例 <decla ...
- 面向对象设计模式_生成器模式解读(Builder Pattern)
首先提出一个很容易想到应用场景: 手机的生产过程:手机有非常多的子件(部件),成千上万,不同品牌的手机的生产过程都是复杂而有所区别的,相同品牌的手机在设计上也因客户需求多样化,大到型号,小到颜色,是否 ...
- openstack-on-centos7之环境准备
centos7配置静态ip ifconfig查看网卡信息并获取到网卡的名称eth0s3 ifconfig 进入到网卡配置目录 cd /etc/sysconfig/network-scripts/ 找到 ...
- CSS画0.5px的线
今天遇到一个需求,画0.5px的线,查了以下资料,主要以scale方法为主.代码如下: /*0.5px上边框*/ .half_top_border_before:before{ content: &q ...
- CSS 简单归纳 -- 前端知识
CSS:cascading style sheets层叠样式表,用于美化页面 css的三种表现形式:1.行内样式(内嵌样式):结构的内部,即写在标签内的样式:写在标签的开始部分内部,style属性当中 ...
- javascript返回上一页的三种写法
window.history.go(-1); //返回上一页 window.history.back(); //返回上一页不会造成死循环 //如果要强行刷新的话就是:window.history.ba ...
- Css 基础知识(一)
1.Css概念 CSS 指层叠样式表 (Cascading Style Sheets)(级联样式表),Css是用来美化html标签的,相当于页面化妆. ◆样式表书写位置 2. 选择器 2.1.写法 选 ...
- C++调用IDL程序的做法(三)
作者:朱金灿 来源:http://blog.csdn.net/clever101 在C++调用IDL程序的做法(二)一文中介绍了如何动态创建IDLDrawWidgetControl的做法.假如我 ...
- Kubernetes+Docker的云平台在CentOS7系统上的安装
Kubernetes+Docker的云平台在CentOS7系统上的安装 1.运行VirtualBox5. 2.安装CentOS7系统. 注意:选择Basic Server类型 安装过程略. 3.修改计 ...
- HBuilder开发iPad程序不能全屏显示的解决方法
HBuilder开发iPad程序不能全屏显示的解决方法: targets选择HBuilder=>Deployment Info=> devices选择Universal即可