掉進 ASP.NET MVC 馬里亞納海溝的第三天:Controller 傳資料給 View
前言
Controller 傳資料給 View 有四種方法:ViewBag、ViewData、TempData、ViewModel。
ViewBag
定義
ViewBag 是個沒有預先設定好屬性的動態型別物件。如果有拼字錯誤時,編譯時不會報錯;執行時才能看到錯誤畫面。
1 | ViewBag.屬性名稱 |
Controller
在 Action 中 ViewBag 用 . 連接自定義的名稱,並將資料儲存進去:
1 | // ../Controller/HomeController.cs |
View
在視圖檔案 .cshtml
中,可以用 ViewBag.屬性名稱
接收資料,並且呈現在畫面上。但是,注意到以 @ 開頭的語法,這些不是 HTML 語法,它屬於 Razor View Engine,也就是 Razor 檢視引擎。Razor 以 @ 幫助內嵌 C# 程式碼到 HTML 標籤語言中。
1 | <!-- ../Views/Home/Index.cshtml 中 --> |
ViewData
定義
ViewData 是字典型別物件,可以透過 key-value 的方式儲存資料。如果有拼字錯誤時,編譯時不會報錯;執行時才能看到錯誤畫面。
1 | ViewData["key"] |
Controller
使用自定義的名稱 (key) 將資料 (value) 儲存進去:
1 | // ../Controller/HomeController.cs |
View
在視圖檔案 .cshtml
中,可以用 ViewData["key"]
接收資料,並且呈現在畫面上。記得以 @ 開頭。
1 | <!-- ../Views/Home/Index.cshtml 中 --> |
ViewBag 和 ViewData 不能在不同的 Action 間互相傳值,如果要跨 Action 傳值只能使用 TempData。
TempData
定義
也是字典型別物件。關於 TempData 特殊的用處、存在時間,之後再進一步研究。
1 | TempData["key"] |
View
在視圖檔案 .cshtml
中,可以用 TempData["key"]
接收資料,並且呈現在畫面上。記得以 @ 開頭。
1 | <!-- ../Views/Home/Index.cshtml 中 --> |
ViewBag、ViewData 和 TempData 名稱重複
ViewBag 和 ViewData 名稱重複,後面新儲存的值會覆蓋掉舊的值。
TempData 沒有影響。
名稱重複,但是值都不一樣。
最後呈現的結果,在 ViewBag 和 ViewData 之間如果名稱重複,新儲存的值覆蓋掉舊的值。
ViewModel
這是一種強型別的物件,之後再研究。
參考資料:
ViewBag 101: How It Works, When It’s Used, Code Examples, and More