MVC中Contoller与视图的数据传输

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

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

ViewData

ViewData是一个ViewDataDictionary类型的字典

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

图 1

图 2

ViewBag

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

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

图 1

图 2

TempData

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

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

图 1

图 2

图 3

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

图 4

MVC5-8 ViewData、ViewBag、TempData分析的更多相关文章

  1. 【MVC4 之 ViewData ViewBag TempData】

    ViewData (一个字典集合类型):传入的key必须是string类型,可以保存任意对象信息,特点:它只会存在这次的HTTP的要求中而已,并不像session可以将数据带到下一个Http要求. V ...

  2. ViewData ViewBag TempData

    ViewData(一个字典集合类型):传入的key必须是string类型,可以保存任意对象信息,特点:它只会存在这次的HTTP的要求中而已,并不像session可以将数据带到下一个Http要求.   ...

  3. MVC3中 ViewBag、ViewData和TempData的使用和区别

    在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),ViewData 是 ...

  4. ViewBag、ViewData和TempData的使用和区别

    在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData. MVC3中保留了ViewData的使用. ViewBag 是动态类型(dynamic),ViewData ...

  5. MVC3+中 ViewBag、ViewData和TempData的使用和区别

    在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),ViewData 是 ...

  6. MVC中 ViewBag、ViewData和TempData区别

    MVC3中 ViewBag.ViewData和TempData的使用和区别 public dynamic ViewBag { get; } public ViewDataDictionary View ...

  7. MVC3中 ViewBag、ViewData和TempData的使用和区别(不是自己写的)

    (网上抄的,并未消化)在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic) ...

  8. MVC3中 ViewBag、ViewData和TempData的使用和区别(转发:汴蓝)

    MVC3中 ViewBag.ViewData和TempData的使用和区别   在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewD ...

  9. ViewBag、ViewData和TempData使用方法、区别与联系

    一.区别与联系 ViewData 和 TempData 都可以传递弱类型数据,区别如下:TempData 只在当前 Action 中有效,生命周期和 View 相同:保存在Session中,Contr ...

  10. MVC3中 ViewBag、ViewData和TempData的使用和区别(转载)

    在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),ViewData 是 ...

随机推荐

  1. 翻译qmake文档(二) Getting Started

    翻译qmake文档 目录 原英文文档: http://qt-project.org/doc/qt-5/qmake-tutorial.html         本教程教讲授qmake基础知识.这个手册里 ...

  2. SQLServer(MSSQL)、MySQL、SQLite、Access相互迁移转换工具 DB2DB v1.2

    最近公司有一个项目,需要把原来的系统从 MSSQL 升迁到阿里云RDS(MySQL)上面.为便于测试,所以需要把原来系统的所有数据表以及测试数据转换到 MySQL 上面.在百度上找了很多方法,有通过微 ...

  3. mvc5+ef6+Bootstrap 项目心得--创立之初

    1.mvc5+ef6+Bootstrap 项目心得--创立之初 2.mvc5+ef6+Bootstrap 项目心得--身份验证和权限管理 3.mvc5+ef6+Bootstrap 项目心得--WebG ...

  4. 关于Node.js的httpClieint请求报错ECONNRESET的原因和解决措施

    背景说明 最近在工作项目中有下面一个场景: 使用Node.js的express框架实现了一个文件系统服务器端,其中有个API用于客户端上传文件.客户端使用Node.js的HttpClient来调用服务 ...

  5. jq 修改input 标签的值

    <input type="number" id="output" placeholder="0" /> jq使用方法 $('#o ...

  6. Web Api单元测试写法

    例如我们在Web Api项目中有个Controller public class SomeController : ApiController { public HttpResponseMessage ...

  7. Java学习之ConcurrentHashMap实现一个本地缓存

    ConcurrentHashMap融合了Hashtable和HashMap二者的优势. Hashtable是做了线程同步,HashMap未考虑同步.所以HashMap在单线程下效率较高,Hashtab ...

  8. openldap+phpadmin的搭建安装

    1.概念介绍 LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP.它是基于X.500标准的,但是简单多了并且可以根据 ...

  9. Android 判断当前屏幕是横屏还是竖屏

       记录学习 /**  * 返回当前屏幕是否为竖屏.  * @param context  * @return 当且仅当当前屏幕为竖屏时返回true,否则返回false.  */  public s ...

  10. 模板题 codevs 1993 草地排水 想学习的请看链接

    不能再水的题了. Dinic算法,比EK更快. 想要学习请看链接   https://comzyh.com/blog/archives/568/ 并附上我的模板(其实和comzyh大神的一样) #in ...