Кроме обычных представлений и мастер-страниц в ASP.NET Core MVC также можно использовать частичные представления или partial views. Их отличительной особенностью является то, что их можно встраивать в другие обычные представления. Частичные представления могут использоваться также как и обычные, однако наиболее удобной областью их использования является рендеринг результатов AJAX-запроса. По своему действию частичные представления похожи на секции, которые использовались в прошлой теме, только их код выносится в отдельные файлы.
Частичные представления полезны для создания различных панелей веб-страницы, например, панели меню, блока входа на сайт, каких-то других блоков.
За рендеринг частичных представлений отвечает объект PartialViewResult, который возвращается методом PartialView(). Этот метод имеет четыре версии:
PartialView()
: для генерации ответа используется представление, которое по имени совпадает с вызывающим методом
PartialView(string? viewName)
: в метод передается имя представления, что позволяет переопределить используемое по умолчанию представление
PartialView(object? model)
: передает в представление данные в виде объекта model
PartialView(string? viewName, object? model)
: переопределяет имя представления и передает в него данные в виде объекта model
Итак, определим в контроллере HomeController действие Hello, которое будет использовать частичное представление:
using Microsoft.AspNetCore.Mvc; namespace MvcApp.Controllers { public class HomeController : Controller { public IActionResult Index() { return View(); } public IActionResult Hello() { return PartialView(); } } }
Теперь добавим в папку Views/Home новое представление Hello.cshtml, в котором будет простенькое содержимое:
<h2>Hello View</h2>
Теперь обратимся к методу Hello как к обычному действию контроллера, и оно нам вернет частичное представление:
По своему действию частичное представление похоже на обычное, только для него по умолчанию не определяется мастер-страница.
Теперь рассмотрим, как мы можем встраивать частичные представления в обычные. Для этого изменим представление Index.cshtml:
<h1>Index View</h1> @await Html.PartialAsync("Hello")
Метод Html.PartialAsync()
встраивает код частичного представления в обычное. Он является асинхронным и возвращает объект
IHtmlContent, который представляет html-содержимое и который обернут в объект Task<TResult>
. В качестве параметра в метод передается имя представления:
Обращения к методу Hello()
в контроллере при этом не происходит.
Кроме метода Html.PartialAsync()
частичное представление можно встроить с помощью другого метода - Html.RenderPartialAsync.
Этот метод также принимает имя представления, только он используется не в строчных выражениях кода Razor, а в блоке кода, то есть обрамляется фигурными скобками:
@{await Html.RenderPartialAsync("Hello");}
Html.RenderPartialAsync
напрямую пишет вывод в выходной поток в асинхронном режиме, поэтому может работать чуть быстрее, чем
Html.PartialAsync
.
Одна из перегруженных версий методов Html.PartialAsync / Html.RenderPartialAsync
позволяет передать модель в частичное представление. В итоге у нас получится стандартное строго типизированное представление.
Например, в качестве второго параметра список строк:
<h1>Welcome</h1> @await Html.PartialAsync("Hello", new List<string>{"Hello", "Привет", "Hallo", "Salut"})
Поскольку здесь в частичное представление передается список строк, то мы можем использовать модель List<string>, чтобы получить этот список. Теперь изменим частичное представление Hello.cshtml:
@model IEnumerable<string> <ul> @foreach(string s in Model) { <li>@s</li> } </ul>
И на веб-страницу будет передан список строк: