[ASP.NET MVC] ASP.NET MVC 傳遞資料容器(一) - ViewData vs ViewBag

呼呼!趁期中考前一週衝刺一下進度,上一篇寫到了如何開始我們的第一支 ASP.NET MVC 應用程式,接下來想跟大家分享一下傳遞資料的部份,不知道大家還記不記得 Controller 和 View 之間的關係,之前有提到 Controller 會負責決定要將執行結果返回哪個 View ,而 View 的功能就是接收 Controller 所傳遞過來的資料然後顯示。就像我們前端後端的概念那樣,我們今天在後端做了些運算而最後要如何顯示到頁面前端讓使用者看見呢?

所以接下來跟大家介紹在 ASP.NET MVC 中,有哪些物件可以讓我們在 Controller 和 View 或 Controller 和 Controller 之間傳遞資料吧 ~

前言

呼呼!趁期中考前一週衝刺一下進度,上一篇寫到了如何開始我們的第一支 ASP.NET MVC 應用程式,接下來想跟大家分享一下傳遞資料的部份,不知道大家還記不記得 Controller 和 View 之間的關係,之前有提到 Controller 會負責決定要將執行結果返回哪個 View ,而 View 的功能就是接收 Controller 所傳遞過來的資料然後顯示。就像我們前端後端的概念那樣,我們今天在後端做了些運算而最後要如何顯示到頁面前端讓使用者看見呢?

所以接下來跟大家介紹在 ASP.NET MVC 中,有哪些物件可以讓我們在 Controller 和 View 或 Controller 和 Controller 之間傳遞資料吧 ~

認識物件

在 ASP.NET MVC 裡,有提供了幾種物件來讓我們達到傳遞資料的方法,我們常用的定義如下:

  • Controller 和 View - ViewData、ViewBag、ViewModel、TempData
  • Controller 和 Controller (指每個 Request 請求) - TempData

ViewData 物件

屬於 Dictionary Object ,能放入任何資料,使用 Key / Value 的概念存取。

ViewBag 物件

它和 ViewData 一樣,使用 Key / Value 存取,並能放入任何的資料,但不同的是,它能產生「動態屬性」。

TempData 物件

TempData 由字面上的意思看來,及告訴我們是「暫存」的資料,而暫存又是暫存多久?其實就是一次的請求,假定我們今天輸入網址 /Home/Index 而透過 Redirect 的方法轉向至 /Home/About ,若是用 ViewData 或 ViewBag 資料及會消失,但若透過 TempData 它能將資料傳遞至 /Home/About 供其使用,而最後返回頁面後 TempData 內的資料隨即消失,代表它的生命週期只有一次性,當使用一次我們就丟掉它。

動手做做看

1.首先我們先在HomeController先加入一個 Action

 //在 ASP.NET MVC 的 Controller 中,
 //每個 fucntion 我們稱它為「Action」。
 public ActionResult Hello()
 {
    //PS:ViewData和ViewBag內的資料都是透過Key/Value的方法來存取,
    //但請注意在同個頁面中他們的key值還是不能重複,否則將會出現問題。


    //正確版
    ViewData["Hello"] = "Hello World";
    ViewBag.MVC = "Hello MVC"; // ViewBag 使用的動態產生的屬性

    //問題版-重複key值
    ViewData["Error"] = "Error 1";
    ViewBag.Error = "Error 2";

    return View();
 }

2.加入 Action 的檢視 ,在 Action 區塊內按右鍵 --> 加入檢視

3.檢視名稱基本上不用變更,然後直接按加入

4.我們在建立的 View 中加入下列程式碼:

5.接下來我們直接按執行,並到 /Home/Hello ,大家可以發現一開始我們針對 ViewData["Error"] 和 ViewBag.Error 指定了不同的值,但最後因為兩者之間共用的 Key / Value 是相同的,所以原先的 ViewData["Error"] 就被蓋了過去,最後顯示的值是 Error 2 。

ViewData["Error"] = "Error 1";
ViewBag.Error = "Error 2";

總結

做完這些範例抬頭看時間發現都快凌晨一點了,我想剩下 TempData 的示範就留倒下一篇介紹吧。而這篇介紹的傳遞資料方式不過就只是最基礎的應用,我想把觀念建立清楚還是重要的,大家不妨可以試試看丟不同的資料給 ViewData 或 ViewBag 來傳遞,但上面介紹的幾種傳遞資料方式還是建議是傳遞「小量的資料」,若是要傳遞的資料是更複雜或是更大量的話,那就會建議使用 ViewModel 來傳遞,至於這部份......就留在後面在介紹吧。


新手發文,如有錯誤煩請告知,感謝。
如果喜歡我的文章請按推薦,有任何問題歡迎下面留言~~~

 

 

簽名:

學習這條路很廣,喜歡什麼技術不重要,重要的是你肯花時間去學習