Псевдоним вспомогательной функции тега `Attributes`

Я не смог найти способ дать несколько имен одному вспомогательному тегу (псевдониму) в netcore20 для следующего определения класса вспомогательного тега

[HtmlTargetElement(Attributes = AttributeName)]
public class InDomIfTagHelper : TagHelper
{
    private const string AttributeName = "idi,in-dom-if";

    [HtmlAttributeName(AttributeName)]
    public bool InDomIf { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        base.Process(context, output);
        if (!InDomIf)
        {
            output.SuppressOutput();
        }
    }
}

Я хотел бы иметь возможность ссылаться на мой помощник по тегам, используя оба следующих синтаксиса

<li idi='false'>content</li>
<li in-dom-if="true">content2</li>

Я провел небольшое исследование и нашел такие сообщения, как этот на SO, но требует обоих тегов (в основном, предложение AND).

Я все еще пытался определить свое свойство Attributes с помощью "idi,in-dom-if", а также "[idi],[in-dom-if]", последний на самом деле дал мне ошибку: Недопустимое свойство привязки помощника тега

Admin.TagHelpers.InDomIfTagHelper.InDomIf '. Помощники тегов не могут связываться с атрибутами HTML с именем «[idi], [in-dom-if]», потому что имя содержит символ «]».

Я тоже пробовал это "[name=idi],[name=in-dom-if]", и я тоже добавил кавычки вокруг имен тегов ... ничего из этого не сработало.

Поскольку я не могу найти много информации об определении имен вспомогательных атрибутов тегов с помощью предложения OR, мне интересно, возможно ли это вообще ...

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

Это вообще возможно? Если да, как я могу этого добиться?


person Mathieu VIALES    schedule 12.10.2017    source источник


Ответы (1)


Атрибут HtmlTargetElement определяет один набор селекторов, которые должны совпадать, чтобы активировать помощник тега. Если вы хотите указать альтернативный набор селекторов, все, что вам нужно сделать, это добавить другой HtmlTargetElement атрибут.

Вы можете использовать HtmlTargetElement столько раз, сколько вам нужно, чтобы настроить отдельные наборы селекторов для вашего помощника тегов. Вспомогательная функция тега активируется, когда есть тот HtmlTargetElement, который удовлетворяет всем своим требованиям.

Это может стать довольно обширным, если у вас есть много альтернативных способов активации помощника тегов. Например, встроенный AnchorTagHelper выглядит так:

[HtmlTargetElement("a", Attributes = ActionAttributeName)]
[HtmlTargetElement("a", Attributes = ControllerAttributeName)]
[HtmlTargetElement("a", Attributes = AreaAttributeName)]
[HtmlTargetElement("a", Attributes = PageAttributeName)]
[HtmlTargetElement("a", Attributes = PageHandlerAttributeName)]
[HtmlTargetElement("a", Attributes = FragmentAttributeName)]
[HtmlTargetElement("a", Attributes = HostAttributeName)]
[HtmlTargetElement("a", Attributes = ProtocolAttributeName)]
[HtmlTargetElement("a", Attributes = RouteAttributeName)]
[HtmlTargetElement("a", Attributes = RouteValuesDictionaryName)]
[HtmlTargetElement("a", Attributes = RouteValuesPrefix + "*")]
public class AnchorTagHelper : TagHelper
{ /* … */ }

Как видите, всегда есть ограничение на тег a и на один из поддерживаемых атрибутов. Итак, чтобы активировать помощник тега, любой из этих атрибутов должен использоваться в элементе <a>.


Однако невозможно сопоставить два атрибута одному и тому же вспомогательному свойству тега. Таким образом, даже если вы можете указать два отдельных селектора для соответствия атрибуту in-dom-if или idi, один из них не может быть точным псевдонимом другого. Вам нужно будет сопоставить их индивидуально. Но вы можете сделать так, чтобы они использовали одно и то же поле поддержки, поэтому вам не нужно обрабатывать оба в методе Process:

[HtmlTargetElement(Attributes = AttributeName)]
[HtmlTargetElement(Attributes = ShortcutAttributeName)]
public class InDomIfTagHelper : TagHelper
{
    private const string AttributeName = "in-dom-if";
    private const string ShortcutAttributeName = "idi";

    [HtmlAttributeName(AttributeName)]
    public bool InDomIf { get; set; }

    [HtmlAttributeName(ShortcutAttributeName)]
    public bool InDomIfShortcut
    {
        get => InDomIf;
        set => InDomIf = value;
    }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        base.Process(context, output);
        if (!InDomIf)
        {
            output.SuppressOutput();
        }
    }
}

Что касается синтаксиса idi,in-dom-if или [idi],[in-dom-if], он поддерживается только атрибутом HtmlTargetElement. Он используется для настройки нескольких селекторов атрибутов , которым все должны соответствовать, чтобы HtmlTargetElement соответствовал элементу и активировал помощник тега. Таким образом, [HtmlTargetElement(Attributes = "idi,in-dom-if")] на самом деле будет активировать помощник тега только тогда, когда в элементе есть атрибуты idi и in-dom-if (что, очевидно, здесь не то, что вам нужно).

Однако для атрибута HtmlAttributeName может быть только одно имя атрибута, поскольку оно должно быть четким отображением 1 к 1. Это то, что вызывает ошибку в вашей попытке. Вот почему мы должны использовать два свойства выше.

person poke    schedule 12.10.2017
comment
Замечательный ответ! Спасибо за уделенное время ! Мне не удалось найти официальную документацию, описывающую это поведение (наличие двух HtmlTargetElement). Можете ли вы указать мне на ресурс MSDN, или вы получили эти знания, читая исходный код? - person Mathieu VIALES; 13.10.2017
comment
Кратко объясняется поведение в документации:« Украшение класса несколькими [HtmlTargetElement] атрибутами приводит к логическому ИЛИ для целей ». - person poke; 13.10.2017
comment
Большое спасибо. Это действительно было объяснено. Ты мой спаситель ‹3 - person Mathieu VIALES; 13.10.2017