ASP.NET MVC程序传值方式:ViewData,ViewBag,TempData和Session
转载原地址 http://www.cnblogs.com/sunshineground/p/4350216.html
在ASP.NET MVC中,页面间Controller与View之间主要有以下几种小量数据的传值方式:ViewData、ViewBag、TempData和Session变量。
下面就这四种传值方式做出详细介绍。
一、ViewData
- ViewData是一个继承自ViewDataDictionary类的Dictionary对象,它只能存储String Key/Object Value字典数组。
- ViewData 只在当前 Action 中有效,生命周期和 View 相同;
- ViewData是从Controller向对应的View传递值。
- ViewData的值只在当前的请求中有效,生命周期和View相同,其值不能再多个请求中共享。
- 在重定向(Redirection)后,ViewData中存储的变量值将变为null。
- 在取出ViewData中的变量值时,必须进行合适的类型转换和空值检查。
下面我们来看一个简单的例子,演示一下如何使用ViewData来从Controller向View传值。
public ActionView Index()
{
ViewData["Message"] = "This is a message from ViewData."; return View();
}
然后我们在视图中使用这个变量:
<div>
@ViewData["message"].ToString()
</div>
综上,ViewData更适合从Controller向View传递简单对象数据时使用。
二、ViewBag
- ViewBag是一个动态类型变量(dynamic),这是C# 4.0引入的新特性,变量类型会在运行时进行解析。
- ViewBag进本上是ViewData的包装,也是用来从Controller向View来传递值的。
- VeiwBag也只是在当前的请求中有效。
- 在重定向(Redirection)后,ViewBag中存储的变量值将变为null。
- 因为ViewBag是动态类型,所以我们在取得其值时不需要进行类型转换。
同样,我们来通过一个简单的例子来演示一下如何利用ViewBag从Controller向View传递数据。
public ActionView Index()
{
ViewBag.Message = "This is a message from ViewBag."; return View();
}
然后我们在视图中取出数据并显示:
<div>
@ViewBag.Message
</div>
综上,ViewBag更适合从Conroller向View传递复杂数据时使用,因为取出存储在其中的数据变量时无需进行类型转换。
三、ViewData和ViewBag的区别和联系
1.ViewData和ViewBag其实是一回事,ViewBag其实是对ViewData的封装,其内部其实是使用ViewData实现内部存储的。
2.唯一的不同点是,ViewBag可以存储动态类型的变量值(dynamic),它会在程序运行的时候动态解析,而ViewData只能存储String Key/Object Value字典数组。
ViewData中的变量为Object类型,而ViewBag中的变量时dynamic类型,他们的区别是,dynamic类型在使用时会自动根据数据类型转换,而ViewData中的变量值则需要我们进行强制转换。
3.通过转到定义我们可以看到:
[Dynamic]
public dynamic ViewBag { get; }
public ViewDataDictionary ViewData { get; set; }
这里ViewBag只有get方法,没有set方法。
4.ViewData比ViewBag读取速度快。
四、TempData
- TempData是一个继承自TempDataDictionary类的字典对象,它默认情况下是基于Session存储机制之上的。(备注:你也可以让你的TempData基于其他存储机制之上,我们可以提供我们自定义的ITempDataProvider来完成,详见http://afana.me/post/session-less-controllers-and-TempData-ASPNET-MVC.aspx)。
- TempData是用来在多个Actions或从当前请求向子请求,页面发生了重定向(Redirecion)时传递共享数据。
- 只有在目标视图View完全加载后才有效。
- 在取出TempData存储的变量时,必须进行合适的类型转换和空值检查。
- TempData 的数据至多只能经过一次Controller传递,并且每个元素至多只能被访问一次,访问以后,自动被删除。详情请看:http://www.cnblogs.com/tristanguo/archive/2009/04/06/1430062.html
- TempData 保存在Session中,Controller每次执行请求的时候,会从Session中先获取TempData,而后清除Session,获取完TempData数据,虽然保存在内部字典对象中,但是其集合中的每个条目访问一次后就从字典表中删 除。具体代码层面,TempData获取过程是通过SessionStateTempDataProvider.LoadTempData方法从 ControllerContext的Session中读取数据,而后清除Session,故TempData只能跨Controller传递一次。
- TempData 一般用于临时的缓存内容或抛出错误页面时传递错误信息(例如Edit页面Save操作成功后会跳转到Index页面,需要在Index页面显示保存成功的提示消息),可以将TempData 在使用之前存储到相应的 ViewData 中以备循环使用。
下面,我们来透过一个例子来演示一下如何在两个Action方法中传递数据。
首先创建一个Model类,如下
public class Customer
{
public int Id { get; set; }
public string Code { get; set; }
public double Amount { get; set; }
}
然后在Controller中加入如下代码:
public ActionView DisplayCustomer1
{
Customer customer = new Customer
{
Id = ,
Code = "",
Amount =
}; TempData["Customer"] = customer; return RedictToAction("DisplayCustomer2");
}
public ActionView DisplayCustomer2
{
Customer customer = TempData["OneCustomer"] as Customer; return View(customer );
}
最后创建一个强类型的视图来显示客户信息,此处代码略。
综上,TempData主要是用在需要在多个Acions或者页面重定向时共享传递数据时使用。
五、Session
- Session也是ASP.NET MVC传递值得一种方式,和TempData不同的,用户整个回话期中Session都不会过期。
- Session在同一用户会话过程中的所用请求中有效,比如,页面刷新。
- Session中的值也需要进行类型转换和非空检查。
我们仍然使用上面的例子,假如我们不用TempData,而用Session也可以得到同样的结果。
public AcionView DisplayCustomer1
{
Customer customer = new Customer
{
Id = ,
Code = "",
Amount =
}; Session["OneCustomer"] = customer; return RedictToAction("DisplayCustomer2");
} public ActionResult DisplayCustomer2
{
Customer customer = Session["OneCustomer"] as Customer; return View(customer);
}
Session的生命周期最长,但是它默认的是使用Cookies来存储数据,所以使用的时候必须注意数据保密的问题。
综上,Session主要在需要多个Controllers, Actions and Views共享数据(非敏感数据)时使用。
六、图说传递数据的生命周期
Maintains data between | ViewData/ViewBag | TempData | Session |
Controller to Controller | No | Yes | Yes |
Controller to View | Yes | Yes | Yes |
View to Contorller | No | No | Yes |
ASP.NET MVC程序传值方式:ViewData,ViewBag,TempData和Session的更多相关文章
- asp.net mvc各种传值方式大全
MVC 各种传值方式 ViewData传值. HomeController.cs Co de: public ActionResult Index(){ ViewData["Ti ...
- dotNET5的MVC页面传值方式总结
本文大致讲解mvc前后端的传值方式,包括control向view.view向control.以及action向action. 一.经典回顾 二.Controller向View传值 1. ViewBag ...
- MVC中使用EF(1):为ASP.NET MVC程序创建Entity Framework数据模型
为ASP.NET MVC程序创建Entity Framework数据模型 (1 of 10) By Tom Dykstra |July 30, 2013 Translated by litdwg ...
- 跟我学ASP.NET MVC之三:完整的ASP.NET MVC程序-PartyInvites
摘要: 在这篇文章中,我将在一个例子中实际地展示MVC. 场景 假设一个朋友决定举办一个新年晚会,她邀请我创建一个用来邀请朋友参加晚会的WEB程序.她提出了四个注意的需求: 一个首页展示这个晚会 一个 ...
- 跟我学ASP.NET MVC之二:第一个ASP.NET MVC程序
摘要: 本篇文章带你一步一步创建一个简单的ASP.NET MVC程序. 创建新ASP.NET MVC工程 点击“OK”按钮后,打开下面的窗口: 这里选择“Empty”模板以及“MVC”选项.这次不创 ...
- .NET手记-为ASP.NET MVC程序集成Autofac
MVC Autofac总是会紧跟最新版本的ASP.NET MVC框架,所以文档也会一直保持更新.一般来讲,不同版本的框架集成Autofac的方法一般不变. MVC集成需要引用 Autofac.Mvc5 ...
- 05 入门 - 浅谈 ASP.NET MVC程序的工作原理
目录索引:<ASP.NET MVC 5 高级编程>学习笔记 本篇内容 1. Global.asax文件 2. RouteConfig.cs文件 3. 视图命名和寻址的规则 前面创建了一个简 ...
- 用开源 ASP.NET MVC 程序 Bonobo Git Server 搭建 Git 服务器(转)
用开源 ASP.NET MVC 程序 Bonobo Git Server 搭建 Git 服务器 现在不用Git,都不好意思说自己是程序员. 当你想用Git,而源代码服务器是Windows系统时,你 ...
- IIS8发布Asp.net MVC程序后出现404错误,处理程序staticFile
新部署的虚拟机,运行Asp.net MVC程序,出现如下图错误: 解决方法: 添加功能和角色->添加角色->Web服务器IIS->应用程序开发->Asp.net3.5 /Asp ...
随机推荐
- 定制IE浏览器的尖兵利器 - BHO
IE浏览器是当前使用人数最广的浏览器, 本文主要来讲述如何来打造我们自己特色的浏览器, 自定义工具栏按钮, 自定义网页的右击菜单, BHO技术与IE浏览器. 本文写作过程中参考不少网络上的相关资料, ...
- SQLite多线程读写实践及常见问题总结
多线程读写 SQLite实质上是将数据写入一个文件,通常情况下,在应用的包名下面都能找到xxx.db的文件,拥有root权限的手机,可以通过adb shell,看到data/data/packagen ...
- Topcoder SRM 630 (500 floyed 暴力 _builtin_popcount())
题意:给n个点,保证图联通,给点相连的距离,求一个最多的点,这些点之间的距离都是相同的. 分析: 下面的代码是我们房间第一的大神的,写的很简洁,我的思路和他的一样,但是我不知道错哪了. 思路是暴力枚举 ...
- Android 获取屏幕尺寸与密度
android中获取屏幕的长于宽,参考了网上有很多代码,但结果与实际不符,如我的手机是i9000,屏幕大小是480*800px,得到的结果却为320*533 结果很不靠谱,于是自己写了几行代码,亲 ...
- UVa 1475 (二分+半平面交) Jungle Outpost
题意: 有n个瞭望塔构成一个凸n边形,敌人会炸毁一些瞭望台,剩下的瞭望台构成新的凸包.在凸多边形内部选择一个点作为总部,使得敌人需要炸毁的瞭望塔最多才能使总部暴露出来.输出敌人需要炸毁的数目. 分析: ...
- UVA 568 Just the Facts (水)
题意: 求一个数n的阶乘,其往后数第1个不是0的数字是多少. 思路: [1,n]逐个乘,出现后缀0就过滤掉,比如12300就变成123,继续算下去.为解决爆long long问题,将其余一个数mod, ...
- windows 下使用 MinGW + msys 编译 ffmpeg
本文参考了网络上的不少文章,但由于版本环境的问题参考文章并不能直接指导编译,本文吸收多方经验,并在自己多次编译实验的基础上写成,欢迎转载,请注名出处. FFmpeg是在Linux平台下开发的,但 ...
- Oracle中如何判断一个字符串是否含有汉字
看到网友问,怎么查询表中某个字段数据是不是包含了全角字符啊? 这个问题涉及到几个函数:to_single_byte.length和lengthb,我之前做开发的时候研究的是如何判断一个字符串中是否包含 ...
- Struts2的OGNL标签详解
一.Struts2可以将所有标签分成3类: UI标签:主要用于生成HTML元素的标签. 非UI标签:主要用于数据库访问,逻辑控制等标签. Ajax标签:用于Ajax支持的标签. 对于UI标签,则有可以 ...
- TCP/IP详解学习笔记(6)-UDP协议
1.UDP简要介绍 UDP是传输层协议,和TCP协议处于一个分层中,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议. 2.UDP协议头 2.1.UDP端口号 ...