【问题标题】:Tag helper `Attributes` alias标记助手“属性”别名
【发布时间】:2018-05-12 06:55:36
【问题描述】:

我找不到任何方法将多个名称赋予 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 子句)。

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

Admin.TagHelpers.InDomIfTagHelper.InDomIf'。标签助手无法绑定到名为“[idi],[in-dom-if]”的 HTML 属性,因为该名称包含“]”字符。

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    HtmlTargetElement 属性指定一组选择器,它们需要匹配才能激活您的标签助手。如果您想指定一组备用选择器,您所要做的就是添加 another 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 标记和支持的一个 属性始终存在限制。因此,为了激活标签助手,必须在 &lt;a&gt; 元素上使用这些属性中的任何一个。


    但是,不可能将两个属性映射到同一个标签助手属性。因此,即使您可以指定两个单独的选择器来匹配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 属性上,只能有一个属性名称,因为它必须是明确的一对一映射。那就是在您的尝试中引发错误的事情。这也是为什么我们必须使用上面的两个属性。

    【讨论】:

    • 惊人的答案!感谢您的时间 !我找不到任何描述这种行为的官方文档(有两个HtmlTargetElement)。你能给我指点 MSDN 资源吗?或者你是从阅读源代码中获得这些知识的吗?
    • 该行为被简要解释in the docs:“装饰具有多个[HtmlTargetElement] 属性的类会导致目标的逻辑或。”
    • 非常感谢。确实解释过了。你是我的救星
    猜你喜欢
    • 1970-01-01
    • 2016-10-22
    • 2020-02-08
    • 1970-01-01
    • 2023-03-09
    • 2019-11-26
    • 2015-12-27
    • 2016-05-22
    • 2013-07-27
    相关资源
    最近更新 更多