Controller负责处理浏览器来的所有要求,并决定响应什么属性给浏览器,以及协调Model与View之间的数据传递。在ASP.NET MVC中有好几种传递数据给视图的方式,例如从ASP.NET MVC 1.0就有的ViewData与TempData对象,还有从ASP.NET MVC 3.0开始提供的ViewBag对象,通过这些对象都可以将数据顺利地传到视图里,让视图页面可以取用这些从Controller传来的数据。

六、ViewData、ViewBag与TempData概述

1. ViewData

当你使用ViewResult来运行结果时,可以在Action里面利用ControllerBase类别中的ViewData属性来保存数据,以便这些数据可以传递给View使用。

在设置ViewData属性时,传入的key必须为字符串类型,而属性部分可以保存任意对象信息。

ViewData的特性是它只会存在这次的HTTP请求中,而不会像Session将数据带到下一个HTTP请求。

2. ViewData.Model

由于使用ViewData字典在传入时属于“弱类型”的方式保存,也就是在ViewData里特定键值的类型永远是object通用对象类型,传给View使用之后,还必须通过转型才能进一步使用,所以用起来不太方便。

在ASP.NET MVC的View相关技术里,可以将特定视图页面声明为某种类型,让整个视图页面参考特定类型,并且让Controller传来的Model数据直接自动转型为View所声明的类型,而这个从Controller传来的Model数据就是通过ViewData.Model传过来的。

以下程序代码演示可以将数据通过ViewData.Model传递给View的Model使用:

        public ActionResult Index()
{
var data = GetDataFromDB();
ViewData.Model = data;
return View();
}

上述这段程序代码与以下这段程序代码的结果是完全一样的,都是将ViewData.Model传给View页面使用:

        public ActionResult Index()
{
var data = GetDataFromDB();
return View(data);
}

从VS2012的快捷提示中,可以发现ViewData.Model也是object类型,为什么说这个跟“强类型”有关呢?

当你通过ViewData.Model传递数据到视图页面,在视图页面里可以也用@model声明一个该视图页面专属的数据模型类型,声明后就可以在视图页面中取用@Model对象,而@Model对象就会拿Controller里设置好的ViewData.Model数据,并且自动转型为@model声明的类型。

声明完成后,我们在视图页面就可以以具有类型@Model的对象进行开发,享受VS2012里使用Intellisense的方便性。

3. ViewBag

ViewBag被声明为一个dynamic动态类型,并且属性是一个传入ViewData的DynamicViewDataDictionary动态ViewData字典。严格上来说,ViewBag并没有什么特殊之处,因为所有对ViewBag属性的任何访问动作,最终都还是对ViewData来进行操作,唯一的差别仅在于ViewBag是dynamic动态类型而已,优点是可以少输入几个字符。例如以下ViewData的写法:

ViewData["Message"]="更改此模板即可开始着手进行您的ASP.NET MVC应用程序。"

换成ViewBag的写法则如下:

ViewBag.Message="更改此模板即可开始着手进行您的ASP.NET MVC应用程序。";

4.TempData

TempData的数据结构与ViewData一样都是字典类型,但TempData的类型是TempDataDictionary。

不过,TempData还是有那么一点不同的地方,在于它的内部是使用Session来保存信息,更有趣的是它的名称与特性。“Temp”是暂存的意思,但是保存在TempData中的信息会暂存多久呢?答案是:一次网页请求。

接下来,我们用以下演示来解释“一次网页请求”的定义,在窗体数据送出到以下Action保存,如果发生数据库新增失败的消息,我们会希望这次送出的数据可以保留至下一页,此时,就会将这个只希望出现一次的消息保存到TempData中,并在下一页进行取用。

        public ActionResult Index()
{
TempData["T1"]="";
//string tmp = TempData["T1"].ToString();
return View();
} public ActionResult About()
{
ViewData["T1"] = TempData["T1"];
return View();
}

以上代码,能在About动作中使用ViewData["T1"]。但如果在Index动作中添加string tmp = TempData["T1"].ToString();,则程序出错。

在我们的电子商务网站案例中,也有TempData的使用,大家找找看。电子商务网站案例下载链接为http://yunpan.cn/QU9XTyaduYYRS

MVC-03 控制器(3)的更多相关文章

  1. ASP.NET MVC 5 - 控制器

    MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...

  2. .NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...

  3. MVC 在控制器中获取某个视图动态的HTML代码

    ASP.NET MVC 在控制器中获取某个视图动态的HTML代码   如果我们需要动态的用AJAX从服务器端获取HTML代码,拼接字符串是一种不好的方式,所以我们将HTML代码写在cshtml文件中, ...

  4. 三、ASP.NET MVC Controller 控制器(二:IController控制器的创建过程)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...

  5. c#异步编程(三)—ASP.NET MVC 异步控制器及EF异步操作

    ASP.NET MVC 异步控制器及EF异步操作 异步控制器 ASP.NET MVC2后开始了对异步请求管道的支持,异步请求管道的作用是允许web服务器处理长时间运行的请求,比如 那些花费大量时间等待 ...

  6. [转]ASP.NET MVC 5 - 控制器

    MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...

  7. ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 03. 服务注册和管道

    ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 03. 服务注册和管道 语雀: https://www.yuque.com/yuejiangliu/dotnet/ ...

  8. Spring MVC(三)--控制器接受普通请求参数

    Spring MVC中控制器接受参数的类方式有以下几种: 普通参数:只要保证前端参数名称和传入控制器的参数名称一致即可,适合参数较少的情况: pojo类型:如果前端传的是一个pojo对象,只要保证参数 ...

  9. .NET/ASP.NET MVC Controller 控制器(深入解析控制器运行原理)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...

  10. C# MVC ( 将控制器的实体类注册到视图 )

    (1)控制器  代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; usin ...

随机推荐

  1. javaScript 工作必知(二) null 和undefined

    null null 表示个“空” , 使用typeof (null) ;//Object ; 说明他是一个特殊的对象. null 类型只自己唯一个成员.他是不包含属性和方法的. undefined u ...

  2. HTML之学习笔记(四)格式化标签和特殊字符

    html常用的格式化标签使用如下 <html> <head> <title></title> </head> <body > & ...

  3. SGU 101.Domino( 欧拉路径 )

    求欧拉路径...直接dfs即可,时间复杂度O(N) -------------------------------------------------------------------------- ...

  4. Hadoop学习之Mapreduce执行过程详解

    一.MapReduce执行过程 MapReduce运行时,首先通过Map读取HDFS中的数据,然后经过拆分,将每个文件中的每行数据分拆成键值对,最后输出作为Reduce的输入,大体执行流程如下图所示: ...

  5. [互联网面试笔试汇总C/C++-9] 实现赋值运算符函数-剑指offer

    题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数. class CMyString { public: CMyString(char* pData = NULL); CMyStr ...

  6. linux杂记(八)linux压缩与打包

    linux系统常见的压缩指令 一般被压缩过的档案,通常其附档名都是[*.tar,*.tar.gz,*.tgz,*.gz,*.Z,*.bz2]等等. *.tar:tar程序打包的数据.并没有压缩过 *. ...

  7. java对象的比较分析

    关于对象的比较我们可以通过以下三种手段来实现 一.利用"=="比较引用 Java中,当比较简单类型变量时用"==",只要两个简单类型值相等即返回ture,否则返 ...

  8. centos 磁盘扩容,新建lv

    1,扩容已有lvm 上的lv 1.1 新建pv --> pvcreate /dev/sd* 1.2 把新增的pv添加到lvm -->vgextend vg_ruiy /dev/sd* 1. ...

  9. 利用宏定义令iOS项目当中的NSLog不执行

    今天在博客园主页看到一篇帖子,提到NSLog消耗运行时性能: http://www.cnblogs.com/sunnyxx/p/3680623.html 解决方案如下,在​Prefix.pch文件当中 ...

  10. https://github.com/coolnameismy/BabyBluetooth github上的一个ios 蓝牙4.0的库并带文档和教程

    The easiest way to use Bluetooth (BLE )in ios,even bady can use. 简单易用的蓝牙库,基于CoreBluetooth的封装,并兼容ios和 ...