覆盖 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
方法 PreContent
和 PostContent
都已设置,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);
}
}
我是不是遗漏了什么明显的东西?这样做有什么注意事项吗?或者这是无法完成的事情?
对于这个问题,我们可以尝试调用 PreElement
和 PostElement
而不是 PreContent
和 PostContent
,比如
[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>");
}
}
我想创建一个标签助手来在 <input>
标签前后放置一些 HTML,但我想保留默认的 asp-for
行为并访问 ModelExpression
数据。
为此,我尝试重写 Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper
类型,如 in this post 所述。但是,即使我可以在调试器中验证正在调用 Process
方法 PreContent
和 PostContent
都已设置,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);
}
}
我是不是遗漏了什么明显的东西?这样做有什么注意事项吗?或者这是无法完成的事情?
对于这个问题,我们可以尝试调用 PreElement
和 PostElement
而不是 PreContent
和 PostContent
,比如
[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>");
}
}