MVC3中viewdata,tempdata,viewbag总结

49 篇文章 0 订阅

MVC3中的Tempdata,viewdata,viewbag的区别与联系

------------------------------------------------------------------------------------------------------------------

名词解释:

1、ViewData

  • ViewData的生命周期和View相同, 只对当前View有效。

2、TempData

  • TempData保存在Session中, Controller每次执行请求的时候会从Session中获取TempData并删除Session。
  • 获取完TempData数据后虽然保存在内部的字典对象中。
  • 但是TempData集合的每个条目访问一次后就从字典表中删除。
  • 也就是说TempData的数据至多只能经过一次Controller传递。
  • 并且每个元素至多只能访问一次。

 

3、ViewBag

  • ViewBag 是 MVC3 新增语法,ViewBag 不再是字典的键值对结构,而是 dynamic 动态类型,它会在程序运行的时候动态解析。

----------------------------------------------------------------------------------------------------------------

下面我来讲讲他们之间的区别:

  • ViewData和TempData是字典类型,赋值方式用字典方式, ViewData["myName"]
  • ViewBag是动态类型,使用时直接添加属性赋值即可 ViewBag.myName。
  • ViewBag和ViewData只在当前Action中有效,等同于View
  • TempData可以通过转向继续使用,因为它的值保存在Session中。
  • 但TempData只能经过一次传递,之后会被系统自动清除.
  • ViewData和ViewBag 中的值可以互相访问,因为ViewBag的实现中包含了ViewData

他们之间的细节比较:

1.ViewData和ViewBag

ViewBag和ViewData生命周期相同,仅对当前View有效,不同的是ViewBag的类型不再是字典的键值对结构,而是dynamic动态类型。

 

2.TempData

TempData保存在Session中,Controller每次执行请求的时候,会从Session中先获取TempData,而后清除Session,获取完TempData数据,虽然保存在内部字典对象中,但是其集合中的每个条目访问一次后就从字典表中删除。

具体代码层面,TempData获取过程是通过SessionStateTempDataProvider.LoadTempData方法从ControllerContext的Session中读取数据,而后清除Session,故TempData只能跨Controller传递一次。

如果我们想读取TempData的值但是又不让它被删除,可以使用TempData.Peek("Key")方法。如果想再保持一次TempData里面的值,可以使用TempData.Keep("Key").

 

实例讲解:

虽然ViewData和TempData都可以传递弱类型数据,但是两者的使用是有区别的:
ViewData的生命周期和View相同, 只对当前View有效.TempData保存在Session中, Controller每次执行请求的时候会从Session中获取TempData并删除Session, 获取完TempData数据后虽然保存在内部的字典对象中,但是TempData集合的每个条目访问一次后就从字典表中删除. 也就是说TempData 的数据至多只能经过一次Controller传递.

示例1:首先我们会创建一个TestController控制器,控制器有如下三个方法,视图主要的工作还是输出TempData的值;

在地址栏输入'../test/index',再次输入地址'../test/one'.我们可以在one视图中输出TempData['val']的值,但是我们再次在地址栏输入'../test/two',将会报错"未将对象引用到实例",说明TempData已经被销毁.

实例2:

当我们在地址栏输入'../test/index'后,我们再次在地址栏输入'../test/one'时,将会报错"未将对象引用到实例",说明TempData在已经在"string val =TempData["val"].ToString()时被销毁了.

实例3:

但我们输入'../test/index'是,我们从firebug中可以看出

可能有人会问不会报错吗?因为当我们读取TempData数据后,会自动销毁TempData.这点儿是没有错,但是mvc2有一个奇特的地方,mvc2.0只有将RedirectResult类或RedirectToRouteResult类当成ActionResult类时,才会强制保留TempData。除此之外,如果存在使用读取TempData的键值,默认就会在当次网页请求中将TempData清除.但是,如果只设定了TempData的值而没有读取的行为,TempData还会被保存到下一个页面中执行.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值