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

写在前面

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

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

先看效果

6c7b99e0a595a50bdad039aab9b5f1e2.png

如何实现

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

public static class HtmlHelperExtension

{

///

/// 自动为 Js 文件添加版本号

///

///

///

///

public static MvcHtmlString Script(this HtmlHelper html, string contentPath)

{

return VersionContent(html, "", contentPath);

}

///

/// 自动为 css 文件添加版本号

///

///

///

///

public static MvcHtmlString Style(this HtmlHelper html, string contentPath)

{

return VersionContent(html, "", 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));

}

}

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

public static class VersionUtils

{

public static Dictionary FileHashDic = new Dictionary();

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 = ; 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

&lbrack;Asp&period;net Mvc&rsqb;为js&comma;css静态文件添加版本号

方式一: 思路 string version = ViewBag.Version; @Scripts.RenderFormat("

写在前面 在app中嵌入h5应用,最头疼的就是缓存的问题,比如你修改了一个样式,或者在js中添加了一个方法,发布之后,并没有更新,加载的仍是缓存里面的内容.这个时候就需要清理缓存才能解决.但又不想让w ...

ASP&period;NET MVC 扩展HtmlHelper类方法

1.扩展HtmlHelper类方法ShowPageNavigate 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...

gulp实现打包js&sol;css&sol;img&sol;html文件,并对js&sol;css&sol;img文件加上版本号

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

ASP&period;NET MVC Bundles 合并压缩(js css&rpar;

Chrome浏览器有并发的Http请求限制,Bundles可以将多个JS文件合并成一个文件并进行压缩,最终得到一个单文件的压缩包. 第一步:BundleConfig public class Bund ...

一点ASP&period;NET MVC Html&period;Helper类的方法

一点ASP.NET MVC Html.Helper类 这里就只写一个Html.ActionLink()和Html.DropdownList(). Html.ActionLink()里有三个参数,第一个 ...

ASP&period;NET MVC扩展库

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

构建工具是如何用 node 操作 html&sol;js&sol;css&sol;md 文件的

构建工具是如何用 node 操作 html/js/css/md 文件的 从本质上来说,html/js/css/md ... 源代码文件都是文本文件,文本文件的内容都是字符串,对文本文件的操作其实就是对 ...

Spring 加载类路径外的资源文件

原文:http://blog.csdn.net/gaofuqi/article/details/46417259

随机推荐

Android 触摸手势基础 官方文档概览

Android 触摸手势基础 官方文档概览 触摸手势检测基础 手势检测一般包含两个阶段: 1.获取touch事件数据 2.解析这些数据,看它们是否满足你的应用所支持的某种手势. 相关API: Moti ...

下面是Webstorm的一些常用快捷键:

1. ctrl + shift + n: 打开工程中的文件,目的是打开当前工程下任意目录的文件.2. ctrl + j: 输出模板3. ctrl + b: 跳到变量申明处4. ctrl + alt + ...

Android使用Fragment定义弹出数字键盘

fragment主布局文件 <?xml version="1.0" encoding="utf-8"?>

Java script基础 回顾

一.语法 代码与C#相似,变量使用的是var引用出来,包含所有类型:可以直接使用,不用定义. 也是有内置分类的.例如:var b="10"  var c=10;一个是字符串一个是整 ...

jQuery的 delegate问题

习惯了bind,用惯了live,就不习惯delegate了呀有木有... 支持为动态生成的标签元素绑定事件也许就live和delegate了吧,不过新版本已经不支持live了,只有delegate d ...

HTML5新标签

标签定义外部的内容.比如来自一个外部的新闻提供者的一篇新的文章,或者来自 blog 的文本,或者是来自论坛的文本.亦或是来自其他外部源内容. HTML5:

SparkMLlib学习之线性回归

SparkMLlib学习之线性回归 (一)回归的概念 1,回归与分类的区别 分类模型处理表示类别的离散变量,而回归模型则处理可以取任意实数的目标变量.但是二者基本的原则类似,都是通过确定一个模型,将输 ...

java判断A字符串是否包含B字符串

public static void main(String[] args) { String str="ABC_001"; if(str.indexOf("ABC&qu ...

SLAM算法中提取特征总结

我们要知道三维空间中的点在图像中的位置,就需要提取特征与特征匹配了. 1.检测特征点 2.计算描述子 3.特征匹配 1.检测特征点 我们用到的检测特征点的方法是FAST算法,最大的特点就是快! 算法原 ...

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值