【问题标题】:Trigger TagHelper from another TagHelper从另一个 TagHelper 触发 TagHelper
【发布时间】:2018-11-24 05:07:47
【问题描述】:

我想触发股票ScriptTagHelper (view source on 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,以便它在任何其他标签助手之前触发,但它仍然不起作用。

有没有办法让它工作?

【问题讨论】:

  • ASP.NET Core 不应用多个标签助手。一旦一个匹配,那就是呈现输出的那个,就是这样。如果你想做这样的事情,我建议从ScriptTagHelper 继承并简单地修改它以默认应用附加版本。它可能就像将支持属性默认设置为 true 而不是 false 一样简单,但我没有查看代码。
  • 我尝试了子类化并将属性设置为 true,但它也无法正常工作。我不知道只应用了一个标签助手,我觉得这很奇怪,因为标签助手链接会非常有用。
  • 如果标签助手可以被链接,那么你永远不能使用与 HTML 元素同名的标签助手。 ScriptTagHelper 之类的东西可以工作,因为它只通过脚本标签,然后假定呈现 HTML。如果它继续寻找标签助手,那么它将再次运行ScriptTagHelper……然后再次……无限期地运行。

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


【解决方案1】:

正如@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 问题。请参阅stackoverflow.com/questions/50958531/… 了解克服该问题的方法。
猜你喜欢
  • 2015-12-17
  • 2016-08-19
  • 2019-05-30
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多