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來傳遞這份數據。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM