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

Mif*_*Fox 3 tag-helpers asp.net-core razor-pages

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

为此,我尝试重写该Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper类型,如这篇文章中所述。然而,即使我可以在调试器中验证该Process方法正在被调用PreContent并且PostContent都已被设置,但除了标准标记之外,HTML 中没有显示任何内容<input>。不过,当从头开始为另一个标签创建标签助手时,它工作得很好。

我创建了一个小项目来演示这个问题。我将整个项目放在 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我错过了一些明显的东西吗?这样做有什么警告吗?或者这是根本无法完成的事情?

Tao*_*hou 5

对于这个问题,我们可以尝试调用PreElementandPostElement而不是PreContentand PostContentlike

[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>");
    }
}
Run Code Online (Sandbox Code Playgroud)