Содержание
Наряду с обычными представлениями и макетами, в 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>
Запустим приложение и посмотрим результат:
Итого
Частичные представления могут встраиваться в обычные представления и, обычно, используются для разбивки сложных представлений на более простые. При использовании рендеринга частичных представлений в контроллере мы можем отправлять частичное представление пользователю без макета.




