Содержание
Компоненты представлений (View Components) в ASP.NET Core MVC — это ещё одна функциональная особенность платформы. Формально, компонент представления представляющие собой класс C# (обычно POCO), связанный с представлением и выполняющий определенные задачи в представлении. Например, мы можем выделить в приложении ASP.NET Core MVC какие-либо части — облако тегов, меню, различного рода виджеты, которые в коде могут быть представлены отдельными компонентами представлений. Компоненты представлений очень похожи на частичные представления, о которых мы уже знаем, но, при этом, обладают рядом особенностей, с которыми мы и познакомимся в этой части.
Способы определения компонентов представлений
Существует три способа определения компонентов представлений:
Создание класса производного от ViewComponent
Например, мы можем создать такой компонент:
using Microsoft.AspNetCore.Mvc; namespace AspNetMvcComponents.Views.Home.Components { public class DayInfo: ViewComponent { public string Invoke() { return $"{DateTime.Now:dddd}"; } } }
Всё, что делает такой компонент — выводит название дня недели.
Использование атрибута [ViewComponent]
Второй способ — применение к классу компонента атрибута [ViewComponent]:
using Microsoft.AspNetCore.Mvc; namespace AspNetMvcComponents.Views.Home.Components { [ViewComponent] public class DayInfo { public string Invoke() { return $"{DateTime.Now:dddd}"; } } }
Использование суффикса ViewComponent в названии класса
По аналогии с tag-хэлперами и контроллерами, мы можем добавить к названию класса суффикс ViewComponent
и такой класс, в соответствии с соглашениями по умолчанию, будет использоваться как компонент:
namespace AspNetMvcComponents.Views.Home.Components { public class DayInfoViewComponent { public string Invoke() { return $"{DateTime.Now:dddd}"; } } }
В любом случае, логика вывода компонента должна всегда содержаться в одном из двух методов: Invoke()
или InvokeAsync()
. Как следует из названия, второй метод используется для асинхронной работы компонента. Использования обоих методов внутри одного класса компонента недопустимо и приводит к ошибке приложеия следующего вида:
Использование компонента представления в проекте ASP.NET Core MVC
Вызов Component.InvokeAsync()
Создадим новый проект ASP.NET Core MVC, добавим в проект новую папку Components и размесим в этой папке компонент, представленный выше. В итоге, у вас должна получится следующая структура:
Теперь воспользуемся представлением Views/Home/Index.cshtml и вызовем в нём наш компонент следующим образом:
@{ ViewData["Title"] = "Home Page"; } @await Component.InvokeAsync("DayInfo") <div class="text-center"> <h1 class="display-4">Welcome</h1> <p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p> </div>
по аналогии с частичными представлениями, мы используем разметку Razor для вызова нашего компонента:
@await Component.InvokeAsync("DayInfo")
передав в качестве параметра название компонента без суффикса ViewComponent
, если таковой использовался в названии. Вообще, метод Component.InvokeAsync()
может принимать два параметра — в первом название компонента, а во втором — анонимный тип с параметрами самого компонента, но так как наш компонент не использует пока никаких настроек, то второй параметр мы н использовали.
Теперь можно запустить приложение и увидеть результат работы компонента:
второй способ использования компонента в представлении — использование специального tag-хэлпера
<vc:></vc:>
.
Использование tag-хэлпера vc
Этот tag-хэлпер имеет следующим формат:
<vc:[название_компонента] parameter1="parameter1 value" parameter2="parameter2 value"> </vc:[название_компонента]>
Чтобы воспользоваться таким способом вызова компонента, наш компонент должен быть зарегистрирован в проекте как tag-хэлпер, то есть мы должны добавить в представление или в файл _ViewImports.cshtml следующую директиву Razor:
@addTagHelper *, AspNetMvcComponents
где AspNetMvcComponents — название нашего проекта (сборки). Второй момент, который следует учитывать, касается наименования компонента внутри tag-хэлпера. Если название компонента содержит более одной заглавной буквы, то для его названия внутри tag-хэлпера следует использовать т.н. kebab-case То есть, название нашего компонента DayInfo
превращается в day-info
, а, например, MySuperComponent
— в my-super-component
и т.д. И того, используя tag-хэлпер, мы можем вызвать наш компонент следующим образом:
@addTagHelper *, AspNetMvcComponents @{ ViewData["Title"] = "Home Page"; } <vc:day-info></vc:day-info>
и получить точно такой же результат, как и на рисунке выше — вывод названия дня недели на главной странице приложения.
Итого
Компоненты представления (View Components) представляют собой обычные классы C#, которые связаны с представлением и используются для вывода какой-либо информации пользователям. По своим возможностям, компоненты представлений похожи на частичные представления. Вызов компонентов представлений может осуществляться как с использованием метода Component.InvokeAsync()
, так и с использованием специального tag-хэлпера vc
.