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 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 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 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 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 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/)

Lên trên