首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >标记助手` `Attributes`‘别名

标记助手` `Attributes`‘别名
EN

Stack Overflow用户
提问于 2017-10-12 20:03:02
回答 1查看 1.7K关注 0票数 4

我找不到任何方法为netcore20中的单个标记助手(别名)提供多个名称,以便使用以下标记助手类定义

代码语言:javascript
复制
[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();
        }
    }
}

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

代码语言:javascript
复制
<li idi='false'>content</li>
<li in-dom-if="true">content2</li>

我做了一些研究,发现在SO上有this one这样的帖子,但这两个标记都需要(基本上是an和子句)。

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

行政机关。行政机关。标记助手不能绑定到名为“idi,in if”的HTML属性,因为名称包含“]”字符。

我也试过这个"[name=idi],[name=in-dom-if]",我也在标签名旁边加了引号.这些都不起作用。

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

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

这有可能吗?如果是的话,我怎样才能做到呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-12 21:22:15

HtmlTargetElement属性指定了为激活标记助手而需要匹配的一组选择器。如果要指定一组选择器,则只需添加另一个HtmlTargetElement属性即可。

您可以多次使用HtmlTargetElement,因为您需要为标记助手设置单独的选择器集。当有一个具有所有需求匹配的HtmlTargetElement时,标记助手将激活。

如果您有很多其他方法来激活您的标记助手,这可能会变得非常广泛。例如,内置的AnchorTagHelper如下所示:

代码语言:javascript
复制
[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方法中同时处理这两个问题:

代码语言:javascript
复制
[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")]实际上只有在元素上同时有idiin-dom-if属性时才会激活标记助手(这显然不是您想要的)。

然而,在HtmlAttributeName属性上,只能有一个属性名,因为它必须是一个清晰的1到1映射。这就是在你的尝试中抛出错误的东西。这也是为什么我们必须使用上面的两个属性。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46717970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档