如何无需修改代码为所有link、script、img标签设置asp-append-version="true"?
如何无需修改代码为所有link、script、img标签设置asp-append-version="true"?
嘿,我太懂你的需求了——不想一个个手动改视图里的静态资源标签,也不想靠缓存过期时间碰运气,就想改了静态资源后用户立马能拿到新内容对吧?那用全局TagHelper绝对是完美解决方案,不用动现有代码,一步到位!
我给你整理了完整的实现步骤,亲测有效:
第一步:创建自动添加版本号的TagHelper类
新建一个类(比如叫AutoAppendVersionTagHelper),把下面的代码复制进去。这个类会自动识别script、link、img标签,给本地静态资源自动加上版本号支持:[HtmlTargetElement("script", Attributes = "src")] [HtmlTargetElement("link", Attributes = "href")] [HtmlTargetElement("img", Attributes = "src")] public class AutoAppendVersionTagHelper : TagHelper { private readonly IFileVersionProvider _fileVersionProvider; private readonly IHttpContextAccessor _httpContextAccessor; // 注入生成版本号需要的服务 public AutoAppendVersionTagHelper(IFileVersionProvider fileVersionProvider, IHttpContextAccessor httpContextAccessor) { _fileVersionProvider = fileVersionProvider; _httpContextAccessor = httpContextAccessor; } public override void Process(TagHelperContext context, TagHelperOutput output) { base.Process(context, output); // 根据标签类型确定资源路径的属性名 string attributeName = output.TagName switch { "script" or "img" => "src", "link" => "href", _ => null }; // 找不到对应的属性就直接返回 if (attributeName == null || !output.Attributes.TryGetAttribute(attributeName, out var resourceAttribute)) { return; } string resourcePath = resourceAttribute.Value.ToString(); // 跳过CDN等绝对URL的资源,只处理本地静态文件 if (Uri.IsWellFormedUriString(resourcePath, UriKind.Absolute)) { return; } // 自动给标签加上asp-append-version="true",让ASP.NET Core自动处理版本号 if (!output.Attributes.ContainsName("asp-append-version")) { output.Attributes.Add("asp-append-version", "true"); } } }第二步:注册这个TagHelper到全局视图
找到项目里的_ViewImports.cshtml文件,添加一行代码,把你的TagHelper注册进去(注意把YourProjectName换成你实际的程序集名称,比如你的项目叫MyShop,就写MyShop):@addTagHelper *, YourProjectName第三步:搞定!
现在不用改任何现有视图里的标签,这个TagHelper会自动给所有本地的script、link、img资源加上版本号。你改了静态文件(比如CSS、JS、图片)后,生成的URL会自动带上新的版本哈希值,用户刷新页面就会加载最新资源,完全不用依赖缓存过期策略~
内容来源于stack exchange
相关产品推荐
相关产品推荐

