标签助手“属性”别名
Tag helper `Attributes` alias
我找不到任何方法将多个名称赋予 netcore20 中的单个标签助手(别名)到以下标签助手 class 定义
[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 上找到了诸如 之类的帖子,但是两个标签都需要(基本上是一个 AND 子句)。
我仍然尝试用 "idi,in-dom-if"
和 "[idi],[in-dom-if]"
定义我的 Attributes
属性 最后一个实际上给了我一个错误:无效的标签助手绑定 属性
Admin.TagHelpers.InDomIfTagHelper.InDomIf'. Tag helpers cannot bind to HTML attributes with name '[idi],[in-dom-if]' because the name contains a ']' character.
我也尝试了这个 "[name=idi],[name=in-dom-if]"
并且我也在标签名称周围添加了引号...... none 这个有效。
因为我似乎找不到太多关于使用 OR
子句定义标签助手属性名称的信息,所以我想知道它是否可能...
我想避免在两个不同的 class 中定义两次相同的逻辑,这样它们就可以具有相同的名称。
这可能吗?如果是,我该如何实现?
HtmlTargetElement
属性指定 一组 选择器,需要匹配这些选择器才能激活您的标签助手。如果你想指定一组备用选择器,你所要做的就是添加 另一个 HtmlTargetElement
属性。
您可以根据需要多次使用 HtmlTargetElement
来为标签助手设置单独的选择器集。当 one 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
属性上,只能有一个属性名称,因为它必须是明确的一对一映射。那就是在您的尝试中引发错误的原因。这也是我们必须使用上面两个属性的原因。
我找不到任何方法将多个名称赋予 netcore20 中的单个标签助手(别名)到以下标签助手 class 定义
[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 上找到了诸如
我仍然尝试用 "idi,in-dom-if"
和 "[idi],[in-dom-if]"
定义我的 Attributes
属性 最后一个实际上给了我一个错误:无效的标签助手绑定 属性
Admin.TagHelpers.InDomIfTagHelper.InDomIf'. Tag helpers cannot bind to HTML attributes with name '[idi],[in-dom-if]' because the name contains a ']' character.
我也尝试了这个 "[name=idi],[name=in-dom-if]"
并且我也在标签名称周围添加了引号...... none 这个有效。
因为我似乎找不到太多关于使用 OR
子句定义标签助手属性名称的信息,所以我想知道它是否可能...
我想避免在两个不同的 class 中定义两次相同的逻辑,这样它们就可以具有相同的名称。
这可能吗?如果是,我该如何实现?
HtmlTargetElement
属性指定 一组 选择器,需要匹配这些选择器才能激活您的标签助手。如果你想指定一组备用选择器,你所要做的就是添加 另一个 HtmlTargetElement
属性。
您可以根据需要多次使用 HtmlTargetElement
来为标签助手设置单独的选择器集。当 one 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
属性上,只能有一个属性名称,因为它必须是明确的一对一映射。那就是在您的尝试中引发错误的原因。这也是我们必须使用上面两个属性的原因。