MVC5-8 ViewData、ViewBag、TempData分析

MVC中Contoller与视图的数据传输

后台的值显示到界面上,我们有几种方式呢。MVC给我们提供了ViewData、ViewBag、TempData、Model这几种方式,当然我们也可以用ajax获取,

本文对前三种进行源码上的分析。

ViewData

ViewData是一个ViewDataDictionary类型的字典

之前说过视图其实也是类,继承自WebViewPage。那么一堆都解释的通了,我们在返回视图的时候ViewData已经被塞入到了这个类中。我们在视图上根据key拿到value是再正常不过的事情了,这一点我想可以用代码来说明。请看下图2

图 1

图 2

ViewBag

相比较ViewData,其实我们更喜欢用ViewBag,它是动态类型允许我们给各种类型的值,而且使用方便。比ViewData的出场率要高,那么ViewBag是如何做到的呢。在上图1的时候并没有看到填充ViewBag,其实ViewBag看起来很酷,内部很简单。

它是DynamicViewDataDictionary类型的动态类型,图1可以看到它的设置值与取值的方法,其实它的背后还是ViewData,图2则直观,这个ViewBag是WebViewPage中的属性,它Get的时候拿到最新的ViewData然后返回。

图 1

图 2

TempData

在ViewData图1也没有看到填充TempData,难道它背后也是Viewdata?No!

我们首先要分析,TempData直译就是临时数据,在实际中也是只可以取一次,第二次就取不到了。这可以用什么做到呢,Session可以做到,存在服务端的数据。那么只能取一次为什么呢?~~这个,取一次后就删除呗。在图1可以看到,Controller的action在执行前后会执行PossiblyLoadTempData与PossiblySaveTempData方法。图2则是两个方法的调用,可以看到有一个load和Save方法,里面又调用了tempDataProvider的LoadTempData和SaveTempData。关于是使用session做到的,可以用调试来证明,请看图3,

图 1

图 2

图 3

图4是SessionStateTempDataProvider类的内部方法,可以看到LoadTempData方法拿到了当前context的session,然后拿到数据后Remove,SaveTempData方法如果values有值直接覆盖否则如果session中有值的话就清空之前的值

图 4

时间: 2024-10-26 09:04:20

MVC5-8 ViewData、ViewBag、TempData分析的相关文章

MVC页面常见三种传值方式——ViewData,ViewBag,TempData

最近接触MVC代码多了,发现了很多新东西,比如页面传值.发现了MVC里面原来有这么多对象可以用来传值,最近两天用到了ViewData和ViewBag,之后又关联到了TempData,现在列个表格比较下: 用过之后,个人感觉还是ViewBag最好用,直接属性赋值就可以了,但是ViewData和TempData又有它们的优势,在使用的时候,可以根据要传递数据的大小,是从Controller向Views里面传递数据,还是Controller传递数据...综合考虑各种因素再做决定吧. 除了这三种比较常见

【MVC4 之 ViewData ViewBag TempData】

ViewData (一个字典集合类型):传入的key必须是string类型,可以保存任意对象信息,特点:它只会存在这次的HTTP的要求中而已,并不像session可以将数据带到下一个Http要求. ViewData.Model:由于viewdata在传入的时候属于弱类型,也就是在ViewData里特定键值的类型永远是object通用对象类型,传给view使用之后,还必须通过转型才能进一步使用,不太方便. eg: public ActionResult Index(){ var data=GetD

ViewData ViewBag TempData

ViewData(一个字典集合类型):传入的key必须是string类型,可以保存任意对象信息,特点:它只会存在这次的HTTP的要求中而已,并不像session可以将数据带到下一个Http要求. ViewData.Model:由于viewdata在传入的时候属于弱类型,也就是在ViewData里特定键值的类型永远是object通用对象类型,传给view使用之后,还必须通过转型才能进一步使用,不太方便. eg: public ActionResult Index(){ var data=GetDa

MVC3中 ViewBag、ViewData和TempData的使用和区别

在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),ViewData 是一个字典型的(Dictionary).它们的定义如下: public dynamic ViewBag { get; } public ViewDataDictionary ViewData { get; set; } 控制器中代码: public ActionResult Index() { Vie

MyMvc: TempData ViewData ViewBag

TempData: 创建或更新一次,可访问一次,随即销毁(为是剪切不复制): ViewData: 键值对结构: ViewBag: 使用dynamic控制器,封装ViewData: ViewData与ViewBag异同: 同:一般情况下访问的数据是相同的: 异:1.使用语法:ViewData为字典语法,ViewBag类似属性访问: 2.访问范围:ViewBag不可以访问非有效标识符的ViewData键值对(比如Key带空格): 3.作为参数:因ViewBag使用dynamic,其值为动态类型,而编

MVC3中 ViewBag、ViewData和TempData的使用和区别(转发:汴蓝)

MVC3中 ViewBag.ViewData和TempData的使用和区别 在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),ViewData 是一个字典型的(Dictionary).它们的定义如下: public dynamic ViewBag { get; } public ViewDataDictionary ViewData { get; set; } 控制器

Mvc中ViewBag、ViewData、TempData如何使用

对于我初学者来说,Mvc有很多都是我所迷惑的,也是我了解后所痴迷的.废话不多说,来谈谈我今天对Mvc这几个常用的对象的理解吧,这里面只简明概要叙述 ViewBag 获取动态视图数据字典 作用:给视图传递数据,不需要转换类型,由系统动态解析,比ViewData执行性能要差 ViewData   获取或设置视图数据的字典         给视图传递数据,需要转换成相应的类型,编写没有ViewBag方便,可读性强 TempData     临时数据的字典   给控制器或视图传递数据,需要和ViewDa

ViewBag、ViewData和TempData使用方法、区别与联系

一.区别与联系 ViewData 和 TempData 都可以传递弱类型数据,区别如下:TempData 只在当前 Action 中有效,生命周期和 View 相同:保存在Session中,Controller每次执行请求的时候,会从Session中先获取TempData,而后清除Session,获取完TempData数据,虽然保存在内部字典对象中,但是其集合中的每个条目访问一次后就从字典表中删除.因此TempData 的数据至多只能经过一次Controller传递,并且每个元素至多只能被访问一

ASP.NET MVC4中ViewBag、ViewData和TempData的使用和区别

一.说明 本文章主要是讲解asp.net mvc中ViewBag.ViewData和TempData的使用和区别,ViewBag.ViewData和TempData常常用于将action方法中的数据传递到view界面. 从MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),ViewData 是一个字典型的(Dictionary). 二.区别 ViewBag 不再是字典的键

ASP.NET MVC ViewData/ViewBag 简单小结

近期在项目中遇到一个问题,就是用ViewBag.Model存储匿名对象传递给View,但是需要根据条件给匿名对象添加属性,这个可真心不易,Google了一下发现很多方案都是动态编译神马的,感觉好高大上,最后也没采用,因为不知道动态编译的性能消耗大不大. 最后是自己简单研究了一下,在ViewBag.Model中存储了Dictionary<string, object>,在View通过Model[key]的方式可以正常读取相应的值,在此对ViewData和ViewBag的使用进行一个简单的小结:1