从另一个 TagHelper 触发 TagHelper

ale*_*esc 3 c# asp.net-core-mvc tag-helpers asp.net-core asp.net-core-2.0

我想触发股票ScriptTagHelper在 GitHub 上查看源代码),以便它模拟该asp-append-version="true"属性。

我知道使用它的正确方法是改变这个:

<script src="somefile.js"></script>
Run Code Online (Sandbox Code Playgroud)

对此:

<script src="somefile.js" asp-append-version="true"></script>
Run Code Online (Sandbox Code Playgroud)

这个过程与版本控制 CSS 包含和图像(LinkTagHelperImageTagHelper)非常相似。

由于我有很多包含的脚本、样式表和图像,我想自动化一些事情。因此asp-append-version="true",与其添加每个 HTML 元素,不如创建一个自定义 TagHelper 来为我执行此操作。

这就是问题所在 - 它不起作用。

目前,我的 TagHelper 仅涵盖script标签,如下所示:

  [HtmlTargetElement("script", Attributes = "src")]      
  public class TestTagHelper : TagHelper
  {
    public override int Order => int.MinValue;
    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
      if(!context.AllAttributes.ContainsName("asp-append-version"))
      {
        output.Attributes.SetAttribute("asp-append-version", "true");
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

但它不会触发默认值ScriptTagHelper,而是直接将 输出 asp-append-version="true"到输出 HTML。我还将该Order属性设置为 INT_MIN,以便它在任何其他标签助手之前触发,但它仍然不起作用。

有没有办法使这项工作?

Hen*_*ema 5

正如@ChrisPratt 提到的,链接 TagHelpers 是不可能的。有一个小技巧可以帮助你。您可以ScriptTagHelper在自己的标签助手中手动新建一个实例并手动调用该Process方法:

[HtmlTargetElement("script", Attributes = "src")]
public class TestTagHelper : TagHelper
{
    public override int Order => int.MinValue;

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        if (!context.AllAttributes.ContainsName("asp-append-version"))
        {
            var scriptTagHelper = new ScriptTagHelper(...) // Inject the required dependencies here
            {
                AppendVersion = true, // Explicitly set to true
                // Map all other properties
            };
            scriptTagHelper.Process(context, output);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)