c# - 从另一个 TagHelper 触发 TagHelper

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

我要触发股票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 )非常相似。
由于我有很多包含的脚本、样式表和图像,我想自动化一些事情。因此,而不是添加 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");
      }
    }
  }
但不是触发默认 ScriptTagHelper ,它从字面上输出asp-append-version="true"到输出 HTML。我也设置了Order属性设置为 INT_MIN,以便它在任何其他标签助手之前触发,但它仍然不起作用。
有没有办法使这项工作?

最佳答案

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

关于c# - 从另一个 TagHelper 触发 TagHelper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50857188/

相关文章:

c# - ASP.NET Core 应用程序不从输出目录中读取 appsettings.json,而是从项目一中读取

Azure Cosmos DB .NET SDK - 每 5 分钟后台请求一次?

c# - 添加 AntiForgeryToken 到非 Ajax 表单提交

c# - 直接添加引用和通过Nuget添加包有什么区别

asp.net-core - 任务失败 : Activating language client: HtmlLanguageClient

asp.net-core - 问号而不是希伯来字符

dependency-injection - 为什么 ServiceProvider 无法在 ASP.NET Core 中创建 Controller 实例?

entity-framework - Scaffold-DbContext 为没有主键的表创建模型

c# - .NET:JsonMediaTypeFormatter 线程安全吗?

c# - 按递增顺序将列表拆分为多个列表