ViewData và ViewBag trong ASP.NET Core là những tập hợp dữ liệu dạng weak types (hay còn gọi là loose types), tức là chúng ta không cần định nghĩa trước kiểu dữ liệu một cách rõ ràng. Một số trường hợp sử dụng ViewBag và ViewData:
Truyền dữ liệu giữa ... | Ví dụ | |
Controller và View | Truyền dữ liệu vào một Dropdown List (Select box). | |
View và Layout View | Thiết lập lại nội dung của element | trong Layout View từ một View con. |
Partial View và View | Một Widget hiển thị dữ liệu phụ thuộc vào trang mà người dùng truy cập. |
Vì là weak types nên ViewBag và ViewData chỉ được xử lý lúc runtime và sẽ không có kiểm tra kiểu dữ liệu lúc compile-time như viewmodel nên sẽ dễ bị lỗi hơn. Do đó chúng ta chỉ nên sử dụng chúng khi cần truyền một lượng dữ liệu nhỏ và dễ kiểm soát.
Chú ý là ViewBag không sử dụng được trong Razor Pages.
ViewData
Là một ViewDataDictionary object được truy xuất qua một string key (cho phép có khoảng trắng). Với kiểu dữ liệu dạng string thì chúng ta có thể lưu trữ và sử dụng trực tiếp, còn với kiểu dữ liệu dạng object thì khi sử dụng chúng ta sẽ phải ép kiểu (cast) sang kiểu dữ liệu xác định. Ví dụ khi truyền một object từ Controller sang View:
// Controller
public IActionResult SomeAction()
{
// Lưu dữ liệu kiểu string
ViewData["Greeting"] = "Hello";
// Lưu dữ liệu kiểu object
ViewData["Address"] = new Address()
{
Name = "Huy",
City = "Hanoi",
};
return View();
}
Sử dụng ViewData bên View:
@{
// Address không phải là 1 string nên sẽ cần ép kiểu
var address = ViewData["Address"] as Address;
}
@ViewData["Greeting"] World!
@address.Name
@address.City
ViewBag
Là một DynamicViewData object, nó là một lớp bao bọc (wrap) ViewData để cho phép truy cập vào object một cách linh hoạt. ViewBag cũng cho phép chúng ta sử dụng dynamic properties (dùng dấu chấm thay vì ngoặc vuông như ViewData). Sử dụng ViewBag cũng tương tự như ViewData nhưng sẽ tiện lợi hơn vì nó không cần phải ép kiểu. Ví dụ:
// Controller
public IActionResult SomeAction()
{
// Lưu dữ liệu kiểu string
ViewBag.Greeting = "Hello";
// Lưu dữ liệu kiểu object
ViewBag.Address = new Address()
{
Name = "Huy",
City = "Hanoi",
};
return View();
}
Sử dụng ViewBag bên View:
@ViewBag.Greeting World!
@ViewBag.Address.Name
@ViewBag.Address.City
Bình luận