Создайте в проекте
AutoLot.Services
новый каталог по имени
Utilities
и добавьте в него файл
StringExtensions.cs
со статическим классом
StringExtensions
. Модифицируйте код, добавив расширяющий метод
RemoveController()
:
using System;
namespace AutoLot.Mvc.Extensions
{
public static class StringExtensions
{
public static string RemoveController(this string original)
=> original.Replace("Controller", "", StringComparison.OrdinalIgnoreCase);
}
}
Создание базового класса
Создайте в проекте
AutoLot.Mvc
новый каталог по имени
TagHelpers
и внутри него каталог
Base
. Добавьте в каталог
Base
файл класса
ItemLinkTagHelperBase.cs
, сделайте класс
ItemLinkTagHelperBase
открытым и абстрактным, а также унаследованным от класса
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