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

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

Жанры

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

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

Эпоха Опустошителя. Том I

Павлов Вел
1. Вечное Ристалище
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эпоха Опустошителя. Том I

Проблема майора Багирова

Майер Кристина
1. Спецназ
Любовные романы:
современные любовные романы
6.60
рейтинг книги
Проблема майора Багирова

Законы Рода. Том 13

Андрей Мельник
13. Граф Берестьев
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 13

Газлайтер. Том 15

Володин Григорий Григорьевич
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Газлайтер. Том 15

О, Путник!

Арбеков Александр Анатольевич
1. Квинтет. Миры
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
О, Путник!

Прометей: каменный век

Рави Ивар
1. Прометей
Фантастика:
альтернативная история
6.82
рейтинг книги
Прометей: каменный век

Её (мой) ребенок

Рам Янка
Любовные романы:
современные любовные романы
6.91
рейтинг книги
Её (мой) ребенок

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Цвет сверхдержавы - красный. Трилогия

Симонов Сергей
Цвет сверхдержавы - красный
Фантастика:
попаданцы
альтернативная история
8.06
рейтинг книги
Цвет сверхдержавы - красный. Трилогия

Болтливый мертвец

Фрай Макс
7. Лабиринты Ехо
Фантастика:
фэнтези
9.41
рейтинг книги
Болтливый мертвец

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Лишняя дочь

Nata Zzika
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Лишняя дочь