Литмир - Электронная Библиотека
A
A

Создайте в проекте

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

622
{"b":"847442","o":1}