写在前面

在项目部署当中会需要更新 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

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

  1. gulp实现打包js/css/img/html文件,并对js/css/img文件加上版本号

    参考打包教程: http://www.cnblogs.com/tugenhua0707/p/4069769.html http://www.cnblogs.com/tugenhua0707/p/498 ...

  2. ASP.NET MVC扩展库

    很多同学都读过这篇文章吧 ASP.NET MVC中你必须知道的13个扩展点,今天给大家介绍一个ASP.NET MVC的扩展库,主要就是针对这些扩展点进行.这个项目的核心是IOC容器,包括Ninject ...

  3. 为ASP.NET MVC扩展异步Action功能(下)

    本文分为上下两部分,您也可以从<Extend ASP.NET MVC for Asynchronous Action>获得全部内容. 执行Action方法 对于执行同步Action的Syn ...

  4. ASP.net Core MVC项目给js文件添加版本号

    需求:使用ASP.net Core Mvc开发公司内部web系统,给视图中js(css,image也可以)文件添加版本号避免缓存问题. 解决方法:利用Taghelper提供的标签(asp-append ...

  5. BUG解决:部分JS等资源文件直接加载失败

    记一次BUG解决 记一次BUG解决 问题描述 排查及解决 后续 问题描述 近期用户反映系统经常页面加载不全,功能按钮失效,需要多次刷新才可用,失败率极高,已经影响了用户的使用,我们在本地使用却没有任何 ...

  6. Asp.Net MVC使用HtmlHelper渲染,并传递FormCollection参数的陷阱

    在Asp.Net MVC 1.0编程中,我们经常遇见这样的场景,在新建一个对象时候,通过HtmlHelper的方式在View模型中渲染Html控件,当填写完相关内容后,通过Form把需要新建的内容Po ...

  7. asp.net MVC发布iis无法加载css,js和图片

    今天真够郁闷的,遇到了在本地能运行的项目到了iis服务器那里就不行了,无法加载css,js和图片,这里说清楚一下先,关于asp.net 的MVC中这样的情况其实不少,但是之前遇到的是在visual s ...

  8. web前端从无到有html标签,.NET MVC 扩展 HtmlHelper 从无到有(一)

    对于MVC的html扩展一直都有想法,今天来小小尝试一下. 首先对扩展一无所知的我科普了一下MVC扩展: OK,现在对System.Web.Mvc.Html进行反编译. 现在看到源码了,那么一切都不是 ...

  9. Spring Boot thymeleaf模版支持,css,js等静态文件添加

    Thymeleaf引入 Thymeleaf是一个Java模板引擎开发库,可以处理和生成HTML.XML.JavaScript.CSS和文本,在Web和非Web环境下都可以正常工作. 1.添加依赖包 & ...

最新文章

  1. QIIME 2教程. 01简介和安装 Introduction Install(2020.11开始更新)
  2. 贝叶斯推断方法 —— 从经验知识到推断未知
  3. python定义浮点数数组_tensorflow之tf.record实现存浮点数数组
  4. 幅度响应怎么计算_广播百科 频率响应
  5. Vue body样式修改
  6. disp语句怎么格式 matlab_Matlab使用技巧总结-1
  7. Spring IOC学习心得之BeanPostProcessor,BeanNameAware,BeanClassLoaderAware,BeanFactoryAware接口是如何起作用的
  8. Mac os x 系统的发展史
  9. 内卷太厉害怎么办?多读好书破万“卷”
  10. 算法系列之二十三:离散傅立叶变换之音频播放与频谱显示
  11. 解决打印机问题的方法
  12. TF-IDF算法java实现【转载】
  13. 内网工具 CS的基础使用
  14. 软件开发实习做什么_为什么要有开发人员实习时间
  15. 致计算机专业准大一新生
  16. API接口是什么?(京东API详解)
  17. 移动OA,颠覆企业传统助力办公更高效
  18. ROS2编程基础课程--库
  19. 鸿蒙使用linux内核微内核,浅谈鸿蒙操作系统的微内核
  20. web应用开发的主流技术

热门文章

  1. asp删除mysql_asp php 清空access mysql mssql数据库的代码
  2. hdfs复制文件夹_HDFS常用命令
  3. LeetCode 1634. 求两个多项式链表的和
  4. LeetCode 638. 大礼包(无限背包DP)
  5. 分治应用--最近点对问题 POJ 3714
  6. python将元祖设为整形_python基础(5)---整型、字符串、列表、元组、字典内置方法和文件操作介绍...
  7. 写一个函数取出php,写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名...
  8. python怎么给画布填上颜色_python numpy matplotlib画小方块填充背景色和添加不同色彩的文字...
  9. css3案例分析,CSS3动画/动画库以及案例分析(上)
  10. linux 子目录 挂载,linux – NFS4 – 挂载多个子目录