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来传递这份数据。

 

posted @ 2014-06-27 21:09  然嗄  阅读(3230)  评论(0编辑  收藏  举报