ViewData เป็น Dictionary ของ Objects ที่เก็บและเรียกข้อมูลโดยใช้ String เป็น Key ใช้สำหรับส่งข้อมูลจาก Controller ไป View เนื่องจาก ViewData เป็น Dictionary จึงมี Key-Value Pairs โดย Key ต้องเป็น String เสมอ ViewData ส่งข้อมูลจาก Controller ไป View เท่านั้น ไม่ใช่สองทาง Valid เฉพาะระหว่าง Current Request เท่านั้น
การเก็บข้อมูลใน ViewData
ViewData["countries"] = countriesList;
การดึงข้อมูลจาก ViewData
string country = ViewData["MyCountry"].ToString();
ViewData ไม่ให้ Compile-time Error Checking เช่น ถ้าเราสะกด Key ผิด จะไม่ได้ Compile Error จะรู้ Error ตอน Runtime เท่านั้น
Controller
using System.Collections.Generic;
using System.Web.Mvc;
namespace DemoMvcApplication.Controllers {
public class HomeController : Controller {
public ViewResult Index() {
ViewData["Countries"] = new List {
"India", "Malaysia", "Dubai", "USA", "UK"
};
return View();
}
}
}
View
@{
ViewBag.Title = "Countries List";
}
Countries List
@foreach(string country in (List)ViewData["Countries"]) {
- @country
}
Output

ViewData vs ViewBag vs TempData
| Feature | ViewData | ViewBag | TempData |
|---|---|---|---|
| Type | Dictionary<string, object> | Dynamic | Dictionary<string, object> |
| Syntax | ViewData["Key"] | ViewBag.Key | TempData["Key"] |
| Compile-time Check | ไม่มี | ไม่มี | ไม่มี |
| Lifetime | Current Request | Current Request | Next Request (Survives Redirect) |
| Type Casting | ต้อง Cast | ไม่ต้อง Cast | ต้อง Cast |
| Null Handling | Null Reference Exception | Null Reference Exception | Null ได้ |
Best Practices
- ใช้ ViewModel/Strongly Typed View แทน ViewData/ViewBag สำหรับข้อมูลหลัก (Compile-time Safety, IntelliSense, Refactoring)
- ใช้ ViewData/ViewBag สำหรับข้อมูลเล็กๆ น้อยๆ เช่น Page Title, Breadcrumb, Flags
- ใช้ TempData สำหรับข้อมูลที่ต้องส่งผ่าน Redirect (PRG Pattern)
- หลีกเลี่ยง Magic Strings - ใช้ Constants หรือ nameof()
// ดีกว่า Magic Strings
public static class ViewDataKeys {
public const string Countries = "Countries";
public const string PageTitle = "PageTitle";
}
// Usage
ViewData[ViewDataKeys.Countries] = countries;
var title = ViewData[ViewDataKeys.PageTitle] as string;