我找不到任何方法为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这样的帖子,但这两个标记都需要(基本上是an和子句)。
我仍然尝试用"idi,in-dom-if"和"[idi],[in-dom-if]"定义我的"idi,in-dom-if"属性,最后一个实际上给了我一个错误:无效的标记帮助器绑定属性
行政机关。行政机关。标记助手不能绑定到名为“idi,in if”的HTML属性,因为名称包含“]”字符。
我也试过这个"[name=idi],[name=in-dom-if]",我也在标签名旁边加了引号.这些都不起作用。
由于我似乎找不到很多关于使用OR子句定义标记助手属性名称的信息,所以我想知道这是否可能.
我希望避免在两个不同的类中定义两次相同的逻辑,这样它们就可以具有相同的名称。
这有可能吗?如果是的话,我怎样才能做到呢?
发布于 2017-10-12 21:22:15
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属性上,只能有一个属性名,因为它必须是一个清晰的1到1映射。这就是在你的尝试中抛出错误的东西。这也是为什么我们必须使用上面的两个属性。
https://stackoverflow.com/questions/46717970
复制相似问题