从另一个TagHelper触发TagHelper

时间:2018-06-14 12:07:03

标签: c# asp.net-core asp.net-core-mvc asp.net-core-2.0 tag-helpers

我想触发股票ScriptTagHelperview source on GitHub),以便模拟asp-append-version="true"属性。

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

<script src="somefile.js"></script>

到此:

<script src="somefile.js" asp-append-version="true"></script>

此过程与CSS包含和图片(LinkTagHelperImageTagHelper)的版本控制非常相似。

由于我有很多包含的脚本,样式表和图像,我想自动化一些东西。因此,我宁愿创建一个自定义的TagHelper,而不是在每个HTML元素上添加asp-append-version="true"

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

目前,我的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");
      }
    }
  }

但它不是触发默认的ScriptTagHelper,而是输出 asp-append-version="true"输出HTML。我还将Order属性设置为INT_MIN,以便它在任何其他Tag Helpers之前触发,但它仍然不起作用。

有没有办法让这项工作?

1 个答案:

答案 0 :(得分:2)

正如@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);
        }
    }
}