我无法找到任何方法将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
子句定义标记助手属性名称的更多信息,我想知道它是否可能......
我想避免在两个不同的类中定义两次相同的逻辑,只是因为它们可以具有相同的名称。
这甚至可能吗?如果是,我怎么能实现这个目标?
答案 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-if
或idi
属性,也不可能使另一个成为另一个的精确别名。您必须单独映射它们。但是你可以让它们共享相同的支持字段,因此你不需要在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
属性上,只能有一个属性名称,因为它必须是明确的一对一映射。这就是在你的尝试中引发错误的事情。这也是我们必须使用上述两个属性的原因。