在ASP.NET.MVC中,页面间和controller与View之间主要有以下几种小量数据传值方式,viewData,ViewBag,TempData,Session变量,这是微软提供给我们提供的多种传值方式,但选择越多越让人抓狂,这些技术每一种都有自己的优点和缺点
上面四种方式中,ViewData和ViewBag其实就是一种方式,ViewBag其实是对ViewData的封装,其内部其实是使用ViewData实现数据存储的,唯一的不同点是,ViewBag可以存储动态类型类型(decimal)的变量值,而ViewData只能存储String Key/Object Value字典数组,所以我们可以将这四种方式归为三大类,ViewBag和ViewData、TempData、Session
TempData 也是一个 String Key/Object Value 字典数组。 和 ViewData 与 ViewBag 不同的是其所存储 的数据对象的生命周期。 如果页面发生了跳转(Redirection),ViewBag 和 ViewData 中的值将不复存在, 但是 TempData 中的值依然还在。 换句话讲, ViewBag 和 ViewData 存储的值的生命周期只有在从 Controller 到 View 中, 而 TempData 中的数据不仅在从 Controller 到 View 中有效,在不同的 Action 之 间或者从一个页面跳转到另一页面(Controller to Controller)后依然有效
Session其实和ViewData类似,也是一个string key/object Value字典数组,但是,session是存储在客户端的cookie中,所以它的生命周期是最长的,但是,正因为起存储的客户端,所以必须确保没有敏感机密的信息存储其中
ViewData:
ViewData 是一个继承自 ViewDataDictionary 类的 Dictionary 对象。
ViewData 用来从 Controller 向对应的 View 传递值。
ViewData 的只在当前当前的请求中有效,生命周期和 View 相同,其值不能在多个请求中共享。
在重定向(redirection)后,ViewData 中存储的变量值将变为 null。
在取出 ViewData 中的变量值是,必须进行合适的类型转换(隐式或显式)和空值检查。
下面我们来看一个简单的例子,演示一下如何使用 ViewData 来从 Controller 向 View 传值。
ViewBa:
ViewBag 是一个动态类型变量(dynamic),这是 C# 4.0 引入的新特性,变量类型会在运行时进行解 析
ViewBag 基本上是 ViewData 的包装,也是用来从 Controller 向 View 来传递值的。
ViewBag 也只在当前的请求中有效。
在重定向(redirection)后,ViewBag 中存储的变量值将变为 null
因为 ViewBag 是动态类型,所以我们在取得其值时,不需要进行类型转换。
同样,我们通过一个简单的例子来演示一下如何利用 ViewBag 从 Controller 向 View 传递数据
控制器传值到页面
页面获取值
赋值
页面显示结果
ViewBag 更适合从 Controller 向 View 传递复杂对象数据时使用, 因为取出存储在其中的数据变 量时无需进行类型转换
TempData:
TempData 是一个继承自 TempDataDictionary 类的字典对象,它默认情况下是基于 Session 存储机制 之上的。(备注: 你也可以让你的 TempData 基于其他存储机制之上, 我们可以提供我们自定义的 ITempDataProvider 来完成,具体可以参见: Session-less Controllers and TempData in ASP.NET MVC)
TempData 是用来在多个 Actions 或从当前请求向子请求, 页面发生了重定向(Redirection)时传递共 享数据。
只有在目标视图(View)完全加载后才有效。
在取出 TempData 存储的变量值时,必须进行合适的类型转换(隐式或显式)和空值检查
Session:
Session 也是 ASP.NET MVC 程序传递值的一种方式,但与 TempData 不同,用户的整个会话中 Session 都不会过期
Session 在同一用户会话过程中的所有请求中有效,比如,刷新页面
Session 中的值也需要进行类型转换(隐式或显式)和非空检查
Session 的生命周期是最长的,但是它默认使用的是 Cookies 来存储数据,所以使用的时候必须注意数据 保密的问题。