Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
Если мы создаем компонент с помощью наследования от класса ViewComponent, то нам становится доступным контекст компонента через ряд свойств:
HttpContext: представляет контекст, который описывает полученный запрос, а также отправляемый ответ
ModelState: представляет состояние модели в виде объекта ModelStateDictionary
Request: возвращает контекст запроса в виде объекта HttpRequest
RouteData: возвращает данные маршрута
Url: представляет объект IUrlHelper, который используется для генерации адресов URL
User: представляет текущего пользователя в виде объкта IPrincipal
ViewBag: представляет динамический объект, который может использоваться для передачи данных в представление
ViewContext: описывает контекст главного представления, в котором вызывается компонент
ViewComponentContext: представляет объект ViewComponentContext, который инкапсулирует контекст компонента
ViewData: возвращает объект ViewDataDictionary, который применяется для передачи данных в представление
Используем некоторые и этих свойств. Пусть код компонента будет выглядеть следующим образом:
using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Mvc; namespace ViewComponentsApp.Components { public class UsersListViewComponent : ViewComponent { List<string> users; public UsersListViewComponent() { users = new List<string> { "Tom", "Tim", "Bob", "Sam", "Alice", "Kate" }; } public IViewComponentResult Invoke() { int number = users.Count; // если передан параметр number if (Request.Query.ContainsKey("number")) { Int32.TryParse(Request.Query["number"].ToString(), out number); } ViewBag.Users = users.Take(number); ViewData["Header"] = $"Количество пользователей: {number}."; return View(); } } }
В методе Invoke получаем из строки запроса параметр "number", который призван указать, сколько пользователей надо вывести на веб-страницу. сли параметр не указан, то просто передаем всех пользователей. А с помощью объектов ViewBag и ViewData передаем данные в представление.
В представлении компонента получим все переданные данные:
<h3>@ViewData["Header"]</h3> <ul> @foreach (var user in ViewBag.Users) { <li>@user</li> } </ul>
Вызовем компонент в главном представлении:
@await Component.InvokeAsync("UsersList")
или так
<vc:users-list />
И после этого через параметр number мы сможем изменять количество выводимых пользователей: