ViewViewComponentResult и генерация представления

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

Последнее обновление: 28.11.2019

ViewComponentResult позволяет использовать для рендеринга контента частичное представление. Если мы наследуем класс компонента от базового класса ViewComponent, то для генерации объекта ViewViewComponentResult мы можем вызвать унаследованный метод View.

Этот метод имеет четыре перегруженных версии:

  • View(): для рендеринга контента выбирает представление по умолчанию

  • View(model): для рендеринга контента выбирает представление по умолчанию, в которое передает некоторую модель

  • View(viewName): для рендеринга контента выбирает представление с именем viewName

  • View(viewName, model): для рендеринга контента выбирает представление с именем viewName, в которое передает некоторую модель

Так, определим следующий класс компонента UsersListViewComponent:

using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;

namespace ViewComponentsApp.Components
{
    public class UsersListViewComponent : ViewComponent
    {
        List<string> users;
        public UsersListViewComponent()
        {
            users = new List<string>
            {
                "Tom", "Tim", "Bob", "Sam"
            };
        }
        public IViewComponentResult Invoke()
        {
            return View(users);
        }
    }
}

В этом классе определяется условный список пользователей - коллекция строк.

Метод Invoke() возвращает объект IViewComponentResult или фактически представление, которое мы далее создадим. Причем в это предствление передается созданный в конструкторе список.

Теперь создадим представление, которое будет выводить переданные из компонента данные. Если при вызове метода View в компоненте имя представления явным образом не указано, то в качестве представления по умолчанию используется файл Default.cshtml. Для поиска файла представления Razor будет просматривать следующие пути в порядке приоритета:

  • Views/Название_Контроллера/Components/Название_Компонента/Название_Представления.cshtml

  • Views/Shared/Components/Название_Компонента/Название_Представления.cshtml

По умолчанию в проекте уже есть контроллер HomeController. И, допустим, наш UsersListViewComponent будет использоваться только в представлениях этого контроллера. В этом случае добавим в папку Views/Home новый каталог, который назовем Components. А в этот каталог добавим папку, которая называется по имени нашего компонента - UsersList, и определим в ней новое представление Default.cshtml со следующим кодом:

@model IEnumerable<string>
<h4>Список пользователей</h4>
<ul>
    @foreach (var user in Model)
    {
        <li>@user</li>
    }
</ul>

Поскольку в представление передается объект List<string>, то оно типизировано типом IEnumerable<string>. В самом представлении просто выводим переданный список. По сути представление для View Component - это обычнное представление, которое может использовать все те же инсрукции Razor, конструкции и директивы, что и обычное представление.

То есть в итоге представление, которое используется компонентом, должно лежать по адресу Views/Название_Контроллера/Components/Название_Компонента/Default.cshtml:

View Component in ASP.NET MVC Core

Теперь мы можем использовать компонент. Для этого определим в представлении Index.cshtml следующие строки:

<div>
    @await Component.InvokeAsync("UsersList")
</div>
<div>
    <vc:users-list />
</div>

Результат работы View Component:

View Component в ASP.NET MVC Core

Выше использовалось имя представления по умолчанию: Default.cshtml. Однако нам необязательно применять именно это имя. Если у нас есть другое представление, например, Users.cshtml, то мы можем его использовать следующим образом:

public IViewComponentResult Invoke()
{
	return View("Users", users);
}

Имя представления без расширения cshtml передается в метод View в качестве первого параметра. Само представление также должно находиться по адресу Views/Название_Контроллера/Components/Название_Компонента/

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850