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

  在ASP.NET MVC中,頁面間Controller與View之間主要有如下幾種小量數據的傳值方式:ViewData、ViewBag、TempData和Session變量。html

  下面就這四種傳值方式作出詳細介紹。數組

1、ViewData緩存

  • ViewData是一個繼承自ViewDataDictionary類的Dictionary對象,它只能存儲String Key/Object Value字典數組。
  • ViewData是從Controller向對應的View傳遞值。
  • ViewData的值只在當前的請求中有效,生命週期和View相同,其值不能再多個請求中共享。
  • 在重定向(Redirection)後,ViewData中存儲的變量值將變爲null。
  • 在取出ViewData中的變量值時,必須進行合適的類型轉換和空值檢查。

下面咱們來看一個簡單的例子,演示一下如何使用ViewData來從Controller向View傳值。session

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

而後咱們在視圖中使用這個變量:less

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

綜上,ViewData更適合從Controller向View傳遞簡單對象數據時使用。ide

2、ViewBagpost

  • ViewBag是一個動態類型變量(dynamic),這是C# 4.0引入的新特性,變量類型會在運行時進行解析。
  • ViewBag進本上是ViewData的包裝,也是用來從Controller向View來傳遞值的。
  • VeiwBag也只是在當前的請求中有效。
  • 在重定向(Redirection)後,ViewBag中存儲的變量值將變爲null。
  • 由於ViewBag是動態類型,因此咱們在取得其值時不須要進行類型轉換。

一樣,咱們來經過一個簡單的例子來演示一下如何利用ViewBag從Controller向View傳遞數據。spa

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

而後咱們在視圖中取出數據並顯示:code

1 <div>
2     @ViewBag.Message
3 </div>

綜上,ViewBag更適合從Conroller向View傳遞複雜數據時使用,由於取出存儲在其中的數據變量時無需進行類型轉換。htm

3、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讀取速度快。

4、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或者頁面重定向時共享傳遞數據時使用。

5、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共享數據(非敏感數據)時使用。

6、圖說傳遞數據的生命週期

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
相關文章
相關標籤/搜索