asp.net mvc 3.0 知识点整理 ----- (1).TempData,ViewData和ViewBag的区别
阔别一年多的时间,没有静下心来学习,也很久没有写博文。最近由于合同要到期了,也打算要跳槽了。于是想结合之前工作中的开发经验,重新看一遍书本知识,梳理下重点概念,加深理解。
本系列主要是整理了一些比较重要和比较容易出错的概念,结合书本和网络上前辈们写的例子,供自己和刚入门的朋友参考。有写的不对的地方还请前辈斧正!
在asp.net mvc 3.0中,有几个绑定控制器的数据到视图页面的实体(TempData,ViewData和ViewBag等),其区别和基本用法比较容易混淆。三者都是保存控制器中的数据,在视图中使用的。
区别如下:
TempData:TempDataDictionary的一个实体,保存在Session中,也是以键值对的结构存在。
ViewData:ViewDataDictionary的一个实体,以键值对的结构存在。
ViewBag:dynamic([daɪ'næmɪk])动态类型,能够动态解析。
如下代码:
string[] items = new string[] { "one", "two", "three" }; ViewBag.Items = items; ViewData["Items"] = items;
由调试可以发现:
ViewBag中用的是dynamic类型,因此可以自动根据数据类型转换。
<ul> @foreach (dynamic p in ViewBag.Items) { <li>The item is: @p</li> } </ul>
而ViewData中用的是object对象,要自己去强制转换类型才可以遍历使用。
<ul> @foreach (string a in (string[])ViewData["Items"]) { <li>The item is: @a</li> } </ul>
如下,有两个Action方法:
public ActionResult Index() { this.TempData["Name"] = "Julian"; return View(); }
public ActionResult Index2() { string name = this.TempData["Name"] as string; return View(); }
Index()中,给TempData添加了一个键值对。假设请求了这个Action后,接着请求Index2这个Action。则可以在Index2中,获取到TempData的键值对的信息。
有趣的是,如果再一次请求Index2,那么从TempData中读取到的Name的值为Null。
通过上面几个简单的例子,我们可以从生命周期来看:
(1).ViewData和ViewBag的生命周期和View相同,只能在当前View中使用。当本次请求结束后,就会自动清空值。
(2).TempData则可以在不同的Action中进行传值,类似Webform中的Session,TempData的值在取了一次后则会自动删除。
TempData的特性就是可以在两个Action之间传递数据,它会保存一份数据到下一个Action,并随着再下一个Action的到来而失效。所以它被用在两个Action之间来保存数据。比如,这样一个场景,你的一个Action接受一些post的数据,然后交给另一个Action来处理,并显示到页面,这时就可以使用TempData来传递这份数据。