掉進 ASP.NET MVC 馬里亞納海溝的第三天:Controller 傳資料給 View

前言

Controller 傳資料給 View 有四種方法:ViewBag、ViewData、TempData、ViewModel

ViewBag

定義

ViewBag 是個沒有預先設定好屬性動態型別物件。如果有拼字錯誤時,編譯時不會報錯;執行時才能看到錯誤畫面。

1
ViewBag.屬性名稱

Controller

在 Action 中 ViewBag 用 . 連接自定義的名稱,並將資料儲存進去:

1
2
3
4
5
6
// ../Controller/HomeController.cs

public ActionResult Index(){
ViewBag.MyDefinedName = "ViewBag 用 . 連接自定義的名稱";
return View();
}

View

在視圖檔案 .cshtml 中,可以用 ViewBag.屬性名稱 接收資料,並且呈現在畫面上。但是,注意到以 @ 開頭的語法,這些不是 HTML 語法,它屬於 Razor View Engine,也就是 Razor 檢視引擎Razor 以 @ 幫助內嵌 C# 程式碼到 HTML 標籤語言中。

1
2
<!-- ../Views/Home/Index.cshtml 中 -->
<p>@ViewBag.MyDefinedName</p>

ViewData

定義

ViewData 是字典型別物件,可以透過 key-value 的方式儲存資料。如果有拼字錯誤時,編譯時不會報錯;執行時才能看到錯誤畫面。

1
ViewData["key"]

Controller

使用自定義的名稱 (key) 將資料 (value) 儲存進去:

1
2
3
4
5
// ../Controller/HomeController.cs
public ActionResult Index(){
ViewData["DefinedName"] = "ViewData 在 [] 中放入自定義的名稱字串";
return View();
}

View

在視圖檔案 .cshtml 中,可以用 ViewData["key"] 接收資料,並且呈現在畫面上。記得以 @ 開頭。

1
2
<!-- ../Views/Home/Index.cshtml 中 -->
<p>@ViewData["DefinedName"]</p>

ViewBag 和 ViewData 不能在不同的 Action 間互相傳值,如果要跨 Action 傳值只能使用 TempData。

TempData

定義

也是字典型別物件。關於 TempData 特殊的用處、存在時間,之後再進一步研究。

1
2
3
4
5
6
7
8
9
10
TempData["key"]
````
### Controller
使用自定義的名稱 (key) 將資料 (value) 儲存進去:
```csharp
// ../Controller/HomeController.cs
public ActionResult Index(){
TempData["MyData"] = "Test TempData ~";
return View();
}

View

在視圖檔案 .cshtml 中,可以用 TempData["key"] 接收資料,並且呈現在畫面上。記得以 @ 開頭。

1
2
<!-- ../Views/Home/Index.cshtml 中 -->
<p>@TempData["MyData"]</p>

ViewBag、ViewData 和 TempData 名稱重複

ViewBag 和 ViewData 名稱重複,後面新儲存的值會覆蓋掉舊的值。
TempData 沒有影響。

名稱重複,但是值都不一樣。

最後呈現的結果,在 ViewBag 和 ViewData 之間如果名稱重複,新儲存的值覆蓋掉舊的值。

ViewModel

這是一種強型別的物件,之後再研究。

參考資料:
ViewBag 101: How It Works, When It’s Used, Code Examples, and More