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 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.
Hình dưới đây minh họa cho ViewData.
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();
}