Содержание
Наряду с обычными представлениями и макетами, в ASP.NET Core MVC также используются частичные представления (partial view). Частичные представления могут встраиваться в обычные представления и, обычно, используются для разбивки сложных представлений на более простые. Рассмотрим, как мы можем использовать частичные представления в нашем приложении.
Частичное представление
Вернемся к нашему приложению. На данный момент у нас в приложении имеется импровизированная админка со своим макетом, а структура проекта выглядит следующим образом:
Админ.панель выглядит следующим образом:
Допустим, нам необходимо сделать так, чтобы помимо главного меню админки (Записи | Пользователи) на каждой странице админ.панели также показывалось дополнительное меню. Технически мы могли бы вынести его и в макет, а можно использовать для этого частичное представление. Добавим в папку Views/Admin новый файл, который назовем PartialMenu.cshtml:
Код представления сделаем чисто номинальным:
<p>Меню для админпанели</p>
Теперь попробуем встроить это представление в страницы админпанели.
Встраивание частичного представления в обычное
Чтобы встроить частичное представление в обычное мы можем использовать следующую конструкцию Razor:
@await Html.PartialAsync("PartialMenu")
в качестве параметра для PartialAsync()
указывается имя частичного представления. Теперь мы можем запустить приложение и посмотреть на результат:
Метод Html.PartialAsync()
встраивает код частичного представления в обычное. Он является асинхронным и возвращает объект IHtmlContent
, который представляет html-содержимое.
Также, частичное представление можно встроить в обычное с использованием метода — Html.RenderPartialAsync()
. Этот метод также принимает имя представления, но используется только в явных выражениях кода Razor, то есть обрамляется фигурными скобками:
@{ await Html.RenderPartialAsync("PartialMenu"); }
Метод Html.RenderPartialAsync()
напрямую пишет вывод в выходной поток в асинхронном режиме, поэтому может работать чуть быстрее, чем Html.PartialAsync
.
Использование частичных представлений в контроллерах
За рендеринг частичных представлений отвечает объект PartialViewResult
, который возвращается методом PartialView()
. Этот метод имеет четыре версии:
public virtual PartialViewResult PartialView() |
|
public virtual PartialViewResult PartialView(string? viewName) |
|
public virtual PartialViewResult PartialView(object? model) |
|
public virtual PartialViewResult PartialView(string? viewName, object? model) |
Например, мы можем определить следующее действие в контроллере AdminController
:
public IActionResult PartialMenu() { return PartialView(); }
Теперь запустим приложение и проверим рендеринг частичного представления:
Для частичного представления используются те же правила поиска необходимого файла, что и для обычных представлений. То есть, в данном случае, поиск файла осуществлялся по названию действия в контроллере, то есть искали файл PartialMenu.cshtml
Передача данных в частичное представление
Для передачи данных в частичное представление используется модель представления, которую мы уже рассматривали здесь. Например, передадим в представление список пунктов меню. Код частичного представления:
@model IEnumerable<string> <ul> @foreach(string item in Model) { <li>@item</li> } </ul>
Теперь изменим код представлений.
Admin/Index.cshtml
@{ //Layout = "~/Views/Shared/_AdminLayout.cshtml"; ViewBag.Title = "Записи блога"; } <h2>Все записи блога</h2> @{ await Html.RenderPartialAsync("PartialMenu", new[] { "Добавить", "Удалить", "Редактировать"}); }
Admin/Users.cshtml
@{ ViewBag.Title = "Пользователи"; } <h2>Пользователи блога</h2> @await Html.PartialAsync("PartialMenu", new[]{ "Читатели","Модераторы","Администраторы"}) <button>Добавить пользователя</button>
Запустим приложение и посмотрим результат:
Итого
Частичные представления могут встраиваться в обычные представления и, обычно, используются для разбивки сложных представлений на более простые. При использовании рендеринга частичных представлений в контроллере мы можем отправлять частичное представление пользователю без макета.