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. TinyFrame升级之三:逻辑访问部分

    在上一篇,我们打造了自己的数据访问部分,这篇,我们准备讲解如何打造逻辑访问部分. 在上一篇中,我们利用Repository模式构建了基于泛型的操作合集.由于这些操作的合集都是原子性的操作,也就是针对单 ...

  2. 使用LocalBroadcastManager

    Android中BroadcastReceiver主要用途有 发送通知,更新UI或者数据,应用程序间相互通信,监听系统状态(比如开机,网络等) Android中BroadcasetReceiver的注 ...

  3. SELECT (Transact-SQL)

    从数据库中检索行,并允许从 SQL Server 中的一个或多个表中选择一个或多个行或列.  虽然 SELECT 语句的完整语法较复杂,但其主要子句可归纳如下: [ WITH <common_t ...

  4. MATLAB如何定义函数

    自定义函数的途径:M文件函数(M file function)在线函数(Inline Function)匿名函数(Anonymous Function)1.M文件函数范例function c=myad ...

  5. 论文笔记Outline

    1.Information publication: author: 2.What 3.Dataset 4.How input: output: method: 5.Evaluation: basel ...

  6. The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path。

    项目上右键-->Build Path-->Configuration Build Path -->Add Library -->Server Runtime 选择tomcat

  7. JS模块规范 前端模块管理器

    一:JS模块规范(为了将js文件像java类一样被import和使用而定义为模块, 组织js文件,实现良好的文件层次结构.调用结构) A:CommonJS就是为JS的表现来制定规范,因为js没有模块的 ...

  8. android file path

    问题 出现的异常为:java.lang.IllegalArgumentException: File /mnt/sdcard/crazyit.bin contains a pathseparator. ...

  9. 开发错误记录11:git报错 fatal:open /dev/null or dup failed: No such file or directory

    今天在自己的的电脑上装了git,没成想运行报错: 重装了几次git ,都不行,电脑上没有装github桌面版; 后来在网上查到了方法,反映这是系统的问题: null是比较特殊的系统文件,它实际上是为操 ...

  10. Integer与int的种种比较

    package com.lxm.basics; public class IntegerTest { public static void main(String[] args) { Integer ...