标记助手`属性'别名

时间:2017-10-12 20:03:03

标签: c# asp.net-core asp.net-core-tag-helpers

我无法找到任何方法将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上找到了诸如this one之类的帖子,但是这两个标签都需要(基本上是一个AND子句)。

我仍尝试使用Attributes定义"idi,in-dom-if"属性以及"[idi],[in-dom-if]"最后一个实际给我错误:无效的标记帮助器绑定属性

  

Admin.TagHelpers.InDomIfTagHelper.InDomIf&#39 ;.标记帮助程序无法使用名称&#39; [idi],[in-dom-if]&#39;绑定到HTML属性。因为该名称包含&#39;]&#39;字符。

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

由于我似乎无法找到有关使用OR子句定义标记助手属性名称的更多信息,我想知道它是否可能......

我想避免在两个不同的类中定义两次相同的逻辑,只是因为它们可以具有相同的名称。

这甚至可能吗?如果是,我怎么能实现这个目标?

1 个答案:

答案 0 :(得分:7)

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-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属性上,只能有一个属性名称,因为它必须是明确的一对一映射。这就是在你的尝试中引发错误的事情。这也是我们必须使用上述两个属性的原因。