【问题标题】:How to create a script tag helper that inherits from the standard .Net Core script tag helper如何创建一个继承自标准 .Net Core 脚本标签助手的脚本标签助手
【发布时间】:2018-06-20 23:47:23
【问题描述】:

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

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

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

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

【问题讨论】:

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


【解决方案1】:

...创建一个新的脚本标签助手,它继承自 .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
        }
    }
}

说明

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

用法

_ViewImports.cshtmlremove 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-append-version 属性,这个标签助手会以某种方式向标签添加第二个 src 属性。但是 Chrome 完全忽略了第二个 src 属性,所以它不是一个真正的问题。
  • 抱歉,忘记将@removeTagHelper 添加到我的_ViewImports.cshtml。它现在可以完美运行,无需添加第二个 src。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多