zoukankan      html  css  js  c++  java
  • MVC5-8 ViewData、ViewBag、TempData分析

    MVC中Contoller与视图的数据传输

    后台的值显示到界面上,我们有几种方式呢。MVC给我们提供了ViewData、ViewBag、TempData、Model这几种方式,当然我们也可以用ajax获取,

    本文对前三种进行源码上的分析。

    ViewData

    ViewData是一个ViewDataDictionary类型的字典

    image

    之前说过视图其实也是类,继承自WebViewPage。那么一堆都解释的通了,我们在返回视图的时候ViewData已经被塞入到了这个类中。我们在视图上根据key拿到value是再正常不过的事情了,这一点我想可以用代码来说明。请看下图2

    图 1

    image

    图 2

    image

    ViewBag

    相比较ViewData,其实我们更喜欢用ViewBag,它是动态类型允许我们给各种类型的值,而且使用方便。比ViewData的出场率要高,那么ViewBag是如何做到的呢。在上图1的时候并没有看到填充ViewBag,其实ViewBag看起来很酷,内部很简单。

    它是DynamicViewDataDictionary类型的动态类型,图1可以看到它的设置值与取值的方法,其实它的背后还是ViewData,图2则直观,这个ViewBag是WebViewPage中的属性,它Get的时候拿到最新的ViewData然后返回。

    图 1

    image

    图 2

    image

    TempData

    在ViewData图1也没有看到填充TempData,难道它背后也是Viewdata?No!

    我们首先要分析,TempData直译就是临时数据,在实际中也是只可以取一次,第二次就取不到了。这可以用什么做到呢,Session可以做到,存在服务端的数据。那么只能取一次为什么呢?~~这个,取一次后就删除呗。在图1可以看到,Controller的action在执行前后会执行PossiblyLoadTempData与PossiblySaveTempData方法。图2则是两个方法的调用,可以看到有一个load和Save方法,里面又调用了tempDataProvider的LoadTempData和SaveTempData。关于是使用session做到的,可以用调试来证明,请看图3,

    图 1

    image

    图 2

    image

    图 3

    image

    图4是SessionStateTempDataProvider类的内部方法,可以看到LoadTempData方法拿到了当前context的session,然后拿到数据后Remove,SaveTempData方法如果values有值直接覆盖否则如果session中有值的话就清空之前的值

    图 4

    image

  • 相关阅读:
    Windows Svr 2008 Ent R2 性能计数器显示不全
    SQL Server的keepalive
    C语言字符串常见操作-strcpy、strlen、strcat和strcmp实现
    计算机中数据的编码方式
    OC中的排序方法
    关于C语言内存对齐
    C语言内存管理总结-野指针
    Objective-C基础学习笔记(九)-Foundation
    Objective-C基础学习笔记(八)-内存管理-autorelease使用-property创建对象的内存管理-循环引用的内管管理
    Objective-C基础学习笔记(七)-分类-Category-类的本质-load和+initialize方法-SEL数据
  • 原文地址:https://www.cnblogs.com/LiangSW/p/5943309.html
Copyright © 2011-2022 走看看