Asp.net MVC 中的TempData对象的剖析
另一篇文章,也对TempData 做了很详细的介绍,链接地址:https://www.jianshu.com/p/eb7a301bc536 。
MVC中的 TempData 可以在Controller之间进行传递,如果使用过了之后,不管是在View里使用,还是在controller里使用,再次获取就为Null 。因此,我们可以总结TempData对象有两个特点。
1:可以在Controller之间传递数据。
2:只能使用一次,获取数据后,再次获取,得到的结果就是 Null 。
直接看源码,就可以理解为什么会这样。

在Controller调用Action方法之前,调用了PossiblyLoadTempData方法,执行方法之后调用了PossiblySaveTempData方法

这两个方法其实就是一个加载TempData数据,一个保存TempData数据。
然后我们看一下TempData是什么

看到源码之后,我们知道他是一个TempDataDictionary类型的属性。
然后我们去看 TempData.Load()和TempData.Save() 方法的源码


通过源码我们知道,他是通过ITempDataProvider的LoadTempData方法来加载数据,SaveTempData方法来保存数据。因为ITempDataProvider是一个接口,所以我们要找到具体的实现类,所以我们就要找到调用这个Load和Save方法时传入的是一个什么类型的值。



然后我们在类 SessionStateTempDataProvider中找到这两个方法的具体实现,有三个重要的地方我做了红色标记。所以从源码中我们可以知道,它是保存在了Session中,而且在Session里面读取值,读取成功后会Remove掉。这就解释了它的第一个特点:可以在Controller之间传递数据。
然后我们再看它为什么会有第二个特点:只能使用一次,获取数据后,再次获取,得到的结果就是 Null 。别的不啰嗦,直接上关键点。



在用索引器获取到数据时,它都把HashSet<string>集合的 _initialKeys移除掉。然后我们再回头去看TempData的Save方法。我再把源代码截图一次



arg_26_1就是个返回Bool类型的委托,这个委托的执行结果 作为TempData移除数据的条件。因为_initialKeys这个集合在索引器获取数据时移除了对应的key键,所以return !tempData._initialKeys.Contains(key) && !tempData._retainedKeys.Contains(key)就会返回true。所以就会从Dictionary字典中移除数据。
所以这就是TempData具有第二个特点的原因啦。
这里面还有一些细节不懂的沟通评论。
Asp.net MVC 中的TempData对象的剖析的更多相关文章
- Asp.net MVC中提交集合对象,实现Model绑定
Asp.net MVC中的Model自动绑定功能,方便了我们对于request中的数据的处理, 从客户端的请求数据,自动地以Action方法参数的形式呈现.有时候我们的Action方法中想要接收数组类 ...
- Asp.net MVC中提交集合对象,实现Model绑定(转载)
Asp.net MVC中的Model自动绑定功能,方便了我们对于request中的数据的处理, 从客户端的请求数据,自动地以Action方法参数的形式呈现.有时候我们的Action方法中想要接收数组类 ...
- asp.net mvc 之旅 —— 第五站 从源码中分析asp.net mvc 中的TempData
在mvc的controller中,我们知道有很多的临时变量存放数据,比如说viewData,viewBag,还有一个比较特殊的tempData,关于前两个或许大家都明白, 基本上是一个东西,就是各自的 ...
- Asp.net MVC中三大描述对象之ActionDescriptor 以及继承类ReflectedControllerDescriptor
ActionDescriptor抽象类中几个基本的属性: ControllerName:被描述的Controller名称,去除后缀Controller的名称.例如:HomeController则为Ho ...
- ASP.NET MVC中的两个Action之间值的传递--TempData
一. ASP.NET MVC中的TempData 在ASP.NET MVC框架的ControllerBase中存在一个叫做TempData的Property,它的类型为TempDataDictiona ...
- [转]ASP.NET MVC中的两个Action之间值的传递--TempData
本文转自:ASP.NET MVC中的两个Action之间值的传递--TempData 一. ASP.NET MVC中的TempData 在ASP.NET MVC框架的ControllerBase中存在 ...
- 在ASP.NET MVC 中获取当前URL、controller、action 、参数
URL的获取很简单,ASP.NET通用:[1]获取 完整url (协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [2]获取 虚拟目录名 ...
- Asp.net MVC中 Controller 与 View之间的数据传递
在ASP.NET MVC中,经常会在Controller与View之间传递数据 1.Controller向View中传递数据 (1)使用ViewData["user"] (2)使用 ...
- Asp.net mvc 中的 Controller 的激活
Controller 激活是指根据路由系统解析出来的 Controller 的名称创建 控制器(Controller)的过程,这里的控制器泛指实现了 IController 接口的类型 激活过程中的核 ...
随机推荐
- vue的provide和inject特性
由来 组件之间的通信可以通过props和$emit的方式进行通信,但是如果组件之间的关系非常复杂的话,通过以上的方式会很麻烦,并且程序会非常脆弱,没有建中性可言. 在==vue2.2.0 中新增pro ...
- (十六)c#Winform自定义控件-文本框哪里去了?-HZHControls
官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...
- Selenium(五):CSS选择器(二)
1. CSS选择器 1.1 选择语法联合使用 CSS selector的另一个强大之处在于:选择语法可以联合使用. html代码: <div id='bottom'> <div cl ...
- GO-切片拷贝以及赋值
一.拷贝 package main import "fmt" func main(){ //copy函数,把一个切片copy到另一个切片之上 var a [1000]int=[10 ...
- Spring MVC的注解二
概述 Spring从2.5版本开始引入注解,虽然版本不断变化,但是注解的特性一直被延续下来并不断进行扩展,这里就来记录一下Spring MVC中常用的注解,本文承接前文继续记录@PathVariabl ...
- GO基础之结构体
1 .什么是结构体 GO语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型.结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 2.什么是实例化? Go结构体的 ...
- SQLServer之GROUP BY语句
GROUP BY 语句 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 语法 SELECT column_name, aggregate_func ...
- javaweb 复习随笔
js和jsp区分: js是一种脚本语言,常运行在前台和客户端交互,不会给服务器带来负担,可以更好的修饰静态页面 jsp可以说是servlet的一种,jsp会先翻译,翻译成Servlet执行,运行在服务 ...
- iOS事件传递和事件响应者链 20170810
一.事件响应者链 事件传递和事件响应链 区别 事件的传递和响应的区别: 事件的传递是从上到下(父控件到子控件),事件的响应是从下到上(顺着响应者链条向上传递:子控件到父控件. 引出 当我们手指触摸屏幕 ...
- js 记一次带时间的表单提交报400错误
写一个功能的时候,表单里不填时间提交的时候,数据就正常传到后台了,一填上时间就报400错误,看了后台时间的处理也没问题,看了前端时间控件返回的格式也对,但是就是一直报错, 把提交的数据打印出来也没发现 ...