Помощник по тегам "Псевдонимы"
Я не смог найти способ присвоить несколько имен одному помощнику по тегу (псевдониму) в 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
оговорка интересно, если это вообще возможно...
Я хотел бы не определять дважды одинаковую логику в двух разных классах, чтобы они могли иметь одинаковое имя.
Это вообще возможно? Если это так, как я могу этого достичь?
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. Это то, что выдает ошибку в вашей попытке. И именно поэтому мы должны использовать два свойства выше.