Расширение AnchorTagHelper с автоматическим атрибутом в ASP Net.Core 2.2 - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь расширить встроенный объект AnchorTagHelper для автоматического добавления настроек, связанных с культурой, в сгенерированный URL.

Мой код:

namespace MyCoreSite.Mvc.TagHelpers
{
    [HtmlTargetElement("a")]
    public class MyAnchorTagHelper : AnchorTagHelper
    {
        public MyAnchorTagHelper(IHtmlGenerator generator) : base(generator)
        {
        }

        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            var requestCulture = this.ViewContext.HttpContext.Features.Get<IRequestCultureFeature>();

            if (context.AllAttributes["asp-route-culture"] == null)
            {
                this.RouteValues.Add("culture", requestCulture.RequestCulture.UICulture.Name);
            }

            base.Process(context, output);
            output.TagName = "a";
        }
    }
}

Проблема заключается в том, что при использовании значения по умолчаниюИмя тега 'a' в атрибуте [HtmlTargetElement ("a")], которое выдает это исключение:

System.InvalidOperationException: 'Невозможно переопределить атрибут' href 'для.Объект с указанным значением 'href' не должен иметь атрибутов, начинающихся с 'asp-route-' или 'asp-action', 'asp-controller', 'asp-area', 'asp-route', 'asp-protocol', 'asp-host', 'asp-фрагмент', 'asp-page' или 'asp-page-handler' атрибут. '

Если я использую другое имя тега вместо' a '(например, «aa») работает, но я хотел бы использовать тег «a» в своих представлениях.

Пожалуйста, помогите мне решить эту проблему!Спасибо!

1 Ответ

0 голосов
/ 18 февраля 2019

Каждый помощник по тегам работает независимо по порядку, поэтому вы не можете переопределить помощник по умолчанию, такой как AnchorTagHelper, если полностью не удалите библиотеку помощников по тегам (удалите строку, которая вводит ее в _ViewImports.cshtml).В противном случае, здесь на самом деле происходит то, что по умолчанию AchorTagHelper обрабатывает тег, а затем ваш пользовательский MyAnchorTagHelper обрабатывает уже измененный тег.Наследование от встроенных помощников тегов может фактически вызвать проблемы, если они зависят от определенного атрибута, присутствующего до, а не после.

В данном конкретном сценарии лучше всего не наследовать от AnchorTagHelper и вместо этого просто измените атрибут href, который будет сгенерирован из AnchorTagHelper, обрабатывающего тег в первую очередь.Просто убедитесь, что ваша библиотека вспомогательных тегов включена после значения по умолчанию в _ViewImports.cshtml, поскольку порядок операций будет иметь значение.

...