ASP.MVC ViewBag VS ViewData

前言:

雖然一直以來學習MVC的人都知道,從Controller可以透過ViweBag 或者 ViweData 傳遞資料給View,但這兩者到底差異是什麼,其實我也沒有很仔細爬過文章,身邊的朋友也都說沒差,但我覺得如果兩個東西完完全全沒有差異,那幹嘛要兩個都存在?所以我決定認真爬文,並把吸收到的東西做一個彙整,將來如果有人問我ViewBag跟ViewData差異是什麼我也可以回答他,同時當作是知識管理,忘了也可以回頭再複習。

ViewBag:

dynamic 型別,在編譯時期不檢查,可在執行時才會判斷真正的型別,但其實 ViewBag 骨子裡是 ViewData 的包裝類別,因為ViewBag 依賴 DynamicViewDataDictionary類別,但 DynamicViewDataDictionary 創建時(建構子)需要一個 ViewDataDictionary ,而 ViewData 的型別是ViewDataDictionary,所以其實 ViewBag 是間接操作 ViewData,所以使用上的效能會比 ViewData 來的慢,而網路上討論的後蓋前的問題,最終是因為他們操作的是同一個物件,Key / Value,而當key相同則會把Value覆蓋掉,另外 ViewBag 在 View 的頁面使用時不需要進行類型轉換,生命週期則是頁面導向後就被清除
//Controller
public ActionResult Index()
{
    ViewBag.Name = "Mickey";    
    return View();
}
//View
@foreach (string strNames in ViewBag.Name)
{
    @strNames
}

ViewData:

ViewDataDictionary,一樣可以放任何資料,使用key / Value,效能上比 ViewBag 快,但在 View 頁面使用時必須轉型,生命週期則是頁面導向後就被清除
//Controller
public ActionResult Index()
{
    ViewData["Name"] = "Mickey";    
    return View();
}
//View
@foreach (string strName in (string)ViewData["Name"])
{
    @strName 
}

基本上這兩個都是弱型別,Key / Value 方式存取,所以如果手誤,不小心將key打錯程式就會GG,所以還是建議盡量使用ViewModel來傳遞資料比較合適

另外有看到一篇 ViewBag特殊用法  

相關參考連結:

[探索 10 分鐘] 寫點有關 ASP.NET MVC ViewModel, ViewData, ViewBag, TempData 的代碼
What is ViewData, ViewBag and TempData? 
ViewData和ViewBag的那些事