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:

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ùng PartialAsync 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:
RenderPartialAsynchiệ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ị)

PartialRenderPartial 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ùng Partial: “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ủa ViewData 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


Tài liệu tham khảo