Partial View là gì?
Partial view là một Razor markup file (.cshtml) không có directive @page, dùng để render HTML output bên trong output của một markup file khác.
Trong MVC, markup files được gọi là views; trong Razor Pages, chúng được gọi là pages. Thuật ngữ “partial view” dùng chung cho cả hai.
Khi nào nên dùng Partial Views
Partial views hiệu quả trong các trường hợp:| Trường hợp | Mô tả |
|---|---|
| Chia nhỏ file lớn | Trong một markup file phức tạp gồm nhiều phần logic, có lợi khi làm việc với từng phần tách biệt trong partial view |
| Giảm trùng lặp markup | Khi cùng markup được dùng ở nhiều file, partial view loại bỏ sự trùng lặp — thay đổi một lần trong partial view sẽ cập nhật tất cả các file dùng nó |
Không nên dùng Partial Views khi
- Duy trì layout chung → Dùng
_Layout.cshtml - Cần logic phức tạp hoặc code execution để render → Dùng View Component
Khai báo Partial View
Một partial view là file.cshtml không có @page directive, nằm trong thư mục Views (MVC) hoặc Pages (Razor Pages).
Quy ước đặt tên
Tên file partial view thường bắt đầu bằng dấu gạch dưới_. Quy ước này không bắt buộc nhưng giúp phân biệt trực quan partial views với views và pages.
Lưu ý: Không giống MVC view rendering, partial view không chạy _ViewStart.cshtml.
Tham chiếu Partial View
Có nhiều cách để tham chiếu partial view trong markup file. Khuyến nghị dùng cách async.1. Partial Tag Helper (Khuyến nghị)
Partial Tag Helper render content asynchronously và sử dụng syntax giống HTML. Yêu cầu ASP.NET Core 2.1+.Tham chiếu từ app root
Tham chiếu bằng relative path
2. HTML Helper — Async (Khuyến nghị)
DùngPartialAsync trả về IHtmlContent wrapped trong Task. Phải prefix với @:
Tham chiếu từ app root
Tham chiếu bằng relative path
3. HTML Helper — Render Async
RenderPartialAsync streams rendered output trực tiếp đến response, không trả về IHtmlContent. Phải gọi trong Razor code block:
RenderPartialAsync có hiệu năng tốt hơn trong một số scenario vì không buffer kết quả. Benchmark để chọn cách phù hợp.
4. HTML Helper — Sync (Không khuyến nghị)
Partial và RenderPartial là phiên bản synchronous. Không khuyến nghị vì có thể gây deadlock.
Cảnh báo: Visual Studio sẽ cảnh báo khi dùngPartial: “Use of IHtmlHelper.Partial may result in application deadlocks. Consider using<partial>Tag Helper or IHtmlHelper.PartialAsync.”
Partial View Discovery
Khi partial view được tham chiếu mà không có extension, thứ tự tìm kiếm như sau:MVC
Quy ước quan trọng
- Partial views cùng tên nhưng khác folder → được phép
- Khi tìm không có extension: nếu partial view tồn tại ở cả caller folder và Shared folder → partial ở caller folder được ưu tiên
- Partial views có thể chuỗi (partial gọi partial khác), miễn không tạo circular reference
- Relative paths luôn relative với current file, không phải root
Lưu ý: Razor section định nghĩa trong partial view không thấy được bởi parent markup file. Section chỉ visible trong partial view nó được định nghĩa.
Truyền dữ liệu đến Partial Views
ViewData
Khi partial view được khởi tạo, nó nhận bản sao củaViewData dictionary từ parent. Thay đổi trong partial view không ảnh hưởng parent view.
Truyền Model
Model có thể là bất kỳ object nào:Ví dụ: Article với Sections
View chính
Partial 1: _AuthorPartial.cshtml
Partial 2: _ArticleSection.cshtml
So sánh các cách render Partial View
| Cách | Async | Trả về | Performance | Khuyến nghị |
|---|---|---|---|---|
<partial> Tag Helper | ✅ Async | IHtmlContent | Tốt | ✅ Ưu tiên |
PartialAsync | ✅ Async | IHtmlContent | Tốt | ✅ Khuyến nghị |
RenderPartialAsync | ✅ Async | Stream | Tốt nhất | Dùng khi cần performance |
Partial | ❌ Sync | IHtmlContent | Trung bình | ❌ Tránh dùng |
RenderPartial | ❌ Sync | Stream | Tốt | ❌ Tránh dùng |