• 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具有第二个特点的原因啦。

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

  • 相关阅读:
    iOS 代码让手机震动一下
    iOS开发 --制作圆形的头像(UIImage)
    JAVA基本数据类型和引用数据类型的区别
    jquery基础
    JS基础
    JAVA异常详解
    单例模式详解及java常用类
    JAVA基础之字符串和面向对象
    我的第一篇博客 初识动画,飞机行小动画
    GCD系列:调度组(dispatch_group)
  • 原文地址:https://www.cnblogs.com/xiaoZhang521/p/11304409.html
Copyright © 2020-2023  润新知