7

有没有办法让 TagHelper 呈现另一个 TagHelper?

示例 TagHelpers;

public class OuterTagHelper : TagHelper
{
    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "";
        output.Content.SetContent("Hello <inner></inner>");
    }
}

public class InnerTagHelper : TagHelper
{
    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "";
        output.Content.SetContent("World!");
    }
}

示例视图;

<outer></outer>

预期结果;

Hello World!

我知道我可能应该改用 ViewComponent,但是是否有可能实现上述预期行为?

4

2 回答 2

3

如果您需要使用一些现有的标签助手类型功能,那么您可以从 IHtmlGenerator 访问它。这无助于访问自定义标签助手功能,但如果您只需要标签等现有内容的功能,输入那么这将起作用

[HtmlTargetElement("input", Attributes = nameof(Wrap) + ", asp-for")]
[HtmlTargetElement("select", Attributes = nameof(Wrap) + ", asp-for")]
public class FormGroupWrapperTagHelper : TagHelper
{
    public FormGroupWrapperTagHelper(IHtmlGenerator generator)
    {
        Generator = generator;
    }

    [HtmlAttributeNotBound]
    [ViewContext]
    public ViewContext ViewContext { get; set; }

    protected IHtmlGenerator Generator { get; }

    public ModelExpression AspFor { get; set; }
    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        var generateValidationMessage = Generator.GenerateValidationMessage(ViewContext,
                                                                  AspFor.Name,
                                                                  message: null,
                                                                  tag: null,
                                                                  htmlAttributes: null);
.....
}
于 2015-11-11T00:28:35.787 回答
0

@Daniel JG是对的,不建议这样做。从技术上讲,如果您通过高度定制的剃须刀解析器运行您的内容,然后像执行页面一样执行内容,那么您可以做到这一点——但这几乎可以肯定是解决您的问题的错误方法。

于 2015-09-24T17:15:22.173 回答