如何创建继承标准 .Net Core 脚本标签帮助器的脚本标签帮助器

2024-02-15

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

我需要为 JavaScript 和 CSS 文件引入缓存清除。我很欣赏这可以轻松地使用asp-append-version=“true”新的 .Net Core 脚本标记帮助器上的属性。

然而,我的应用程序在 100 多个地方都有脚本标签。在所有这些地方添加属性将涉及大量页面,这意味着大量的回归测试。

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


...创建一个继承自 .Net Core 脚本标记帮助器的新脚本标记帮助器,并且始终具有 asp-append-version="true" 属性?

Code (在 GitHub 上查看 https://github.com/bigfont/AspNetCoreScriptTagHelperOverride)

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 to "script".
  • B:实现基本构造函数。
  • C:硬代码AppendVersion为真。
  • D:调用基类的Process.
  • E:克服AttributeMatcher.TryDetermineMode https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.TagHelpers/ScriptTagHelper.cs#L225

Usage

In _ViewImports.cshtml 删除现有的标签助手并添加您的覆盖 https://learn.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro?view=aspnetcore-2.1#managing-tag-helper-scope.

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@removeTagHelper Microsoft.AspNetCore.Mvc.TagHelpers.ScriptTagHelper, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, AspNetCoreScriptTagHelperOverride

请务必使用您的姓名assembly.

完成后,您的代码将在有任何地方执行script标签助手。例如,以下两者都会有AppendVersion set to 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>

See Also

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建继承标准 .Net Core 脚本标签帮助器的脚本标签帮助器 的相关文章

随机推荐