Viewbag là gì

Chiều nay ngồi ở cty đầu óc đặc quánh với đủ thứ bùi nhùi chẳng đâu vào đâu nên chán quá ngồi nhấp nhổm như học trò đợi trống tan trường, mọi người vừa lục tục ra về thì tui cũng cuốn gói vác balo lên vòng ra ngoài kiếm một không gian làm việc khác. Sẵn tiện ghi lại luôn mấy món đang vọc vạch…

Viewbag là gì

Có cái dự án kia, mọi người dùng JSON để đẩy dữ liệu qua lại giữa client và server, dùng trong tất cả mọi trường hợp như một phương thuốc trị bá bệnh. Tui tưng tửng nên dù cũng thích JSON nhưng mà lâu lâu tùy hứng vẫn quẳng về một cái ViewData rất chi là không thể view source lên để coi gởi/ nhận cái gì!

Mà đúng là Microsoft quá chu đáo, khi chuẩn bị tới 3 món để bạn có thể passing data từ Controller xuống View trong một request khá đơn giản.

ViewData, một dạng của Dictionary quá gần gũi rồi. Không tin, bạn thử với lớp ViewDataDictionary đi, cũng có KeyValuePair rất quen thuộc 😀

ViewBag, cái này tới thời C# 4.0 mới được đẻ ra, xài ViewData cũng tiện nhưng mà mỗi lần muốn kiểm tra/ so sánh gì đó phải mắc công chuyển kiểu (typecasting) nữa rất là phiền phức, và trường hợp nó null thì lại văng ra Exception rất là chán. Thành ra ViewBag mới là một dynamic property rất linh hoạt, muốn ViewBag.Result là kiểu int/ string… hay bất cứ kiểu gì mà bạn muốn đều được, sang bên View chỉ cần xài thôi không phải Convert.To… gì cả!

Hai món trên là đủ xài rồi, vậy còn đẻ ra TempData làm chi nữa? Như đã nói ở trên, ViewData & ViewBag chỉ tồn tại trong một request nên các trường hợp redirect qua View khác thì bạn chỉ nhận được kết quả là null, bởi vì redirect sẽ kill request hiện tại – rồi gởi một HTTP status code 302 – sau đó tạo một request mới trên web server để redirect. TempData ra đời để giải quyết chuyện này, rất phù hợp để bạn quăng các thông báo lỗi cho người dùng 🙂

Ngoài sử dụng Ajax để get data từ Controller trong MVC, chúng ta có thể sử dụng ViewBag hoặc ViewData để truyền giá trị view Controler tới View.

Dưới đây là ví dụ sử dụng ViewBag và ViewData trong MVC C#.

Controller: 

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var emp = new Employee
        {
            EmpID=101,
            Name = "Deepak",
            Salary = 35000,
            Address = "Delhi"
        };

        ViewData["emp"] = emp;
        ViewBag.Employee = emp;

        return View(); 
    }
}

View (*.cshtml):

@model MyProject.Models.EmpModel;
@{ 
 Layout = "~/Views/Shared/_Layout.cshtml"; 
 ViewBag.Title = "Welcome to Home Page";
 var viewDataEmployee = ViewData["emp"] as Employee; //need type casting
}

Welcome to Home Page

This Year Best Employee is!

@ViewBag.Employee.Name

@viewDataEmployee.Name

Trong asp.net mvc có 3 khái niệm mới đó là:  ViewBag, ViewData,  TempData. Khi sử dụng 3 từ khóa này bạn có thể truyền dữ liệu, số liệu từ View xuống controller một các đơn giản. Đây là một dạng truyền dữ liệu từ Request tới Next Request (Subsequen request). ViewBag và ViewData gần tương tự nhau, cũng không khác nhau nhiều về cách sử dụng.

Tìm hiểu ViewBag-ViewData

Giống nhau về cách sử dụng của ViewBag và ViewData:


  • Giúp bạn có thể chuyển dữ liệu từ Controller xuống View
  • Truyền dữ liệu từ Controller xuống View tương ứng
  • Chỉ sử dụng 1 lần duy nhất, sau khi dùng xong dữ liệu ở hai thằng này được giải phóng.
Khác nhau giữa ViewBag và ViewData:


  • ViewData là một dạng Dictionary, để truy cập vào biến bạn cần khai báo một key dạng string: ViewData[“Danhmuc”].
  • ViewBag: là một điểm mới trong Net Framework 4.0. Cho phép bạn định nghĩa các biến dạng Dynamic: ViewBag.DanhMuc.
  • ViewData: đòi hỏi bạn cần kiểm tra dữ liệu Null và chuyển đổi kiểu trước khi sử dụng
  • ViewBag: không đòi hỏi kiểm tra hay chuyển đổi kiểu (ép kiểu)

Các bạn xem ví dụ dưới đây:


C#

1

2

3

4

5

public ActionResult HienThi()

{

    ViewBag.Message= "Nhap tin bai thanh cong";

    return View();

}


C#

1

2

3

4

5

public ActionResult HienThi()

{

    ViewBag[Message]= "Nhap tin bai thanh cong";

    return View();

}

Ở dưới View: Hienthi.cshtml mình sẽ gọi như sau:


1

2

3

@ViewBag.Message

@ViewData["Message"]

Như vậy chúng ta đã hiểu về sự khác nhau giữa ViewBag, ViewData. Thực ra thì hai thằng này không khác nhau là mấy. ViewBag được cái dùng nhanh hơn vì nó có kiểu Dynamic. Tôi thì hiện tại sử dụng ViewBag nhiều nó nhanh, đơn giản không mất công gõ code nhiều.

Tiếp theo chúng ta sẽ tìm hiểu về anh bạn TempData:

TempData cũng là một dạng Dictionary. Dữ liệu khai báo như ViewData, sử dụng cũng như vậy cần kiểm tra và ép kiểu trước khi sử dụng. Nó kiểu như một dạng Session nhưng mà có phiên sống ngắn, hay đúng hơn là 1 lần duy nhất sau khi sử dụng. Nếu muốn gia hạn sống cho TempData thì bạn cần phải dùng thêm lệnh Keep.

TempData có cái hay là mình dùng nó để di chuyển, move từ Controller này sang Controller khác hoặc từ Action này sang Action khác. Thường thì cái này hay được sử dụng cho một câu thông báo lỗi hay validate.