Чтение онлайн

на главную - закладки

Жанры

Язык программирования C#9 и платформа .NET5
Шрифт:

Специальные вспомогательные функции дескрипторов

Специальные вспомогательные функции дескрипторов могут помочь избавиться от повторяющегося кода. В проекте

AutoLot.Mvc
специальные вспомогательные функции дескрипторов заменят HTML-разметку, используемую для навигации между экранами CRUD для
Car
.

Подготовительные шаги

Специальные вспомогательные функции дескрипторов задействуют

UrlHelperFactory
и
IActionContextAccessor
для ссылок на основе маршрутизации. Кроме того, будет добавлен
расширяющий метод для типа string, чтобы удалять суффикс
Controller
из имен контроллеров.

Обновление Startup.cs

Для создания экземпляра

UrlFactory
класса, производного не от класса
Controller
, в коллекцию служб потребуется добавить
IActionContextAccessor
. Начните с добавления в файл
Startup.cs
следующих пространств имен:

using Microsoft.AspNetCore.Mvc.Infrastructure;

using Microsoft.Extensions.DependencyInjection.Extensions;

Затем добавьте в метод

ConfigureServices
такую строку:

services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>;

Создание расширяющего метода для типа string

При обращении к именам контроллеров в коде инфраструктуре ASP.NET Core довольно часто требуется низкоуровневое строковое значение, не содержащее суффикс

Controller
, что препятствует использованию метода
nameof
без последующего вызова
string.Replace
. Со временем задача становится утомительной, поэтому для ее решения будет создан расширяющий метод для типа
string
.

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

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, который будет добавлен в проект позже в главе.

Поделиться:
Популярные книги

Удиви меня

Юнина Наталья
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Удиви меня

Live-rpg. эволюция-5

Кронос Александр
5. Эволюция. Live-RPG
Фантастика:
боевая фантастика
5.69
рейтинг книги
Live-rpg. эволюция-5

Матабар III

Клеванский Кирилл Сергеевич
3. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар III

Сиротка

Первухин Андрей Евгеньевич
1. Сиротка
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Сиротка

Черный Маг Императора 8

Герда Александр
8. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 8

Последний Паладин. Том 5

Саваровский Роман
5. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 5

Аристократ из прошлого тысячелетия

Еслер Андрей
3. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Аристократ из прошлого тысячелетия

Изгой. Трилогия

Михайлов Дем Алексеевич
Изгой
Фантастика:
фэнтези
8.45
рейтинг книги
Изгой. Трилогия

Великий род

Сай Ярослав
3. Медорфенов
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Великий род

Лорд Системы 12

Токсик Саша
12. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 12

Наемный корпус

Вайс Александр
5. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Наемный корпус

Чехов. Книга 3

Гоблин (MeXXanik)
3. Адвокат Чехов
Фантастика:
альтернативная история
5.00
рейтинг книги
Чехов. Книга 3

Дурная жена неверного дракона

Ганова Алиса
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Дурная жена неверного дракона

Измена. Верну тебя, жена

Дали Мила
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Верну тебя, жена