Views là gì?

Trong mô hình Model-View-Controller (MVC), View xử lý trình bày dữ liệutươ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:
Controller 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:

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.
Mỗi view sử dụng layout bằng directive @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.
Render partial view từ một view khác:

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.
Sử dụng trong layout hoặc view:

Tạo View

Views cụ thể cho một controller được tạo trong thư mục Views/[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:
Hiển thị giá trị trong HTML bằng cách reference với @:

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, method View() 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 folder Models hoặc folder ViewModels riêng ở root của ứng dụng.

ViewData

ViewDataViewDataDictionary 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

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.

Tài liệu tham khảo