ASP.NET MVC – ViewData, ViewBag và TempData

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…

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<string, object> 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 🙂

Tóm lại:
– ViewData phải chuyển kiểu cho đúng, còn ViewBag thì khỏi!
– TempData rất phù hợp để dùng trong các trường hợp RedirectToAction.

Trả lời

Điền thông tin vào ô dưới đây hoặc nhấn vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s