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

  在ASP.NET MVC中,页面间Controller与View之间主要有以下几种小量数据的传值方式:ViewData、ViewBag、TempData和Session变量。

  下面就这四种传值方式做出详细介绍。

一、ViewData

  • ViewData是一个继承自ViewDataDictionary类的Dictionary对象,它只能存储String Key/Object Value字典数组。
  • ViewData是从Controller向对应的View传递值。
  • ViewData的值只在当前的请求中有效,生命周期和View相同,其值不能再多个请求中共享。
  • 在重定向(Redirection)后,ViewData中存储的变量值将变为null。
  • 在取出ViewData中的变量值时,必须进行合适的类型转换和空值检查。

下面我们来看一个简单的例子,演示一下如何使用ViewData来从Controller向View传值。

1 public ActionView Index()
2 {
3     ViewData["Message"] = "This is a message from ViewData.";
4 
5     return View();  
6 }

然后我们在视图中使用这个变量:

1 <div>
2     @ViewData["message"].ToString()
3 </div>

综上,ViewData更适合从Controller向View传递简单对象数据时使用。

二、ViewBag

  • ViewBag是一个动态类型变量(dynamic),这是C# 4.0引入的新特性,变量类型会在运行时进行解析。
  • ViewBag进本上是ViewData的包装,也是用来从Controller向View来传递值的。
  • VeiwBag也只是在当前的请求中有效。
  • 在重定向(Redirection)后,ViewBag中存储的变量值将变为null。
  • 因为ViewBag是动态类型,所以我们在取得其值时不需要进行类型转换。

同样,我们来通过一个简单的例子来演示一下如何利用ViewBag从Controller向View传递数据。

1 public ActionView Index()
2 {
3     ViewBag.Message = "This is a message from ViewBag.";
4 
5     return View();  
6 }

然后我们在视图中取出数据并显示:

1 <div>
2     @ViewBag.Message
3 </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.通过转到定义我们可以看到:

1 [Dynamic]
2 public dynamic ViewBag { get; }
3 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类,如下

1 public class Customer
2 {
3     public int Id { get; set; }
4     public string Code {  get; set; }
5     public double Amount {  get; set; }
6 }

然后在Controller中加入如下代码:

 1 public ActionView DisplayCustomer1
 2 {
 3     Customer customer = new Customer
 4     {
 5         Id = 1001,
 6         Code = "100101",
 7         Amount = 100
 8      };
 9 
10     TempData["Customer"] = customer;
11 
12     return RedictToAction("DisplayCustomer2");
13 }
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也可以得到同样的结果。

 1 public AcionView DisplayCustomer1
 2 {
 3     Customer customer = new Customer
 4     {
 5          Id = 1001,
 6          Code = "10011",
 7          Amount = 100
 8     };
 9 
10     Session["OneCustomer"] = customer;
11 
12     return RedictToAction("DisplayCustomer2");
13 }
14 
15 public ActionResult DisplayCustomer2
16 {
17     Customer customer = Session["OneCustomer"] as Customer;
18 
19     return View(customer);
20 }

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
posted @ 2015-03-19 13:52  鱼不吐泡泡  阅读(1846)  评论(0编辑  收藏  举报