ViewData、ViewBag、TempData、Session的区别与联系

                  ViewData、ViewBag、TempData、Session的区别与联系
 开发工具与关键技术:Visual Studio2015   作者:北道海棠         撰写时间:2019.05.06

在ASP.NET MVC中,页面间和Controller与View之间主要有以下几种小量数据传值方式, ViewData、 ViewBag、TempData、Session 变量。微软提供给了我们这么多传值方法,但选择越多越就让人抓狂,这些技术每一种都有自己的优点和缺点,我应该何时使用哪一种传值方式呢?这也很让人抓狂。
上面的这四种方法中,总的来说我们可以将其分为三大类,ViewData 和 ViewBag 其实是一回事,然后到TempData,再到Session,这几类都有有一个相同的功能,那便是数据存储啦。
ViewBag 其实是对 ViewData 的封装, 其内部其实是使用 ViewData 实现数据存储的。唯一的不同点是,ViewBag 可以存储动态类型(dynamic)的变量 值, 而 ViewData 只能存储 String Key/Object Value 字典数组。
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 是存储在客户端的 Cookies 中,所以它的生命周期是最长的。 但正因为其存储的客户端, 所以必须确保 没有敏感机密的信息存储其中
ViewData
 ViewData 是一个继承自 ViewDataDictionary 类的 Dictionary 对象。
 ViewData 用来从 Controller 向对应的 View 传递值。
 ViewData 的只在当前的请求中有效,生命周期和 View 相同,其值不能在多个请求中共享
 在重定向(redirection)后,ViewData 中存储的变量值将变为 null
 在取出 ViewData 中的变量值是,必须进行合适的类型转换(隐式或显式)和空值检查。
 ViewData 是一个特殊的字典类的名称,我们可以用标准的字典语法进行修改或赋值,例如:ViewData[“Name”] = “Jack”;
下面我们简单的说明一下,使用 ViewData 如何从 Controller 向 View 传值。
首先我们在控制器上定义一个方法,在方法体里面写上一个变量 ViewData[“Message”] = “message from ViewData”; 然后给这个方法添加视图,再到视图中取出这个变量,如:

,@ViewData[“Message”].ToString(),
。执行后,将会在浏览器中看到 message from ViewData
注:因为我们存储的是一个简单类型的变量值,所以我们在从 ViewData 中取出变量 Message 时并没有对其进行类型转换。假如存储的是复杂对象,在取出时必须进行类型转换。
综上看来, ViewData 更适合从 Controller 向 View 传递简单对象数据时使用。
ViewBag
 ViewBag 是一个动态类型变量(dynamic),这是 C# 4.0 引入的新特性,变量类型会在运行时进行解析。
 ViewBag 基本上是 ViewData 的包装,也是用来从 Controller 向 View 来传递值的
 ViewBag 也只在当前的请求中有效
 在重定向(redirection)后,ViewBag 中存储的变量值将变为 null
 因为 ViewBag 是动态类型,所以我们在取得其值时,不需要进行类型转换
 ViewBag 是 asp.net mvc3 中对 ViewData 的一种动态封装,用法更方便。例如他的赋值方法为: ViewBag.Name = “Jack”;
同样,我们通过简单的例子来说明一下如何利用 ViewBag 从 Controller 向 View 传递数据
首先我们在控制器上定义一个方法,在方法体里面写上一个变量 ViewBag.Message = “message from ViewBag”; 然后给这个方法添加视图,再到视图中取出这个变量,如:
@ ViewBag.Message
,最后,执行后,将会在浏览器中看到 message from ViewBag
综上, ViewBag 更适合从 Controller 向 View 传递复杂对象数据时使用, 因为取出存储在其中的数据变量时无需进行类型转换。
ViewBag 和 ViewData 的区别
虽说用 ViewBag 来代替 ViewData 使用着更快捷,但是相对于 ViewData 来说,ViewBag 还 是有一些不能用的地方:
1.ViewBag 要访问的必须是一个有效的标识符,否则无效。比如:ViewData[“Query Income”] 就不能使用 ViewBag 来访问。因为“Query Income”中有无效的 C#标识符 空格。
2.动态值不能作为一个参数传递给扩展方法。因为 C#为了选择正确的扩展方法规定必须标 明每一个参数的类型。如果参数中有任何一个参数是动态的就无法通过编译。比如:@Html.TextBox(“Name”, ViewBag.Name)就会编译失败
解决方法:
① 将 ViewBag.Name 替换为 ViewData[“Name”];
② 把 ViewBag.Name 替换为一个具体类型的参数:(string) ViewBag.Name;
TempData
 TempData 是一个继承自 TempDataDictionary 类的字典对象,它默认情况下是基于 Session 存储机制 之上的。(备注: 你也可以让你的 TempData 基于其他存储机制之上, 我们可以提供我们自定义的ITempDataProvider 来完成,具体可以参见: Session-less Controllers and TempData in ASP.NET MVC)。
 TempData 是用来在多个 Actions 或从当前请求向子请求, 页面发生了重定向(Redirection)时传递共享数据。
 只有在目标视图(View)完全加载后才有效。
 在取出 TempData 存储的变量值时,必须进行合适的类型转换(隐式或显式)和空值检查。
下面,我们透过一个例子来演示一下如何在两个 Action 方法中传递数据
首先,创建一个客户 Model 类,如下图
在这里插入图片描述
然后,在 Controller 中加入如下代码:
在这里插入图片描述
最后,创建一个强类型视图(Strong Typed View)来显示客户信息
在这里插入图片描述
最后,执行程序,浏览器中会显示如下结果:
 Customer ID:1001
 Customer Code:100101
 Customer Amount:100
综上, TempData 主要用在需要在多个 Actions 或者页面重定向时共享传递数据时使用。
Session
 Session 也是 ASP.NET MVC 程序传递值的一种方式,但与 TempData 不同,用户的整个会话中 Session都不会过期。
 Session 在同一用户会话过程中的所有请求中有效,比如,刷新页面。
 Session 中的值也需要进行类型转换(隐式或显式)和非空检查。
当我们仍然使用上面的这个例子,只是我们将TempData 变成 Session也可以得到同样的结果。
Session 的生命周期是最长的,但是它默认使用的是 Cookies 来存储数据,所以使用的时候必须注意数据保密的问题。
综上, Session 主要用在需要在多个 Controllers, Actions and Views 共享数据(非敏感数据)时使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值