为什么 TagHelper HtmlAttributeName 未在 ASP.NET Core 2.2 中解析

Why is the TagHelper HtmlAttributeName not resolved in ASP.NET Core 2.2

我正在开发自定义 TagHelper,为此我使用了 Microsoft 中的示例。

public class EmailTagHelper : TagHelper
{
    private const string EmailDomain = "contoso.com";

    // Can be passed via <email mail-to="..." />. 
    // PascalCase gets translated into kebab-case.
    [HtmlAttributeName("mail-to")]
    public string MailTo { get; set; }

    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "a";                                 // Replaces <email> with <a> tag
        var content = await output.GetChildContentAsync();
        var target = content.GetContent() + "@" + EmailDomain;
        output.Attributes.SetAttribute("href", "mailto:" + target);

        output.Content.SetContent(target);
    }
}

我在这些例子中使用了它:

<email>Support</email>
<email mail-to="Support"></email>

第一个示例按预期工作并给出以下输出:

<a href="mailto:Support@contoso.com">Support@contoso.com</a>

但是第二个例子,其中使用了mail-toHtmlAttributeName,没有解析,如下图

<a href="mailto:@contoso.com">@contoso.com</a>

到目前为止,这已经花了我一个下午的时间,之后我可能会撞到脑袋,但是有人能告诉我为什么这不起作用吗?

您已声明 MailTo 并将其绑定到 mail-to 属性,但您没有在 ProcessAsync 中使用 MailTo。相反,您 总是 使用 GetChildContentAsync() 方法来获取内容。

如果同时提供 mail-to 和内容等,您需要决定哪个优先或是否要生成某种异常。这是一个更喜欢该属性的粗略示例,为了完整性:

public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
    output.TagName = "a";

    var mailTo = MailTo;

    if (string.IsNullOrWhiteSpace(mailTo))
    {
        var content = await output.GetChildContentAsync();
        mailTo = content.GetContent();
    }

    var target = mailTo + "@" + EmailDomain;
    output.Attributes.SetAttribute("href", "mailto:" + target);

    output.Content.SetContent(target);
}