标签助手“属性”别名

Tag helper `Attributes` alias

我找不到任何方法将多个名称赋予 netcore20 中的单个标签助手(别名)到以下标签助手 class 定义

[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 子句)。

我仍然尝试用 "idi,in-dom-if""[idi],[in-dom-if]" 定义我的 Attributes 属性 最后一个实际上给了我一个错误:无效的标签助手绑定 属性

Admin.TagHelpers.InDomIfTagHelper.InDomIf'. Tag helpers cannot bind to HTML attributes with name '[idi],[in-dom-if]' because the name contains a ']' character.

我也尝试了这个 "[name=idi],[name=in-dom-if]" 并且我也在标签名称周围添加了引号...... none 这个有效。

因为我似乎找不到太多关于使用 OR 子句定义标签助手属性名称的信息,所以我想知道它是否可能...

我想避免在两个不同的 class 中定义两次相同的逻辑,这样它们就可以具有相同的名称。

这可能吗?如果是,我该如何实现?

HtmlTargetElement 属性指定 一组 选择器,需要匹配这些选择器才能激活您的标签助手。如果你想指定一组备用选择器,你所要做的就是添加 另一个 HtmlTargetElement 属性。

您可以根据需要多次使用 HtmlTargetElement 来为标签助手设置单独的选择器集。当 one 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-ifidi 属性,也不可能一个完全是另一个的别名。您将必须单独映射它们。但是你可以让它们共享相同的支持字段,所以你不需要在 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 属性上,只能有一个属性名称,因为它必须是明确的一对一映射。那就是在您的尝试中引发错误的原因。这也是我们必须使用上面两个属性的原因。