如何创建从标准 .Net Core 脚本标签助手继承的脚本标签助手
How to create a script tag helper that inherits from the standard .Net Core script tag helper
我维护着一个大型遗留 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
}
}
}
说明
- A:将
TagName
设置为"script"
。
- B:实现基础构造函数。
- C:硬编码
AppendVersion
为真。
- D:调用基地class的
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 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
}
}
}
说明
- A:将
TagName
设置为"script"
。 - B:实现基础构造函数。
- C:硬编码
AppendVersion
为真。 - D:调用基地class的
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