ASP.NET - MVC - ViewData

ViewData trong MVC ASP.NET

ViewData là một thuộc tính của Controller base class, nó trả về một đối tượng ViewDataDictionaryViewDataDictionary 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.

Hình dưới đây minh họa cho ViewData.

Chú ý: ViewData chỉ chuyển dữ liệu từ controller sang view chứ không phải ngược lại. Nó chỉ có hiệu lực trong request hiện tại.

Ví dụ sau minh họa cách chuyển dữ liệu từ controller sang view bằng ViewData. 

public ActionResult Index()
{
    IList<Student> studentList = new List<Student>();
    studentList.Add(new Student(){ StudentName = "Bill" });
    studentList.Add(new Student(){ StudentName = "Steve" });
    studentList.Add(new Student(){ StudentName = "Ram" });

    ViewData["students"] = studentList;
  
    return View();
}

Trong ví dụ trên, chúng ta đã thêm một danh sách sinh viên với "student" chính trong từ điển ViewData. Vì vậy, bây giờ, danh sách sinh viên có thể được truy cập trong view như dưới đây.

<ul>
@foreach (var std in ViewData["students"] as IList<Student>)
{
    <li>
        @std.StudentName
    </li>
}
</ul>

Xin lưu ý rằng chúng ta phải truyền các giá trị ViewData cho kiểu dữ liệu phù hợp.

Bạn cũng có thể sử dụng KeyValuePair thêm dữ liệu cho ViewData như bên dưới.

Ví dụ sử dụng  KeyValuePair trong ViewData

public ActionResult Index()
{
    ViewData.Add("Id", 1);
    ViewData.Add(new KeyValuePair<string, object>("Name", "Bill"));
    ViewData.Add(new KeyValuePair<string, object>("Age", 20));

    return View();
}

Cả ViewData và ViewBag đều sử dụng cùng một từ điển bên trong. Vì vậy, bạn không thể có Key  ViewData trùng với tên thuộc tính của ViewBag, nếu không nó có ngoại lệ.

Ví dụ ViewBag và ViewData

public ActionResult Index()
{
    ViewBag.Id = 1;

    ViewData.Add("Id", 1); // throw runtime exception as it already has "Id" key
    ViewData.Add(new KeyValuePair<string, object>("Name", "Bill"));
    ViewData.Add(new KeyValuePair<string, object>("Age", 20));

    return View();
}

 

 Những điểm cần nhớ :

  1. ViewData truyền dữ liệu từ Controller sang View, không truyền ngược lại.
  2. ViewData kế thừa từ ViewDataDictionary là một kiểu dữ liệu tự điển.
  3. Vòng đời của ViewData chỉ kéo dài trong request hiện tại. Giá trị ViewData sẽ bị xóa nếu chuyển hướng xảy ra.
  4. Giá trị ViewData phải ép kiểu trước khi sử dụng.
  5. ViewBag chèn dữ liệu vào tự điển ViewData . Vì vậy, khóa của ViewData và thuộc tính của ViewBag không trùng với nhau.