【问题标题】:Calling TagHelpers from another TagHelper?从另一个 TagHelper 调用 TagHelpers?
【发布时间】:2015-12-17 23:42:35
【问题描述】:

有什么方法可以让 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,但是否有可能实现上述预期行为?

【问题讨论】:

  • 您可以像this question 一样将它们嵌套在您的剃刀视图中,但我认为您不能从流程方法本身调用另一个模板。 (也许你可以通过耦合它们并手动调用 Process,但这听起来不是一个好主意)

标签: razor asp.net-core tag-helpers


【解决方案1】:

如果您需要使用一些现有的标签助手类型功能,那么您可以从 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);
.....
}

【讨论】:

    【解决方案2】:

    @Daniel J.G.是对的,不推荐这个。从技术上讲,如果您通过高度自定义的 razor 解析器运行您的内容,然后像执行页面一样执行内容,那么您可以做到这一点 - 但几乎可以肯定,这是解决问题的错误方法。

    【讨论】:

      猜你喜欢
      • 2018-11-24
      • 1970-01-01
      • 2011-01-18
      • 2020-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      相关资源
      最近更新 更多