TempData,ViewData和ViewBag的比较
TempData,ViewData和ViewBag的比较
学习ASP.NET有大约一个月了,一直都是半生不熟的,因为之前的很长时间都是在做java开发,没有时间静下来心来学习,加上ASP.NET的框架也很复杂,一时间也是看的昏头转向的,所以只能看到一点记录一点,慢慢积累,慢慢总结吧。
Action向View传递数据很简单,方式也很多,最直接的就是我们向View传递Model,这本身就是MVC的意义所在。如果是显示一些消息,像是错误信息,可以使用ViewData:
public ActionResult Index()
{
ViewData["message"] = "Hello Word!";
return View();
}
然后是视图:
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
<%: ViewData["message"]%>
</asp:Content>
实际效果如:
我们可以看到,ViewData就是一个字典,它存放的是键值对。
既然Action可以向View传递数据,那么View是否可以修改数据然后再回传给Action呢?
我们对代码这样修改:

public ActionResult Index()
{
ViewData["message"] = "Hello Word!";
return View();
} public ActionResult About()
{
string message = ViewData["message"] as string;
if (message == "Hello")
{
ViewData["message2"] = "已经修改";
}
else
{
ViewData["message2"] = "没有修改";
}
return View();
}

视图:
为什么会这样?因为ViewData只会在一次HTTP请求中有效,当这次请求结束后,就会自动清空其值。为什么呢?
因为ViewData的生命周期和所请求的View是一样的,仅对当前View有效。
ViewBag也可以用来向视图传递数据:
public ActionResult Index()
{
ViewBag.Message = "Hello, Word";
return View();
}
视图:
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
<%: ViewBag.Message%>
</asp:Content>
ViewBag的使用就相当于ViewData。
它跟ViewData一样,都是字典值,但是内在的实现却完全不一样。
ViewBag最大的优点就是它不需要转型就可以使用它里面的值,但ViewData需要这样:
string message = ViewData["message"] as string;
因为ViewBag存放的不是键值对,而是dynamic动态类型,这是ASP.NET MVC3新增的部分。动态类型非常强大,尤其是容器的使用。
ViewBag就是封装了的ViewData,它是顺应C#4的dynamic关键字而诞生的。它可以让我们像是属性访问一样检索字典中的值,这样更加自然,这也是C#所倡导的:"可以读出来的代码"。
ViewBag在使用上与ViewData并没有孰优孰劣的说法,但是可以肯定,ViewBag比ViewData要慢,但这个真心可以忽略。值得注意的是,ViewBag可以直接访问存储在ViewData里面的数据(因为它本来就只是封装了的ViewData)。但是,像是这样:
ViewData["Message hehe"] = "Hello, Word";
ViewBag就有心无力了。
更加重要的是,ViewBag无法作为扩展方法的参数,因为编译器为了确保所选择的扩展方法是正确的,编译时必须知道参数的真正类型,所以,HTML辅助方法无法使用ViewBag。
除了上面两种(其实是一种),还有一种方法,就是TempData。
TempData也是字典,所以它的使用完全等同于ViewData,但两者之间还是存在很大的差异。
TempData,顾名思义,就是临时数据。TempData保存在Session中,Controller每次请求的时候都会从Session中获取TempData,然后清除Session。基于这样的事实,在每次请求结束后,TempData的生命周期也就结束了。网上有一句话:TempData至多之只能通过一次Controller传递,假设我们的Controller是跳转到下一个Controller,以此类推,在最后一个Controlle相应的视图上,的确可以获得该TempData。但是,这并不是说TempData已经跨请求传递了,这依然只是一次请求,至于是否是跨Controller传递,我认为不是,所谓的通过Controller传递,是指将TempData传递给View,在上面的例子中,只有最后的Controller才会将该TempData传递给View,所以,TempData的确是只能通过一次Controller传递。
TempData也可以在Action之间传递的,像是这样:

public ActionResult Index()
{
TempData["message"] = "Hello";
return View();
} public ActionResult About()
{
if ("Hello" == TempData["message"] as string)
{
TempData["message"] = "Hello,Word";
}
return View();
}

但必须注意,要使该行为正确,也就是TempData能够被传递给另一个Action,Index操作对应的视图就不能使用TempData,因为一旦使用就相当于一次请求,那么TempData中的值就会被清空。
TempData是存储在Session中,但这个并不是绝对的,我们可以改变TempData的存储地方,只要实现ITempDataProvider这个接口就行,但一般情况没有必要这么做。
TempData,ViewData和ViewBag的比较的更多相关文章
- asp.net mvc中ViewData、ViewBag和TempData的详解
一.ViewData和ViewBag 1.ViewData和ViewBag都是从Action向View传递数据的方式,当然还有其他方式如向View传递Model. 2.ViewData页面查询数据时需 ...
- .NET MVC TempData、ViewData、ViewBag
说明: 原文作者贤新 原文地址:http://www.cnblogs.com/chenxinblogs/p/4852813.html ViewData和ViewBag主要用于将数据从控制器中传递到视图 ...
- MVC5-8 ViewData、ViewBag、TempData分析
MVC中Contoller与视图的数据传输 后台的值显示到界面上,我们有几种方式呢.MVC给我们提供了ViewData.ViewBag.TempData.Model这几种方式,当然我们也可以用ajax ...
- ASP.NET MVC程序传值方式:ViewData,ViewBag,TempData和Session
转载原地址 http://www.cnblogs.com/sunshineground/p/4350216.html 在ASP.NET MVC中,页面间Controller与View之间主要有以下几种 ...
- ViewData,ViewBag和TempData
ViewData ViewBag TempData 类型 字典 Dynamic TempDataDictionary 出生时间 MVC1 MVC3 框架版本 .net3.5 .net4.0 ...
- MVC传递Model之TempData、ViewData、ViewBag差别及用途
MVC使用过程中常常会用到TempData.ViewData.ViewBag三种方式,这三种什么差别呢? TempData:默认存储于Session中,可通过继承ITempDataProvider接口 ...
- asp.net mvc 中 tempdata、viewdata、viewbag生命周期(转载)
TempData ViewData ViewBag都可以用来保存数据,它们之间的区别如下: TempData保存在Session中,Controller每次执行请求的时候,会 ...
- 浅谈 MVC中的ViewData、ViewBag和TempData
ViewBag和TempData的区别 ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从Asp.net MVC 1 就有了 ASP.NET MVC3 才 ...
- 第三节:Action向View传值的四种方式(ViewData、ViewBag、TempData、Model)
简 介 在前面的章节中,我们已经很清楚,MVC工作模型的流程,Controller中的Action接收到客户端的请求,处理后要将数据返回给View,那么Action中是如何将数据返回给View的,二 ...
随机推荐
- 【Bootstrap】自己主动去适应PC、平面、手机Bootstrap网格系统
酒吧格英语作为一门系统"grid systems",也有人翻译成"网络格系统".使用固定格子设计布局,其风格整齐而简洁,在二战结束后人气,流风格之中的一个. 1 ...
- Bulk Insert具体订单
Bulk Insert具体订单 BULK INSERT与用户指定的格式的数据文件复制到数据库表或视图. 语法: BULK INSERT [ [ 'database_name'.][ 'owner' ] ...
- 玩转Web之Jsp(二)-----jsp中怎么使用CKEditor
在BBS项目或其他一些项目中,我们会发现别人写的一些文本域非常漂亮,而且有多种功能,这是怎么做到的呢?其实通过在jsp文件中引用在线编辑器即可,这里以CKEditor为例. 首先下载CKEditor: ...
- 64位操作系统下用Microsoft.Jet.OLEDB.4.0出现未注册错误
在WIN7 64位下用Microsoft.Jet.OLEDB.4.0方法访问数据库Access,出现未注册错误 如果是要建立64位的应用程序 1.Microsoft Access Database E ...
- 概率统计(DP)
问题叙述性说明 生成n个月∈[a,b]随机整数.并且将它们输出到x概率. 输入格式 输入线跟四个整数n.a,b,x,用空格分隔. 输出格式 输出一行包括一个小数位和为x的概率.小数点后保留四位小数 例 ...
- android user如何打开一个版本号root才干
首先,你要确认你要打开adbd 的root 才干,或者让app 它有可能获得root 才干. (1). adbd 的root 才干 我们通常debug user 当问题的版本号, 或行为user ...
- RecyclerView0基于使用
(转载请注明出处:http://www.kennethyo.me/post/android/recyclerviewchu-ji-shi-yong) RecyclerView是Android在v7包中 ...
- dba_dependencies查询结果视图
[oracle@rhel63single ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Fri Mar 13 0 ...
- P/Invoke与逆向P/Invoke
1.在在 C# 中通过 P/Invoke 调用Win32 DLL这篇文中,详细介绍了P/Invoke的基本知识以及使用. 2.InAttribute和OutAttribute特性与C#中ref和out ...
- SQL Server 2005中的CHECKSUM功能
原文:SQL Server 2005中的CHECKSUM功能 转自此处 页面 checksum 是SQL2005的新功能,提供了一种比残缺页检测强大的机制检测IO方面的损坏.以下是详细描述: 页面 C ...