Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
using AutoLot.Mvc.Controllers;
using AutoLot.Services.Utilities;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Razor.TagHelpers;
namespace AutoLot.Mvc.TagHelpers.Base
{
public abstract class ItemLinkTagHelperBase : TagHelper
{
}
}
Добавьте конструктор, который принимает экземпляры реализаций IActionContextAccessor и IUrlHelperFactory. Используйте UrlHelperFactory с ActionContextAccessor, чтобы создать экземпляр реализации IUrlHelper, и сохраните его в переменной уровня класса. Вот необходимый код:
protected readonly IUrlHelper UrlHelper;
protected ItemLinkTagHelperBase(IActionContextAccessor contextAccessor,
IUrlHelperFactory urlHelperFactory)
{
UrlHelper = urlHelperFactory.GetUrlHelper(contextAccessor.ActionContext);
}
Добавьте открытое свойство для хранения Id элемента:
public int? ItemId { get; set; }
При вызове вспомогательной функции дескриптора вызывается метод Process(), принимающий два параметра, TagHelperContext и TagHelperOutput. Параметр TagHelperContext применяется для получения остальных атрибутов дескриптора и словаря объектов, которые используются с целью взаимодействия с другими вспомогательными функциями дескрипторов, нацеленными на дочерние элементы. Параметр TagHelperOutput применяется для создания визуализированного вывода. Поскольку это базовый класс, создайте метод по имени BuildContent(), который производные классы смогут вызывать из метода Process(). Добавьте следующий код:
protected void BuildContent(TagHelperOutput output,
string actionName, string className, string displayText, string fontAwesomeName)
{
output.TagName = "a"; // Заменить <item-list> дескриптором <a>.
var target = (ItemId.HasValue)
? UrlHelper.Action(actionName,
nameof(CarsController).RemoveController(), new {id = ItemId})
: UrlHelper.Action(actionName, nameof(CarsController).RemoveController());
output.Attributes.SetAttribute("href", target);
output.Attributes.Add("class",className);
output.Content.AppendHtml($@"{displayText}
<i class=""fas fa-{fontAwesomeName}""></i>");
}
В предыдущем код присутствует ссылка на набор инструментов для значков и шрифтов Font Awesome, который будет добавлен в проект позже в главе.
Вспомогательная функция дескриптора для вывода сведений об элементе
Создайте в каталоге TagHelpers новый файл класса по имени ItemDetailsTagHelper.cs. Сделайте класс ItemDetailsTagHelper открытым и унаследованным от класса ItemLinkTagHelperBase. Добавьте в новый файл показанный ниже код:
using AutoLot.Mvc.Controllers;
using AutoLot.Mvc.TagHelpers.Base;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Razor.TagHelpers;
namespace AutoLot.Mvc.TagHelpers
{
public class ItemDetailsTagHelper : ItemLinkTagHelperBase
{
}
}
Добавьте открытый конструктор, который принимает обязательные экземпляры и передает их конструктору базового класса:
public ItemDetailsTagHelper(
IActionContextAccessor contextAccessor,
IUrlHelperFactory urlHelperFactory)
: base(contextAccessor, urlHelperFactory) {}
Переопределите метод Process(), чтобы вызывать метод BuildContent() базового класса:
public override void Process(TagHelperContext context, TagHelperOutput output)
{
BuildContent(output,nameof(CarsController.Details),
"text-info","Details","info-circle");
}
Код создает ссылку Details (Детали) с изображением значка информации из Font Awesome. Чтобы не возникали ошибки при компиляции, добавьте в CarsController базовый метод Details():
public IActionResult Details()
{
return View();
}
Вспомогательная функция дескриптора для удаления элемента
Создайте в каталоге TagHelpers новый файл класса по имени ItemDeleteTagHelper.cs. Сделайте класс ItemDeleteTagHelper открытым и унаследованным от класса ItemLinkTagHelperBase. Добавьте в новый файл следующий код:
using AutoLot.Mvc.Controllers;
using AutoLot.Mvc.TagHelpers.Base;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Razor.TagHelpers;
namespace AutoLot.Mvc.TagHelpers
{
public class ItemDeleteTagHelper : ItemLinkTagHelperBase
{
}
}
Добавьте открытый конструктор, который принимает обязательные экземпляры и передает их конструктору базового класса:
public ItemDeleteTagHelper(
IActionContextAccessor contextAccessor,
IUrlHelperFactory urlHelperFactory)
: base(contextAccessor, urlHelperFactory) {}
Переопределите метод Process(), чтобы вызывать метод BuildContent() базового класса:
public override void Process(TagHelperContext context, TagHelperOutput output)
{
BuildContent(output,nameof(CarsController.Delete),"text-danger","Delete","trash");
}
Код создает ссылку Delete (Удалить) с изображением значка мусорного ящика из Font Awesome. Чтобы не возникали ошибки при компиляции, добавьте в CarsController базовый метод Delete():
public IActionResult Delete()
{
return View();
}
Вспомогательная функция дескриптора для редактирования сведений об элементе
Создайте в каталоге TagHelpers новый файл класса по имени ItemEditTagHelper.cs. Сделайте класс ItemEditTagHelper открытым и унаследованным от класса ItemLinkTagHelperBase. Добавьте в новый файл показанный ниже код:
using AutoLot.Mvc.Controllers;
using AutoLot.Mvc.TagHelpers.Base;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Razor.TagHelpers;
namespace AutoLot.Mvc.TagHelpers
{
public class ItemEditTagHelper : ItemLinkTagHelperBase
{
}
}
Добавьте открытый конструктор, который принимает обязательные экземпляры и передает их конструктору базового класса:
public ItemEditTagHelper(
IActionContextAccessor contextAccessor,
IUrlHelperFactory urlHelperFactory)
: base(contextAccessor, urlHelperFactory) {}
Переопределите метод Process(), чтобы вызывать метод BuildContent() базового класса:
public override void Process(TagHelperContext context, TagHelperOutput output)
{
BuildContent(output,nameof(CarsController.Edit),"text-warning","Edit","edit");
}
Код создает ссылку Edit (Редактировать) с изображением значка карандаша из Font Awesome. Чтобы не возникали ошибки при компиляции, добавьте в CarsController базовый метод Edit():
public IActionResult Edit()
{
return View();
}
Вспомогательная функция дескриптора для создания элемента
Создайте в каталоге TagHelpers новый файл класса по имени itemCreateTagHelper.cs. Сделайте класс ItemCreateTagHelper открытым и унаследованным от класса ItemLinkTagHelperBase. Добавьте в новый файл следующий код:
using AutoLot.Mvc.Controllers;
using AutoLot.Mvc.TagHelpers.Base;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Razor.TagHelpers;
namespace AutoLot.Mvc.TagHelpers
{
public class ItemCreateTagHelper : ItemLinkTagHelperBase
{
}
}
Добавьте открытый конструктор, который принимает обязательные экземпляры и передает их конструктору базового класса:
public ItemCreateTagHelper(
IActionContextAccessor contextAccessor,
IUrlHelperFactory urlHelperFactory)
: base(contextAccessor, urlHelperFactory) {}
Переопределите метод Process(), чтобы вызывать метод BuildContent() базового класса:
public override void Process(TagHelperContext context, TagHelperOutput output)
{
BuildContent(output,nameof(CarsController.Create),"text-success","Create new","plus");
}
Код создает ссылку Create new (Создать) с изображением значка плюса из Font Awesome.
Вспомогательная функция дескриптора для вывода списка элементов
Создайте в каталоге TagHelpers новый файл класса по имени