ASP.NET MVC 扩展HtmlHelper类为 js ,css 资源文件添加版本号

写在前面

在项目部署当中会需要更新 css 文件或 js 等资源文件,为了避免由于浏览器缓存的原因无法加载新的 css 或 js ,一般的做法是在资源文件的后面加上一个版本号来解决,这样浏览器就会去服务器下载新的资源文件。

如果某个 css 文件被多个页面引用,那么我们就需要去每个页面一个一个的去修改,这样做的方式属于重复性的动作,而且有的时候还会漏掉需要修改的页面,所以我们就需要一个自动管理资源文件版本号的功能

先看效果

如何实现

通过扩展HemHelper 类,添加 为 js 和 css 文件处理的方法

 

public static class HtmlHelperExtension{/// <summary>/// 自动为 Js 文件添加版本号/// </summary>/// <param name="html"></param>/// <param name="contentPath"></param>/// <returns></returns>public static MvcHtmlString Script(this HtmlHelper html, string contentPath){return VersionContent(html, "<script src=\"{0}\" type=\"text/javascript\"></script>", contentPath);}/// <summary>/// 自动为 css 文件添加版本号/// </summary>/// <param name="html"></param>/// <param name="contentPath"></param>/// <returns></returns>public static MvcHtmlString Style(this HtmlHelper html, string contentPath){return VersionContent(html, "<link href=\"{0}\" rel=\"stylesheet\" type=\"text/css\">", contentPath);}private static MvcHtmlString VersionContent(this HtmlHelper html, string template, string contentPath){var httpContenxt = html.ViewContext.HttpContext;string hashValue = VersionUtils.GetFileVersion(httpContenxt.Server.MapPath(contentPath));contentPath = UrlHelper.GenerateContentUrl(contentPath, httpContenxt) + "?v=" + hashValue;return MvcHtmlString.Create(string.Format(template, contentPath));}}
View Code

 

 新建一个 VersionUtils 类来生成资源文件的版本号,下面的代码实现了计算文件的 hash 值作为版本号

public static class VersionUtils{public static Dictionary<string, string> FileHashDic = new Dictionary<string, string>();public static string GetFileVersion(string filePath){/** 生成版本号有三种方式* 1. 将文件的将最后一次写入时间作为版本号 => File.GetLastWriteTime(filePath).ToString("yyyyMMddHHmmss");* 2. 从配置文件中读取预先设定版本号  => ConfigurationManager.AppSettings["Js_CSS_Version"];* 3. 计算文件的 hash 值  */string fileName = Path.GetFileName(filePath);// 验证是否已计算过文件的Hash值,避免重复计算if (FileHashDic.ContainsKey(fileName)){return FileHashDic[fileName];}else{string hashvalue = GetFileShaHash(filePath); //计算文件的hash值
                FileHashDic.Add(fileName, hashvalue);return hashvalue;}}private static string GetFileShaHash(string filePath){string hashSHA1 = String.Empty;//检查文件是否存在,如果文件存在则进行计算,否则返回空值if (System.IO.File.Exists(filePath)){using (System.IO.FileStream fs = new System.IO.FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read)){//计算文件的SHA1值System.Security.Cryptography.SHA1 calculator = System.Security.Cryptography.SHA1.Create();Byte[] buffer = calculator.ComputeHash(fs);calculator.Clear();//将字节数组转换成十六进制的字符串形式StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < buffer.Length; i++){stringBuilder.Append(buffer[i].ToString("x2"));}hashSHA1 = stringBuilder.ToString();}//关闭文件流
            }return hashSHA1;}}

 

如何使用

在View中的使用方式

@Html.Style("~/Content/table.css")
@Html.Style("~/Content/wxSite.css")
@Html.Script("~/Scripts/jquery-1.10.2.min.js")

 

参考文章

https://www.cnblogs.com/aehyok/archive/2012/11/17/2774500.html

转载于:https://www.cnblogs.com/wubh/p/9512391.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/485288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生物学哲学:科学哲学的新视野

来源&#xff1a;自然辩证法研究 2003年第4期作者&#xff1a;周建漳在未经言明的情况下&#xff0c;“科学”一词通常总是指向“自然科学”&#xff0c;而在传统“科学哲学”的视野中&#xff0c;“科学”则又似乎“不言自明”地指向“数理科学”&#xff08;注&#xff1a;所…

计算机组成原理——指令与数据的寻址方式

计算机组成原理——指令与数据的寻址方式 前言&#xff1a; 指令的定义&#xff1a;计算机执行某种操作的命令。从计算机组成的层次结构来看&#xff0c;计算机的指令有微指令&#xff0c;机器指令&#xff0c;宏指令之分。 微指令&#xff1a;微程序级的命令&#xff0c;它属…

【剑指offer】面试题46. 把数字翻译成字符串(java)

给定一个数字&#xff0c;我们按照如下规则把它翻译为字符串&#xff1a;0 翻译成 “a” &#xff0c;1 翻译成 “b”&#xff0c;……&#xff0c;11 翻译成 “l”&#xff0c;……&#xff0c;25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数&#xff0c;用来计…

IBM被曝拟出售昔日明星业务Watson Health,10年医疗梦就此破碎?

来源&#xff1a;AI前线 整理&#xff1a;刘燕传 IBM 拟出售 Watson Health 业务据《华尔街日报》报道&#xff0c;IBM 或将出售 IBM Watson Health 业务。华尔街日报援引知情人士称&#xff0c;随着公司新任 CEO 开始精简公司规模&#xff0c;并在混合云计算领域发力&#xf…

C# WebBrowser 设置独立的代理

近期需要对webbrower设置代理&#xff0c;找到了如下方案&#xff1a; 1. 对修改注册表&#xff0c;设置全局代理 这种方法限制在一个进程内只能设置或取消代理&#xff0c;而且是全局代理&#xff0c;对于部分不需要代理对功能会产生影响 2. 通过函数InternetSetOption实现修改…

全球光刻机龙头是怎样炼成的

来源&#xff1a;公众号「驭势资本」半导体芯片制作分为IC设计、IC制造、IC封测三大环节&#xff0c;光刻作为IC制造的核心环节&#xff0c;其主要作用是将掩模版上的芯片电路图转移到硅片上。由于光刻的工艺水平直接决定芯片的制程水平和性能水平&#xff0c;光刻成为IC制造中…

页面置换算法——最佳置换算法、最近最少使用算法、先进先出算法、时钟置换算法

计算机操作系统——页面置换算法 根据中国大学MOOC计算机操作系统(电子科技大学)而写. 如果自己要设计页面置换&#xff0c;要根据什么原则来设计&#xff1f;我们首先想到的是存储器的局部性原理&#xff08;时间局部性、空间局部性&#xff09; Page removed should be the …

【剑指offer】面试题47:礼物的最大价值(Java)

在一个 m*n 的棋盘的每一格都放有一个礼物&#xff0c;每个礼物都有一定的价值&#xff08;价值大于 0&#xff09;。你可以从棋盘的左上角开始拿格子里的礼物&#xff0c;并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值&#xff0c;请计…

vue中如何创建组件?

全局注册 Vue.component(my-component-name, {// ... 选项 ... }) 这些组件是全局注册的&#xff0c;也就是说它们在注册之后可以用在任何新创建的Vue根实例&#xff08;new Vue&#xff09;的模板中。比如&#xff1a; js中&#xff1a; Vue.component(component-a, { /* ... …

MIT提出Liquid机器学习系统,可像液体一样适应动态变化

作者&#xff1a;Daniel Ackerman机器之心编译编辑&#xff1a;Panda麻省理工学院&#xff08;MIT&#xff09;的研究者开发出了一种新型的神经网络&#xff0c;其不仅能在训练阶段学习&#xff0c;而且还能持续不断地适应。他们将这种灵活的算法命名为「Liquid」网络&#xff…

【剑指offer】面试题48. 最长不含重复字符的子字符串(java)

请从字符串中找出一个最长的不包含重复字符的子字符串&#xff0c;计算该最长子字符串的长度。 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。 示例 2: 输入: "bbbbb" 输出: 1 解释…

IPMITool driver

IPMITool driver 官网链接&#xff1a; https://docs.openstack.org/ironic/latest/admin/drivers/ipmitool.html IPMITool driver 概述IPMI(Intelligent Platform Management Interface) drivers通过IPMI协议2.0或1.5来管理节点。使用IPMITool工具来控制使能的IPMI设备&#x…

如何理解在数据类型中元素不能修改?

如何理解在数据类型中元素不能修改&#xff1f; 我所理解的元素修改是&#xff1a; 不能对已经赋值或者初始化的数据类型进行元素的修改&#xff0c;这里的修改不是指片面意思上的输错了数值&#xff0c;将光标移到对应位置&#xff0c;按下删除键&#xff0c;再进行数据的修改…

打破 Google 破坏性的搜索垄断

作者&#xff1a;Ryan Cooper译者&#xff1a;Sambodhi策划&#xff1a;刘燕近来&#xff0c;Google 在搜索算法方面的垄断地位&#xff0c;频繁引起美国和欧洲的反垄断关注。Google 在网络搜索方面有绝对的优势。近来&#xff0c;Google 在搜索算法方面的垄断地位&#xff0c;…

【剑指offer】面试题49:丑数

我们把只包含因子 2、3 和 5 的数称作丑数&#xff08;Ugly Number&#xff09;。求按从小到大的顺序的第 n 个丑数。 示例: 输入: n 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。 说明: 1 是丑数。 n 不超过1690。 代码&#xff1a; class Solu…

修改maven打包名字

仅需在pom.xml添加下列配置 build><finalName>userapi</finalName></build>转载于:https://www.cnblogs.com/zhao-shan/p/9520010.html

计算机网络——时延、时延带宽积、往返时间、利用率

计算机网络——时延、时延带宽积、往返时间、利用率 推荐课程&#xff1a;https://www.bilibili.com/video/BV19E411D78Q/?p4 1.时延 时延&#xff08;delay或latency&#xff09;是指数据&#xff08;报文、分组、比特&#xff09;从网络&#xff08;或链路&#xff09;的…

一文读懂虚拟现实产业最新发展趋势

来源&#xff1a; 中国电子报作者&#xff1a;赛迪智库虚拟现实产业形势分析课题组2020年以来&#xff0c;5G商用化进程的加速和新冠肺炎疫情背景下“非接触式”经济的新需求为虚拟现实产业发展带来了新的机遇。虚拟现实、增强现实技术在支撑服务疫情防控、加快企业复工复产、强…

【剑指offer】面试题50:第一个只出现一次的字符(java)

在字符串 s 中找出第一个只出现一次的字符。如果没有&#xff0c;返回一个单空格。 示例: s "abaccdeff" 返回 "b" s "" 返回 " " 限制&#xff1a; 0 < s 的长度 < 50000 代码&#xff1a; class Solution { publi…

log4net日志文件的应用

日志作为快速定位程序问题的主要手段&#xff0c;日志几乎是所有程序都必须拥有的一部分&#xff0c;下面我们就看下怎么使用log4net.dll文件&#xff1a; 1.下载log4net.dll文件 2.创建自己的项目 3.在自己项目下的引用log4net.dll文件 4.在app.config配置文件里添加配置信息&…