另一篇文章,也对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. PHP实现微信提现(企业付款到零钱)

    怎么开通企业付款到零钱? 有的商户号的产品中心是没有这个功能的,不过,该功能的pid(product id)是5,只要随便进去某一个产品,在地址栏把pid改为5. 即可进入该功能页面,进行开通,不过要 ...

  2. 【CF908D】New Year and Arbitrary Arrangement

    Problem Description 给定三个数 \(k,pa,pb\) ,每次有 \(\frac{pa}{pa+pb}\) 的概率往后面添加一个 a,有 \(\frac{pb}{pa+pb}\) ...

  3. SpringCloud的入门学习之深入理解Eureka注册中心

    1.Eureka 注册中心三种角色. 答:a.Eureka Server,注册中心,通过 Register.Get.Renew 等接口提供服务的注册和发现. b.Application Service ...

  4. 一起学SpringMVC之注解

    概述 SpringMVC不仅提供了Xml的配置方式,还提供了注解的方式来声明一个Controller,本文属于SpringMVC的入门级内容,仅供学习分享使用,如有不足之处,还请指正. SpringM ...

  5. js|jq获取兄弟节点,父节点,子节点

    08.19自我总结 js|jq获取兄弟节点,父节点,子节点 一.js var parent = test.parentNode; // 父节点 var chils = test.childNodes; ...

  6. 用两种以上的 方式实现一个方法或者对象,调用时打印"你好xx",已定义的代码不能做修改,自己编译的不能出现"你好"? (Javasctript)

    先上代码 const obj = { say(){ Array.from(arguments).forEach(item=>{ console.log(`${this.str} ${item}` ...

  7. curl的使用指南

    一.查看网页源码 直接在curl命令后加上网址,就可以看到网页源码.我们以网址www.sina.com为例(选择该网址,主要因为它的网页代码较短): $ curl www.sina.com ​   M ...

  8. 你以为的Jquery选择器是什么样子的?

    $("#myELement")    选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myElement所以得到的是唯一的元素  $("d ...

  9. Linux达人计划(一)

    这时慕课网的Linux基础教学 http://www.imooc.com/view/175 好记性不如烂笔头.一般来说看视频只看不做是很难学好学扎实. 趁着每一节都有采纳的一些笔记.现在对它进行一些归 ...

  10. AcWing 801. 二进制中1的个数

    网址 https://www.acwing.com/solution/AcWing/content/2066/ 题目描述给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个数. 算法1主要 ...