另一篇文章,也对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对象的剖析的更多相关文章

  1. Asp.net MVC中提交集合对象,实现Model绑定

    Asp.net MVC中的Model自动绑定功能,方便了我们对于request中的数据的处理, 从客户端的请求数据,自动地以Action方法参数的形式呈现.有时候我们的Action方法中想要接收数组类 ...

  2. Asp.net MVC中提交集合对象,实现Model绑定(转载)

    Asp.net MVC中的Model自动绑定功能,方便了我们对于request中的数据的处理, 从客户端的请求数据,自动地以Action方法参数的形式呈现.有时候我们的Action方法中想要接收数组类 ...

  3. asp.net mvc 之旅 —— 第五站 从源码中分析asp.net mvc 中的TempData

    在mvc的controller中,我们知道有很多的临时变量存放数据,比如说viewData,viewBag,还有一个比较特殊的tempData,关于前两个或许大家都明白, 基本上是一个东西,就是各自的 ...

  4. Asp.net MVC中三大描述对象之ActionDescriptor 以及继承类ReflectedControllerDescriptor

    ActionDescriptor抽象类中几个基本的属性: ControllerName:被描述的Controller名称,去除后缀Controller的名称.例如:HomeController则为Ho ...

  5. ASP.NET MVC中的两个Action之间值的传递--TempData

    一. ASP.NET MVC中的TempData 在ASP.NET MVC框架的ControllerBase中存在一个叫做TempData的Property,它的类型为TempDataDictiona ...

  6. [转]ASP.NET MVC中的两个Action之间值的传递--TempData

    本文转自:ASP.NET MVC中的两个Action之间值的传递--TempData 一. ASP.NET MVC中的TempData 在ASP.NET MVC框架的ControllerBase中存在 ...

  7. 在ASP.NET MVC 中获取当前URL、controller、action 、参数

    URL的获取很简单,ASP.NET通用:[1]获取 完整url (协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [2]获取 虚拟目录名 ...

  8. Asp.net MVC中 Controller 与 View之间的数据传递

    在ASP.NET MVC中,经常会在Controller与View之间传递数据 1.Controller向View中传递数据 (1)使用ViewData["user"] (2)使用 ...

  9. Asp.net mvc 中的 Controller 的激活

    Controller 激活是指根据路由系统解析出来的 Controller 的名称创建 控制器(Controller)的过程,这里的控制器泛指实现了 IController 接口的类型 激活过程中的核 ...

随机推荐

  1. vue的provide和inject特性

    由来 组件之间的通信可以通过props和$emit的方式进行通信,但是如果组件之间的关系非常复杂的话,通过以上的方式会很麻烦,并且程序会非常脆弱,没有建中性可言. 在==vue2.2.0 中新增pro ...

  2. (十六)c#Winform自定义控件-文本框哪里去了?-HZHControls

    官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...

  3. Selenium(五):CSS选择器(二)

    1. CSS选择器 1.1 选择语法联合使用 CSS selector的另一个强大之处在于:选择语法可以联合使用. html代码: <div id='bottom'> <div cl ...

  4. GO-切片拷贝以及赋值

    一.拷贝 package main import "fmt" func main(){ //copy函数,把一个切片copy到另一个切片之上 var a [1000]int=[10 ...

  5. Spring MVC的注解二

    概述 Spring从2.5版本开始引入注解,虽然版本不断变化,但是注解的特性一直被延续下来并不断进行扩展,这里就来记录一下Spring MVC中常用的注解,本文承接前文继续记录@PathVariabl ...

  6. GO基础之结构体

    1 .什么是结构体 GO语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型.结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 2.什么是实例化? Go结构体的 ...

  7. SQLServer之GROUP BY语句

    GROUP BY 语句 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 语法 SELECT column_name, aggregate_func ...

  8. javaweb 复习随笔

    js和jsp区分: js是一种脚本语言,常运行在前台和客户端交互,不会给服务器带来负担,可以更好的修饰静态页面 jsp可以说是servlet的一种,jsp会先翻译,翻译成Servlet执行,运行在服务 ...

  9. iOS事件传递和事件响应者链 20170810

    一.事件响应者链 事件传递和事件响应链 区别 事件的传递和响应的区别: 事件的传递是从上到下(父控件到子控件),事件的响应是从下到上(顺着响应者链条向上传递:子控件到父控件. 引出 当我们手指触摸屏幕 ...

  10. js 记一次带时间的表单提交报400错误

    写一个功能的时候,表单里不填时间提交的时候,数据就正常传到后台了,一填上时间就报400错误,看了后台时间的处理也没问题,看了前端时间控件返回的格式也对,但是就是一直报错, 把提交的数据打印出来也没发现 ...