ASP.NET MVC 3中ViewBag, ViewData和 TempData

简介:

ViewBag, ViewData十分类似,都可用于把数据从controller传递到view。

ViewBag是WebViewPage中的一个属性,它的类型是dynamic。dynamic类型可以理解为,编译器在编译到这种类型时,会跳过类型检查,而在运行时做这些事情。

ViewData也是WebViewPage类中的一个属性,但他的类型是ViewDataDictionary。从内部实现上,ViewBag属性是按照键值对那样存放在ViewData中的,因此也可以通过方为ViewData中值来访问ViewBag的值,他们指向的引用是同一个的。但是区别在于,ViewData的写法是按照序列访问那样,通过索引访问,而ViewBag是通过属性访问。事实上,在编译阶段,编译器无法知道ViewBag所给的属性是否存在,这都是在运行时决定的。举个例子,ViewData["Index"]可以写成:ViewBag.Foo,而不需要担心编译时错误。

我们可以通过下面的例子来验证ViewBag和ViewData其实指向的对象是同一个。

@{

ViewBag.XXX = new StringBuilder("222");

ViewData["XXX"] = new StringBuilder("333");

}

<pre>

ViewBag的类型是 @ViewBag.GetType();

ViewData的类型是 @ViewData.GetType();

ViewBag.XXX 的值是 @ViewBag.XXX

ViewData["XXX"]的值是 @ViewData["XXX"]

@(ViewBag.XXX == ViewData["XXX"])

@(ViewBag.XXX.Equals(ViewData["XXX"]))

@ViewBag.XXX.GetHashCode()

@ViewData["XXX"].GetHashCode()

</pre>

得到的结果如下:

CB60685BC69A43ACB6482264AB522340

可以看到对ViewData["XXX"]做更改,会影响到ViewData.XXX。后续的例子有证明了他们是指向同一个引用的。

在使用ViewBag的时候,有一个好处就是不需要做类型转换。因为是dynamic类型,只要保证在运行时的类型正确既可以了。举个例子:

@{

ViewBag.XXX = new List<int>{1,2,3};

ViewData["YYY"] = new List<int> { 3, 4, 5 };

foreach (var i in ViewBag.XXX)

{

@i

}

foreach (var i in ViewData["YYY"] as List<int>)

{

@i

}

}

无论是ViewBag还是ViewData,都仅仅对当前的请求有效,他们的生命周期很短,无法存在于多个请求中。

TempData的出现可以存在多个请求,但是,也被限制于当前请求和下一次请求(通常是Redirect)。它的内部实现是使用了Session。

public void Index(){

TempData["text"] = "123456";

RedirectToAction( "Test1" );

//RenderView("Index");

}

public void Test1(){

string text = TempData["text"] as string;

RenderView("Test1");

}

public void Test2(){

string text = TempData["text"] as string;

RenderView("Test2");

}

如上面的例子,Index中的TempData可以在跳转到Test1的时候获得,但不能在Test2中获得。




















本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/1328168 ,如需转载请自行联系原作者

相关文章
|
12月前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
371 5
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
241 7
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
278 0
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
212 0
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
382 0
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
484 0
|
JavaScript 前端开发 .NET
《精通 ASP.NET MVC 3 框架(第三版)》----1.5 ASP.NET MVC 3的新特性
MVC 3版的主要特性是引入了Razor视图引擎。以前的MVC版本一直依赖于ASP.NET的视图引擎,它依赖于ASP.NET的<%和%>代码块(如果你曾做过任意一种ASP.NET开发,你肯定看到过它的使用)。
1492 0
|
前端开发 .NET 开发框架
《精通 ASP.NET MVC 4》----1.5 ASP.NET MVC 4的新特性
第4版MVC框架在第3版的基础上提供了许多改进。有一些重大的新特性,例如,对Web API应用程序的支持(第25章描述)、对移动设备的支持(第24章),以及一些将内容发送给客户端的有用的优化技术(第24章)等。
1575 0
|
Web App开发 前端开发 .NET
返璞归真 asp.net mvc (6) - asp.net mvc 2.0 新特性
原文:返璞归真 asp.net mvc (6) - asp.net mvc 2.0 新特性[索引页][源码下载] 返璞归真 asp.net mvc (6) - asp.net mvc 2.0 新特性 作者:webabcd介绍asp.
1312 0