# [ASP.NET] ViewData、ViewBag、TempData 整理
## 前言
對 ViewData、ViewBag、TempData 做簡單的整理,並且透過實作來熟悉。
## 範例準備
建立範例用的 DataController和 Index、Read 的 Action,再建立對應的 View (Index.cshtml、Read.cshtml)。
* DataController.cs
```csharp=
public class DataController : Controller
{
public ActionResult Index()
{
//範例學生資料
List<Student> data = new List<Student>
{
new Student { Id = 1, Name = "JJ" },
new Student { Id = 2, Name = "JJay" }
};
return View();
}
public ActionResult Read()
{
return View();
}
}
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
}
```
頁面說明:
* Index Action 用來實作存放資料的邏輯。
* Read Action 及 Read.cshtml 用來實作資料的讀取。
## ViewData
採用 key-value 的形式存放資料,型別為 ViewDataDictionary,本質上就是 Dictionary。
* 修改 Index Action,將 data 存放在 ViewData 中
```csharp=
public ActionResult Index()
{
List<Student> data = new List<Student>
{
new Student { Id = 1, Name = "JJ" },
new Student { Id = 2, Name = "JJay" }
};
ViewData["Data"] = data;
return View();
}
```
* 修改 Read.cshtml,利用 Razor 語法,在畫面端撰寫讀取邏輯
```csharp=
@{
List<Student> students = ViewData["Data"] as List<Student>;
foreach (Student student in students)
{
<div>@student.Id--@student.Name</div>
}
/*輸出*/
//1--JJ
//2--JJay
}
```
<font color="red"> **注意:在讀取 ViewData 時,需要將資料進行轉型成強型別**</font>
## ViewBag
使用方式與 ViewData 相同,差別在於讀取時不需執行強型別的轉換。
* 修改 Action,根據 ViewData 的範例,改為以 ViewBag 存放 data 資料
```csharp=
public ActionResult Index()
{
List<Student> data = new List<Student>
{
new Student { Id = 1, Name = "JJ" },
new Student { Id = 2, Name = "JJay" }
};
ViewBag["Data"] = data;
return View();
}
```
* Read.cshtml
```csharp=
@{
foreach (Student student in ViewBag["Data"])
{
<div>@student.Id--@student.Name</div>
}
/*輸出*/
//1--JJ
//2--JJay
}
```
## TempData
TempData 的功能一樣是用來暫存資料,在使用時也需要轉型成強型別。
* Index Action 中的資料改以 TempData 存放
```csharp=
public ActionResult Index()
{
List<Student> data = new List<Student>
{
new Student { Id = 1, Name = "JJ" },
new Student { Id = 2, Name = "JJay" }
};
TempData["Data"] = data;
return View();
}
```
* Read.cshtml 讀取
```csharp=
@{
if(TempData("Data") != null) {
foreach (Student student in TempData("Data"))
{
<div>@student.Id--@student.Name</div>
}
}
/*輸出*/
//1--JJ
//2--JJay
}
```
* **TempData 使用上的重點紀錄**
1. 可跨請求來存取 TempData 的資料
2. 資料被讀取後就會被清空,所以讀取前要加上 Null 判斷
3. 若資料都沒有被讀取,則會保留到被讀取或 Session 過期為止
4. 若要在讀取後,仍保留資料,則需使用 Peek 或 Keep 方法
### Peek 方法
Peek 可以用來讀取資料並且將其標示為保留,使用方法如下:
```csharp=
var data = TempData.Peek("key");
/*
* 參數:傳入資料的key
* 回傳值:指定key存放的資料
* */
```
### Keep 方法
Keep 可以在讀取資料過後,標視為保留,使用方法如下
```csharp=
var data = TempData["key"];
TempData.Keep("key");
```
###### tags: `ASP.NET` `MVC`