gpt4 book ai didi

c# - 标记助手 `Attributes` 别名

转载 作者:太空狗 更新时间:2023-10-30 00:48:26 25 4
gpt4 key购买 nike

我找不到任何方法可以为 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>

我做了一些研究,发现了诸如 this one 之类的帖子在 SO 上,但同时需要两个标记(基本上是一个 AND 子句)。

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

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]" 并且我也在标签名称周围添加了引号......这些都不起作用。

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

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

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

最佳答案

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-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 attribute 但是,只能有一个属性名称,因为它必须是明确的一对一映射。那就是在您的尝试中引发错误的原因。这也是我们必须使用上面两个属性的原因。

关于c# - 标记助手 `Attributes` 别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46717970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com