asp.net-core - 如何创建一个继承自标准 .Net Core 脚本标签助手的脚本标签助手

标签 asp.net-core asp.net-core-tag-helpers

我维护一个大型遗留 ASP.NET MVC 应用程序,该应用程序最近已转换为 .Net Core。

我需要为我们的 JavaScript 和 CSS 文件引入缓存破坏。我很欣赏这可以使用新的 .Net Core 脚本标签助手上的 asp-append-version="true"属性轻松完成。

但是,我的应用程序在 100 多个地方有脚本标记。在所有这些地方添加属性会涉及大量页面,这意味着需要进行大量的回归测试。

有没有办法创建一个新的脚本标签助手,它继承自 .Net Core 脚本标签助手,并且始终具有 asp-append-version="true"属性?这将使我无需更新大量文件即可清除缓存。

最佳答案

...create a new script tag helper that inherits from the .Net Core script tag helper, and that always has the asp-append-version="true" attribute?



代码 ( View on GitHub )
using System.Linq;
using System.Text.Encodings.Web;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Mvc.TagHelpers;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.Caching.Memory;

namespace AspNetCoreScriptTagHelperOverride
{
    [HtmlTargetElement("script")] // A
    public class MyScriptTagHelper : ScriptTagHelper
    {
        public MyScriptTagHelper(
            IHostingEnvironment env,
            IMemoryCache cache,
            HtmlEncoder html,
            JavaScriptEncoder js,
            IUrlHelperFactory url) : base(env, cache, html, js, url) { } // B

        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            const string appendVersion = "asp-append-version";
            if (!context.AllAttributes.Any(a => a.Name == appendVersion))
            {
                var attributes = new TagHelperAttributeList(context.AllAttributes);
                attributes.Add(appendVersion, true);
                context = new TagHelperContext(attributes, context.Items, context.UniqueId);
            } // E

            base.AppendVersion = true; // C
            base.Process(context, output); // D
        }
    }
}

解释
  • 答:设置TagName"script" .
  • B:实现基础构造函数。
  • C:硬编码 AppendVersion为真。
  • D:调用基类的Process .
  • E:克服 AttributeMatcher.TryDetermineMode

  • 用法

    _ViewImports.cshtml remove the existing tag helper and add your override .
    @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
    @removeTagHelper Microsoft.AspNetCore.Mvc.TagHelpers.ScriptTagHelper, Microsoft.AspNetCore.Mvc.TagHelpers
    @addTagHelper *, AspNetCoreScriptTagHelperOverride
    

    请务必使用程序集的名称。

    一旦完成,你的代码就会在任何有 script 的地方执行。标签助手。例如,以下两个都会有 AppendVersion设置为 true .
    <script src="~/js/site.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>
    <script src="~/js/site.js" asp-append-version="false"></script>
    

    这将是生成的 HTML:
    <script src="/js/site.js?v=4q1jwFhaPaZgr8WAUSrux6hAuh0XDg9kPS3xIVq36I0"></script>
    

    也可以看看

    https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.TagHelpers/ScriptTagHelper.cs

    关于asp.net-core - 如何创建一个继承自标准 .Net Core 脚本标签助手的脚本标签助手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50958531/

    相关文章:

    c# - 将 ModelExpression 从 Tag Helper 传递到分部 View

    c# - 带有 FileInfo 的 ASP.NET Core 序列化对象返回不完整的 JSON

    c# - 如何在.NET CORE类库中添加service.AddDbContext

    c# - 在 .NET Core 中从 HttpResponseMessage 转换为 IActionResult

    asp.net-core - 在 ASP.Net Core 中创建自定义 HTML 帮助器

    c# - ASP.Net Core 2.1 - 从子 TagHelper 读取 TagHelper 的父属性

    asp.net-mvc - 结合 asp-route-id 和 asp-route-all-data

    c# - 依赖注入(inject) ASP.NET Core : Register multiple implementations

    c# - 如何更改 TagHelpers 中 ModelExpression 的类类型?

    c# - 手动实例化和调用 TagHelpers