自关闭 TagHelper 合并同级元素的 html 标记
Self-closing TagHelper merges html markup of sibling element
我对在 ASP.NET 核心 MVC 中引入的 TagHelper
行为感到困惑。按照本教程 A working email Tag Helper,我们有机会编写自闭合标签。根据为此目的的文章,我们应该使用 attbute HtmlTargetElement
。 Class 下面举例说明:
[HtmlTargetElement("email", TagStructure = TagStructure.WithoutEndTag)]
public class EmailTagHelper : TagHelper
{
private const string EmailDomain = "contoso.com";
public string MailTo { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "a";
var address = MailTo + "@" + EmailDomain;
output.Attributes.SetAttribute("href", "mailto:" + address);
output.Content.SetContent(address);
}
}
razor 视图中的标记如下:
<strong>Support:</strong>
<email mail-to="Support"/><br />
<strong>Marketing:</strong>
<email mail-to="Marketing"/>
但是我有意外的输出:
<strong>Support:</strong>
<a href="mailto:Support@contoso.com">
<span>Another content</span>
<strong>Marketing:</strong>
</a>
<a href="mailto:Marketing@contoso.com"></a>
为什么第一个锚标签包含<span>
和<strong>
标签内容?
在 razor 视图中没有 HtmlTargetElement
属性和结束标记 </email>
我有正确的行为。
我 运行 同样的例子并且能够产生同样的问题。调试时,我注意到输出的 TagMode 默认设置为 SelfClosing。这对锚标记无效。然后我将锚点的标记模式设置为 StartTagAndEndTag,并按预期生成了输出。
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "a";
// ADD THIS LINE TO YOUR CODE
output.TagMode = TagMode.StartTagAndEndTag;
var address = MailTo + "@" + EmailDomain;
output.Attributes.SetAttribute("href", "mailto:" + address);
output.Content.SetContent(address);
}
这款剃须刀:
<strong>Support:</strong><email mail-to="Support" /><br />
<strong>Marketing:</strong><email mail-to="Marketing" />
产生了这个输出:
<strong>Support:</strong><a href="mailto:Support@contoso.com">Support@contoso.com</a><br />
<strong>Marketing:</strong><a href="mailto:Marketing@contoso.com">Marketing@contoso.com</a>
我对在 ASP.NET 核心 MVC 中引入的 TagHelper
行为感到困惑。按照本教程 A working email Tag Helper,我们有机会编写自闭合标签。根据为此目的的文章,我们应该使用 attbute HtmlTargetElement
。 Class 下面举例说明:
[HtmlTargetElement("email", TagStructure = TagStructure.WithoutEndTag)]
public class EmailTagHelper : TagHelper
{
private const string EmailDomain = "contoso.com";
public string MailTo { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "a";
var address = MailTo + "@" + EmailDomain;
output.Attributes.SetAttribute("href", "mailto:" + address);
output.Content.SetContent(address);
}
}
razor 视图中的标记如下:
<strong>Support:</strong>
<email mail-to="Support"/><br />
<strong>Marketing:</strong>
<email mail-to="Marketing"/>
但是我有意外的输出:
<strong>Support:</strong>
<a href="mailto:Support@contoso.com">
<span>Another content</span>
<strong>Marketing:</strong>
</a>
<a href="mailto:Marketing@contoso.com"></a>
为什么第一个锚标签包含<span>
和<strong>
标签内容?
在 razor 视图中没有 HtmlTargetElement
属性和结束标记 </email>
我有正确的行为。
我 运行 同样的例子并且能够产生同样的问题。调试时,我注意到输出的 TagMode 默认设置为 SelfClosing。这对锚标记无效。然后我将锚点的标记模式设置为 StartTagAndEndTag,并按预期生成了输出。
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "a";
// ADD THIS LINE TO YOUR CODE
output.TagMode = TagMode.StartTagAndEndTag;
var address = MailTo + "@" + EmailDomain;
output.Attributes.SetAttribute("href", "mailto:" + address);
output.Content.SetContent(address);
}
这款剃须刀:
<strong>Support:</strong><email mail-to="Support" /><br />
<strong>Marketing:</strong><email mail-to="Marketing" />
产生了这个输出:
<strong>Support:</strong><a href="mailto:Support@contoso.com">Support@contoso.com</a><br />
<strong>Marketing:</strong><a href="mailto:Marketing@contoso.com">Marketing@contoso.com</a>