如何创建从标准.Net Core脚本标记助手继承的脚本标记助手

时间:2018-06-20 23:47:24

标签: 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” 属性?这将使我不必进行大量文件更新就可以清除缓存。

1 个答案:

答案 0 :(得分:2)

  

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

代码(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
        }
    }
}

说明

  • A:将TagName设置为"script"
  • B:实现基本构造函数。
  • C:将硬编码AppendVersion设为true。
  • 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