TagHelper
. Приведите код класса к следующему виду:
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
новый файл класса по имени