欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Asp.net MVC 中的TempData对象的剖析

程序员文章站 2022-10-04 13:44:56
另一篇文章,也对TempData 做了很详细的介绍,链接地址:https://www.jianshu.com/p/eb7a301bc536 。 MVC中的 TempData 可以在Controller之间进行传递,如果使用过了之后,不管是在View里使用,还是在controller里使用,再次获取就 ......

另一篇文章,也对tempdata 做了很详细的介绍,链接地址:   。

  mvc中的 tempdata 可以在controller之间进行传递,如果使用过了之后,不管是在view里使用,还是在controller里使用,再次获取就为null 。因此,我们可以总结tempdata对象有两个特点。

  1:可以在controller之间传递数据。

  2:只能使用一次,获取数据后,再次获取,得到的结果就是 null 。

直接看源码,就可以理解为什么会这样。

  Asp.net MVC 中的TempData对象的剖析

在controller调用action方法之前,调用了possiblyloadtempdata方法,执行方法之后调用了possiblysavetempdata方法

Asp.net MVC 中的TempData对象的剖析

这两个方法其实就是一个加载tempdata数据,一个保存tempdata数据。

然后我们看一下tempdata是什么

Asp.net MVC 中的TempData对象的剖析

看到源码之后,我们知道他是一个tempdatadictionary类型的属性。

然后我们去看 tempdata.load()和tempdata.save() 方法的源码

Asp.net MVC 中的TempData对象的剖析

Asp.net MVC 中的TempData对象的剖析

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

Asp.net MVC 中的TempData对象的剖析

Asp.net MVC 中的TempData对象的剖析

Asp.net MVC 中的TempData对象的剖析

然后我们在类 sessionstatetempdataprovider中找到这两个方法的具体实现,有三个重要的地方我做了红色标记。所以从源码中我们可以知道,它是保存在了session中,而且在session里面读取值,读取成功后会remove掉。这就解释了它的第一个特点:可以在controller之间传递数据。

  然后我们再看它为什么会有第二个特点:只能使用一次,获取数据后,再次获取,得到的结果就是 null 。别的不啰嗦,直接上关键点。

Asp.net MVC 中的TempData对象的剖析Asp.net MVC 中的TempData对象的剖析

Asp.net MVC 中的TempData对象的剖析

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

Asp.net MVC 中的TempData对象的剖析

Asp.net MVC 中的TempData对象的剖析

Asp.net MVC 中的TempData对象的剖析

arg_26_1就是个返回bool类型的委托,这个委托的执行结果 作为tempdata移除数据的条件。因为_initialkeys这个集合在索引器获取数据时移除了对应的key键,所以return !tempdata._initialkeys.contains(key) && !tempdata._retainedkeys.contains(key)就会返回true。所以就会从dictionary字典中移除数据。

所以这就是tempdata具有第二个特点的原因啦。

这里面还有一些细节不懂的沟通评论。