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这个接口就行,但一般情况没有必要这么做。

 
 
标签: ASP.NET MVC

TempData,ViewData和ViewBag的比较的更多相关文章

  1. asp.net mvc中ViewData、ViewBag和TempData的详解

    一.ViewData和ViewBag 1.ViewData和ViewBag都是从Action向View传递数据的方式,当然还有其他方式如向View传递Model. 2.ViewData页面查询数据时需 ...

  2. .NET MVC TempData、ViewData、ViewBag

    说明: 原文作者贤新 原文地址:http://www.cnblogs.com/chenxinblogs/p/4852813.html ViewData和ViewBag主要用于将数据从控制器中传递到视图 ...

  3. MVC5-8 ViewData、ViewBag、TempData分析

    MVC中Contoller与视图的数据传输 后台的值显示到界面上,我们有几种方式呢.MVC给我们提供了ViewData.ViewBag.TempData.Model这几种方式,当然我们也可以用ajax ...

  4. ASP.NET MVC程序传值方式:ViewData,ViewBag,TempData和Session

    转载原地址 http://www.cnblogs.com/sunshineground/p/4350216.html 在ASP.NET MVC中,页面间Controller与View之间主要有以下几种 ...

  5. ViewData,ViewBag和TempData

      ViewData ViewBag TempData 类型 字典 Dynamic TempDataDictionary 出生时间 MVC1 MVC3   框架版本 .net3.5 .net4.0   ...

  6. MVC传递Model之TempData、ViewData、ViewBag差别及用途

    MVC使用过程中常常会用到TempData.ViewData.ViewBag三种方式,这三种什么差别呢? TempData:默认存储于Session中,可通过继承ITempDataProvider接口 ...

  7. asp.net mvc 中 tempdata、viewdata、viewbag生命周期(转载)

                 TempData ViewData ViewBag都可以用来保存数据,它们之间的区别如下: TempData保存在Session中,Controller每次执行请求的时候,会 ...

  8. 浅谈 MVC中的ViewData、ViewBag和TempData

    ViewBag和TempData的区别 ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从Asp.net MVC 1 就有了 ASP.NET MVC3 才 ...

  9. 第三节:Action向View传值的四种方式(ViewData、ViewBag、TempData、Model)

    简  介 在前面的章节中,我们已经很清楚,MVC工作模型的流程,Controller中的Action接收到客户端的请求,处理后要将数据返回给View,那么Action中是如何将数据返回给View的,二 ...

随机推荐

  1. QrcodeWithLogo

    package com.qrcode; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; import ...

  2. App如何选择移动广告平台,开发者2 - 移动变现模式分析

    开发人员社区的上述分析.它可能无法覆盖全部,但是,每一个开发者都需要根据自己的特点变现模式选择.继App流动性模式做了全面的分析. 游戏.广告.电商是互联网的三种变现模式,移植到移动互联网也相同适用. ...

  3. [Django1.6]south于django1.6使用

    south在django1.6中的使用 django1.7中已经支持数据合并了,所以仅仅能在django1.4 1.5 1.6的版本号中使用south. south的主要作用就是做数据的合并,当我们在 ...

  4. 非阻塞IOserver型号

    让我们来考虑一个场景,你和百万玩家的魔兽世界的忠实粉丝.时间之旅打每到周末boss. 每当周末比赛server在亚历山大,因为至少在同一时间数十万用户在线. 假设我们的多-threaded果酱serv ...

  5. js Array 阵列扩展方法

    //又来了 Array.prototype.unique = function() { this.sort(); var re=[this[0]]; for(var i = 1; i < thi ...

  6. POJ 2531-Network Saboteur(DFS)

    Network Saboteur Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9435   Accepted: 4458 ...

  7. js 网上见到的动画函数 备份

    <script> function startMove(obj,json,fn){ clearInterval(obj.timer); obj.timer = setInterval(fu ...

  8. SQL开发中容易忽视的一些小地方(五)

    原文:SQL开发中容易忽视的一些小地方(五) 背景: 索引分类:众所周知,索引分为聚集索引和非聚集索引. 索引优点:加速数据查询. 问题:然而我们真的清楚索引的应用吗?你写的查询语句是否能充分应用上索 ...

  9. C++随机数的使用方法

         学过别的高级语言的都知道,产生随机数用的都是相似于random这种字符,c++也不例外,在C++中使用的是rand()函数,可是不同的是,假设在C++中仅仅使用了比如 "int i ...

  10. Oracle存储过程详解(引用)+补充(转) dbms_output包 good

    执行存储过程时,execute和call的区别 EXEC is a sqlplus command that put its argument as an anonymous pl/sql block ...