覆盖 InputTagHelper 时,TagHelper PreContent 和 PostContent 未显示在 HTML 中

TagHelper PreContent and PostContent not showing up in HTML when overriding InputTagHelper

我想创建一个标签助手来在 <input> 标签前后放置一些 HTML,但我想保留默认的 asp-for 行为并访问 ModelExpression数据。

为此,我尝试重写 Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper 类型,如 in this post 所述。但是,即使我可以在调试器中验证正在调用 Process 方法 PreContentPostContent 都已设置,HTML 中除了标准 <input> 标签。不过,从头开始为另一个标签创建标签助手时,它工作正常。

我创建了一个小项目来演示这个问题。我输入 the entire project on GitHub,然后复制我要在下面创建的特定标签助手。

    [HtmlTargetElement("input", Attributes = "asp-for,test-label")]
    public class TestTagHelper : InputTagHelper
    {
        public TestTagHelper(IHtmlGenerator generator) : base(generator)
        {
        }

        [HtmlAttributeName("test-label")]
        public string Label { get; set; }

        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            output.PreContent.SetHtmlContent($"<b>{WebUtility.HtmlEncode(Label)}</b> ");
            output.PostContent.SetHtmlContent($" <i>({WebUtility.HtmlEncode(For.Name)})</i>"); // access information from the input tag
            base.Process(context, output);
        }
    }

我是不是遗漏了什么明显的东西?这样做有什么注意事项吗?或者这是无法完成的事情?

对于这个问题,我们可以尝试调用 PreElementPostElement 而不是 PreContentPostContent,比如

[HtmlTargetElement("input", Attributes = "asp-for,test-label")]
public class TestTagHelper : InputTagHelper
{
    public TestTagHelper(IHtmlGenerator generator) : base(generator)
    {
    }

    [HtmlAttributeName("test-label")]
    public string Label { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        base.Process(context, output);
        output.PreElement.SetHtmlContent($"<b>{WebUtility.HtmlEncode(Label)}</b>");
        output.PostElement.SetHtmlContent($"<i>({WebUtility.HtmlEncode(For.Name)})</i>");
    }
}