从另一个TagHelper触发TagHelper

6
我希望触发股票ScriptTagHelper (在GitHub上查看源代码),以便它会模拟asp-append-version="true"属性。
我知道正确的使用方法是将其更改为:
<script src="somefile.js"></script>

转换为:

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

这个过程与版本控制CSS包含和图像(LinkTagHelperImageTagHelper)非常相似。
由于我有很多包含的脚本、样式表和图片,所以我想自动化一些东西。因此,我不想在每个HTML元素上添加asp-append-version="true",而是宁愿创建一个自定义的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");
      }
    }
  }

但是,它不会触发默认的ScriptTagHelper,而是直接输出asp-append-version="true"到输出HTML中。我还将Order属性设置为INT_MIN,使其在其他任何标签助手之前执行,但仍然无法工作。

有没有办法让它工作?


1
ASP.NET Core不适用多个标签助手。一旦匹配一个,它就会呈现输出,就这样。如果您想做这样的事情,我建议从ScriptTagHelper继承并简单地修改它以默认应用追加版本。这可能只需要将支持属性默认设置为true而不是false,但我还没有查看代码。 - Chris Pratt
我尝试过使用子类和将属性设置为true,但它也不能正常工作。我不知道只有一个标签助手被应用,我发现这真的很奇怪,因为标签助手链接将非常有用。 - alesc
1
如果标签助手可以链接,那么您将无法使用与HTML元素相同名称的标签助手。像ScriptTagHelper这样的东西是有效的,因为它对脚本标记进行了单次遍历,然后假定呈现的HTML。如果它继续寻找标签助手,那么它将再次运行ScriptTagHelper... 然后再次...无限循环。 - Chris Pratt
1个回答

6

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

如果script标签中不包含任何asp-*属性,则此方法将无法正常工作,因为存在AttributeMatcher.TryDetermineMode问题。请参考https://dev59.com/Gqzka4cB1Zd3GeqP6lGD以了解如何克服该问题。 - Shaun Luttin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接