标记助手`属性'别名

Mat*_*LES 4 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望能够使用以下两种语法引用我的标记助手

<li idi='false'>content</li>
<li in-dom-if="true">content2</li>
Run Code Online (Sandbox Code Playgroud)

我做了一些研究,发现帖子如这一对左右,但使得无论标签的需要(AND子句,基本上).

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

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

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

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

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

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

pok*_*oke 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
{ /* … */ }
Run Code Online (Sandbox Code Playgroud)

如您所见,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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

至于idi,in-dom-if[idi],[in-dom-if]语法,仅在HtmlTargetElement属性上支持.它用于设置所有需要匹配的多个属性选择器,以便HtmlTargetElement匹配元素并激活标记助手.所以[HtmlTargetElement(Attributes = "idi,in-dom-if")]当有一个双方实际上只激活标签助手idi 一个in-dom-if元素上的属性(这显然不是你想要的这里).

HtmlAttributeName但是,在属性上,只能有一个属性名称,因为它必须是明确的一对一映射.这就是在你的尝试中引发错误的事情.这也是我们必须使用上述两个属性的原因.