ViewBag và ViewData trong ASP.NET Core
View cần lấy dữ liệu từ Controller. Một trong những cách truyền dữ liệu sang View là sử dụng đối tượng ViewData hoặc ViewBag. Bài này chúng ta sẽ tìm hiểu cách dùng ViewBag và ViewData.
ViewData là gì?
ViewData là một thuộc tính của Controller base class, nó trả về một đối tượng ViewDataDictionary. ViewDataDictionary như tên của nó là một đối tượng dictionary cho phép lưu dữ liệu dạng key-value. Key phải là một chuỗi không phân biệt chữ hoa thường. Để truyền dữ liệu vào view bạn cần gán giá trị vào dictionary sử dụng key. Bạn có thể lưu bất kỳ số lượng key-value nào cần thiết trong ViewData.
ViewData truyền dữ liệu sang View từ Controller. Khi bạn gọi phương thức View trong Controller action, ViewData sẽ tự động gán vào View. Trong View bạn có thể truy cập giá trị được lưu trong ViewData cũng sử dụng key. Dữ liệu được lưu trong ViewData tồn tại chỉ trong request đó. Khi View được tạo xong cho client thì đối tượng ViewData đó cũng bị hủy.
Sử dụng ViewData như thế nào?
Trong ví dụ dưới đây nêu cách dùng ViewData trong Controller action:
public IActionResult SomeAction()
{
ViewData["Greeting"] = "Hello World!";
return View();
}
Trong ví dụ trên, chúng ta thêm chữ "Hello World" vào ViewData sử dụng key là "Greeting". Bạn có thể gọi phương thức dưới đây trong View để nhận giá trị từ key "Greeting":
@ViewData["Greeting"]
Gán đối tượng cho ViewData
Trong ví dụ trên, chúng ta lưu chuỗi dư liệu vào ViewData. Chuỗi dữ liệu có thể được dùng trực tiếp mà không cần chuyển kiểu. Bạn có thể lưu bất cứ kiểu nào của dữu liệu như kiểu số nguyên, kiểu logic hay đối tượng trong ViewData.
Để sử dụng như một kiểu dữ liệu khác thì bạn cần phải chuyển kiểu giá trị từ ViewData sang kiểu tương ứng khi bạn dùng nó. Ví dụ dưới đây nêu cách dùng ViewData để gán đối tượng từ Controller sang View:
public IActionResult Index()
{
ViewData["Greeting"] = "Hello World";
ViewData["Product"] = new ProductModel()
{
ProductID=1,
Name = "Samsung galaxy Note",
Brand = "Samsung",
Price = 19000
};
return View();
}
Trong View, chúng ta lấy sản phẩm từ ViewData và chuyển sang kiểu ProductModel và sử dụng nó:
@{
// Since Product isn't a string, it requires a cast.
var product = ViewData["Product"] as ProductModel;
}
@ViewData["Greeting"]!
@product.ProductID<br>
@product.Name<br>
@product.Brand<br>
@product.Price<br>
Bạn có thể dùng ViewData để gán dữ liệu từ Controller vào View bao gồm cả Partial View và Layout.
ViewBag là gì?
Bạn đã thấy từ ví dụ trước chúng ta có thể lưu bất cứ thứ gì trong ViewDataDictionary, nhưng để truy cập được bất cứ thứ gì trong ViewData chúng ta cần phải chuyển kiểu dữ liệu.
ViewBag sử dụng kiểu động (dynamic) mà chúng ta đã có trong phiên bản C# 4.0. Nó là một vỏ bọc của ViewData và cung cấp thuộc tính động cho ViewData.
ViewBag có thể tiện dụng hơn để làm việc mà không cần chuyển kiểu. Sử dụng ViewBag như sau:
public IActionResult SomeAction()
{
ViewBag.Greeting = "Hello";
ViewBag.Product = new ProductModel()
{
ProductID = 1,
Name = "Samsung galaxy Note",
Brand = "Samsung",
Price = 19000
};
return View();
}
Sau đó bạn sử dụng trong View:
@ViewBag.Greeting World <br>
@ViewBag.product.ProductID<br>
@ViewBag.product.Name<br>
@ViewBag.product.Brand<br>
@ViewBag.product.Price<br>
ViewBag và ViewData
Cả ViewBag và ViewData đều sử dụng ViewDataDictionary bên dưới. Vì thế bạn có thể sử dụng cả hai hoặc kết hợp chúng khi đọc hoặc ghi chúng. Ví dụ:
ViewData["Greeting"] = "Hello World";
Và nhận giá trị ở view sử dụng ViewBag:
@ViewBag.Greeting
Sự khác nhau giữa ViewData và ViewBag
ViewData sử dụng cú pháp Dictionary để truy cập giá trị trong khi ViewBag sử dụng cú pháp truy cập giống truy cập thuộc tính của đối tượng. ViewData dẫn xuất từ ViewDataDictionary, nó có thuộc tính của dictionary như ContainsKey, Add, Remove và Clear.
ViewBag thì nhận từ DynamicViewData và nó cho phép tạo động các thuộc tính sử dụng dấu chấm (@ViewBag.SomeKey = <giá trị>) và không cần chuyển kiểu. Cú pháp của ViewBag giúp thêm giá trị nhanh hơn trong Controller và view.
ViewData cho phép sử dụng khoảng trắng trong Key vì nó là một chuỗi. Ví dụ ViewData["Some Key With Namespace"]. Nhưng ViewBag thì không thể.
ViewData cần phải chuyển kiểu dữ liệu khi không phải là một chuỗi. Nó cũng cần phải kiểm tra giá trị null để tránh lỗi. Check null đơn giản hơn trong ViewBag. Ví dụ: @ViewBag.Person?.Name.
Khi nào sử dụng ViewBag và ViewData
ViewData và ViewBag đều là các tùy chọn hữu ích khi bạn muốn gán lượng dữ liệu nhỏ từ Controller sang View. Chọn cái nào thường hay tùy thuộc thói quen. Điểm yếu của cả ViewBag và ViewData là chúng giải quyết vấn đề động ở thời điểm runtime. Nó không kiểm tra kiểu ở lúc biên dịch (complie time). Vì thế tăng khả năng gây lỗi.
ViewData và ViewBag có thể truyền dữ liệu từ Controller sang View. Nó không thể truyền ngang từ Controller này sang Controller kia được.
Trích nguồn từ: https://www.tektutorialshub.com/
Tags:
Bài viết liên quan
Xây dựng menu đa cấp với ASP.NET Core MVC
Cách xây dựng menu đa cấp sử dụng đệ quy trong ASP.NET Core MVC
Đọc thêm
Tìm hiểu về ABP Framework, một framework mã nguồn mở trên .NET
ABP Framework là một framework hoàn chỉnh để xây dựng ứng dụng web hiện đại bằng cách áp dụng các best practice và tiêu chuẩn trong phát triển phần mềm.
Đọc thêm
Tìm lỗi ứng dụng ASP.NET Core trên Windows Server sử dụng stdout log
Một số lỗi trong lúc khởi động hệ thống ASP.NET Core trên Windows Server mà chúng ta chưa rõ nguyên nhân tại sao ứng dụng không hoạt động. Vậy bạn có thể dùng đểns stdout để chẩn đoán lỗi.
Đọc thêmVòng đời của Dependency Injection: Transient, Singleton và Scoped
Hiểu về vòng đời của các service được tạo sử dụng Dependency Injection là rất quan trọng trước khi sử dụng chúng.
Đọc thêm
Cơ chế Dependency Injection trong ASP.NET Core
Dependency Injection giờ đã trở thành thành phần chính thức mặc định của ASP.NET Core.
Đọc thêm
Unobtrusive Client Validation trong ASP.NET Corre
Trong bài viết này chúng ta sẽ thực hiện validation phía client sử dụng Javascript.
Đọc thêm
Validation Tag Helper trong ASP.NET Core
ASP.NET cung cấp các tag helper liên quan đến hiển thị validation message cho người dùng.
Đọc thêm
Model Validation trong ASP.NET Core
Bài viết này chúng ta sẽ học về cơ chế Model Validation.
Đọc thêm
Cơ chế Model Binding: Truyền dữ liệu từ View lên Controller
Trong cơ chế Model Binding của ASP.NET Core chúng ta sẽ học cách làm sao để truyền dữ liệu từ View lên Controller.
Đọc thêm
Environment Tag Helper trong ASP.NET Core
Environment tag helper hỗ trợ tạo ra các nội dung phụ thuộc vào biến quy định môi trường trong ASP.NET Core.
Đọc thêm