在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 |