在ASP.NET MVC中,頁面間Controller與View之間主要有如下幾種小量數據的傳值方式:ViewData、ViewBag、TempData和Session變量。html
下面就這四種傳值方式作出詳細介紹。數組
1、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從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
下面,咱們來透過一個例子來演示一下如何在兩個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
咱們仍然使用上面的例子,假如咱們不用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 |