Views là gì?
Trong mô hình Model-View-Controller (MVC), View xử lý trình bày dữ liệu và tương tác người dùng của ứng dụng. View là một HTML template với Razor markup nhúng vào. Razor markup là code tương tác với HTML markup để tạo webpage được gửi đến client. Trong ASP.NET Core MVC, views là các file.cshtml sử dụng ngôn ngữ lập trình C# trong Razor markup.
Cấu trúc thư mục Views
Thông thường, các view files được nhóm vào các folders có tên theo từng controller của ứng dụng. Các folders này được lưu trong thư mục Views ở root của ứng dụng:Home được đại diện bởi thư mục Home trong Views. Thư mục này chứa views cho About, Contact và Index. Khi người dùng request một trong 3 webpages này, các controller actions trong Home controller quyết định view nào được dùng để build và trả về webpage.
Lợi ích của Views
Views giúpEstablish separation of concerns trong ứng dụng MVC bằng cách tách markup giao diện người dùng khỏi các phần khác của ứng dụng. Việc tuân theo SoC design giúp ứng dụng modular, mang lại nhiều lợi ích:| Lợi ích | Mô tả |
|---|---|
| Dễ bảo trì | Ứng dụng được tổ chức tốt hơn. Views được nhóm theo tính năng, dễ tìm khi làm việc trên một tính năng |
| Loose coupling | Có thể build và update views riêng biệt với business logic và data access components |
| Dễ test | Các phần giao diện người dùng dễ test vì views là các đơn vị riêng biệt |
| Giảm trùng lặp | Ít khả năng vô tình lặp lại các phần giao diện |
Layout
Sử dụng Layouts để cung cấp các phần webpage nhất quán và giảm code trùng lặp. Layouts thường chứa header, navigation, menu elements và footer. Header và footer thường chứa boilerplate markup cho nhiều metadata elements và links đến script và style assets.@model ở đầu file:
Partial Views
Partial views giảm code trùng lặp bằng cách quản lý các phần có thể tái sử dụng của views. Partial view hữu ích cho phần author biography trên blog xuất hiện ở nhiều views. Author biography là ordinary view content và không cần code thực thi để produce content cho webpage.View Components
View Components tương tự partial views ở chỗ cho phép giảm code trùng lặp, nhưng phù hợp cho view content cần code chạy trên server để render webpage. View Components hữu ích khi rendered content cần database interaction, ví dụ shopping cart trên website.Tạo View
Views cụ thể cho một controller được tạo trong thư mụcViews/[ControllerName]. Views dùng chung giữa các controllers được đặt trong Views/Shared.
Để tạo view, thêm file mới và đặt tên giống tên action tương ứng với extension .cshtml. Để tạo view tương ứng với action About trong HomeController, tạo file About.cshtml trong Views/Home:
Razor Markup cơ bản
Razor markup bắt đầu với symbol@. Chạy C# statements bằng cách đặt code C# trong Razor code blocks được set off bằng curly braces:
@:
Controller trả về View
Views thường được trả về từ actions như ViewResult, là một loại ActionResult. Controller kế thừa từController có thể dùng helper method View():
Các overload của View()
View Discovery
Khi một action trả về view, một quá trình gọi là view discovery xác định view file nào được sử dụng dựa trên view name. Mặc định, methodView() trả về view cùng tên với action method. Runtime tìm view theo thứ tự:
Các cách chỉ định view path
Truyền dữ liệu đến Views
Có nhiều cách để truyền dữ liệu đến views:Strongly Typed Data (ViewModel)
Cách mạnh mẽ nhất là chỉ định model type trong view — gọi là viewmodel. Sử dụng viewmodel cho phép view tận dụng strong type checking và hỗ trợ IntelliSense.Khai báo model trong view
Controller truyền model
ViewModel class
Lưu ý: Nên sử dụng POCO (Plain Old CLR Object) viewmodels — có ít hoặc không có behavior (methods). ViewModels được lưu trong folderModelshoặc folderViewModelsriêng ở root của ứng dụng.
ViewData
ViewData là ViewDataDictionary object, truy cập qua string keys. String data có thể được stored và used trực tiếp, nhưng phải cast các object values sang specific types khi extract.Trong Controller
Trong View
[ViewData] Attribute
Properties trên controllers được đánh dấu với attribute[ViewData] sẽ có values được stored và loaded từ dictionary:
ViewBag
ViewBag là wrapper quanh ViewData, cung cấp dynamic properties cho underlying ViewData collection. ViewBag tiện lợi hơn vì không cần cast.Controller
View
So sánh ViewData vs ViewBag vs ViewModel
| Tiêu chí | ViewData | ViewBag | ViewModel (@model) |
|---|---|---|---|
| Type checking | Runtime (dynamic) | Runtime (dynamic) | Compile-time ✅ |
| IntelliSense | ❌ | ❌ | ✅ |
| Cast required | ✅ Có | ❌ Không | ❌ Không |
| Syntax | @ViewData["Key"] | @ViewBag.Key | @Model.Property |
| Khuyến nghị | Hạn chế | Hạn chế | Ưu tiên dùng |
Khuyến nghị: Nên sử dụng ViewModel (@model) làm cách chính để truyền dữ liệu. ViewData và ViewBag dễ gây lỗi runtime vì không có compile-time checking.