一、说明
本文章主要是讲解asp.net mvc中ViewBag、ViewData和TempData的使用和区别,ViewBag、ViewData和TempData常常用于将action方法中的数据传递到view界面。 从MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData。MVC3中保留了ViewData的使用。ViewBag 是动态类型(dynamic),ViewData 是一个字典型的(Dictionary)。
二、区别
ViewBag 不再是字典的键值对结构,而是 dynamic 动态类型,它会在程序运行的时候动态解析。只是ViewData为object型,而ViewBag为dynamic型。而dynamic型与object型的区别则是在使用时它会自动根据数据类型转换,而object型则需要我们自己去强制转换。
同ViewData和ViewBag一样,TempData也可以用来向视图传递数据。只是ViewData和ViewBag的生命周期和View相同,只对当前View有用,且不能在不同的action之间进行传值。而TempData则可以在不同的Action中进行传值,类似webform里的Seesion
三、使用示例
1、ViewBag的使用
控制器代码
1 public class HomeController : Controller 2 { 3 // 4 // GET: /Home/ 5 public ActionResult Index() 6 { 7 string[] myArray = {"one","two","three" }; 8 ViewBag.myItem = myArray; 9 return View(); 10 } 11 }
view视图代码如下:
1 @{ 2 ViewBag.Title = "Index"; 3 } 4 5 <h2>Index</h2> 6 <h1>以下是ViewBag的用法</h1> 7 <ul> 8 @foreach (var item in ViewBag.myItem) 9 { 10 <li>@item</li> 11 } 12 </ul>
运行效果
2、ViewData
控制器代码
1 public class HomeController : Controller 2 { 3 // 4 // GET: /Home/ 5 public ActionResult Index() 6 { 7 string[] myArray = {"one","two","three" }; 8 ViewData["myItem"] = myArray; 9 return View(); 10 } 11 12 }
Index.cshtml代码如下:
<h1>以下是viewdata的用法</h1>
<ul>
@foreach(var item in (string[])ViewData["myItem"])
{
<li>@item</li>
}
</ul>
注意:应用ViewData["myItem"]时,要记得类型转换比如 :(string[])
运行效果:
3、TempData在action传数据到view的应用
控制器代码
1 public class HomeController : Controller 2 { 3 // 4 // GET: /Home/ 5 6 public ActionResult Index() 7 { 8 string[] myArray = {"one","two","three" }; 9 TempData["myItem"] = myArray; 10 return View(); 11 } 12 13 }
Index.cshtml页面代码如下:
<h1>以下是TempData的用法</h1>
<ul>
@foreach(var item in (string[])TempData["myItem"])
{
<li>item is :@item</li>
}
</ul>
注意:应用TempData["myItem"]时,要记得类型转换比如 :(string[])
运行效果:
4、TempData在action间传递数据的应用
控制器代码:
在控制器代码中,在action Index中定义的数据, TempData["myItem"] = myArray;被传递到action Search方法中
1 public ActionResult Index() 2 { 3 string[] myArray = {"one","two","three" }; 4 TempData["myItem"] = myArray; 5 return View(); 6 } 7 public ActionResult Search() { 8 return View(TempData["myItem"]); 9 }
Search.cshtml页面的代码
<h2>Search</h2>
<ul>
@foreach(var item in (string[])TempData["myItem"])
{
<li>item is :@item</li>
}
</ul>
运行效果:
需要注意的是:TempData["myItem"]中的数据,只能被提取、引用一次,再次刷新界面,都会报错,因为TempData["myItem"]中的数据已经被删除。