ViewData 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 ViewData:

Truyền dữ liệu giữa ...Ví dụ
Controller và ViewTruyền dữ liệu vào một Dropdown List (Select box).
View và Layout ViewThiết lập lại nội dung của element  trong Layout View từ một View con.
Partial View và ViewMộ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 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

 

Nguồn: Weakly-typed data (ViewData and ViewBag)