首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在CSS / JS文件的ASP.NET MVC中的自动版本控制?

在CSS / JS文件的ASP.NET MVC中的自动版本控制?
EN

Stack Overflow用户
提问于 2011-01-30 14:07:33
回答 2查看 15.7K关注 0票数 19

我读过很多关于如何自动设置你的CSS/JS文件版本的文章--但是这些文章都没有提供一个在ASP.NET MVC中做这件事的优雅方法。

这个链接-- How to force browser to reload cached CSS/JS files? --为Apache提供了一个解决方案--但是我对如何通过ASP.NET MVC实现这一点感到有点困惑。

谁能提供一些建议,如何在IIS7和CSS MVC上做到这一点-使ASP.NET /JS文件自动在网址中插入一个版本号,而不改变文件的位置?

也就是说,所以链接出来链接这个等假设使用URL重写或?

代码语言:javascript
复制
<link rel="stylesheet" href="/css/structure.1194900443.css" type="text/css" />
<script type="text/javascript" src="/scripts/prototype.1197993206.js"></script>

Thx

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-30 14:13:30

当遇到这个问题时,我围绕UrlHelperContent方法编写了一系列包装函数:

编辑:

根据下面评论中的讨论,我更新了这段代码:

代码语言:javascript
复制
public static class UrlHelperExtensions
{
    private readonly static string _version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();

    private static string GetAssetsRoot()
    {
        string root = ConfigurationManager.AppSettings["AssetsRoot"];
        return root.IsNullOrEmpty() ? "~" : root;
    }

    public static string Image(this UrlHelper helper, string fileName)
    {
        return helper.Content(string.Format("{0}/v{2}/assets/img/{1}", GetAssetsRoot(), fileName, _version));
    }

    public static string Asset(this UrlHelper helper, string fileName)
    {
        return helper.Content(string.Format("{0}/v{2}/assets/{1}", GetAssetsRoot(), fileName, _version));
    }

    public static string Stylesheet(this UrlHelper helper, string fileName)
    {
        return helper.Content(string.Format("{0}/v{2}/assets/css/{1}", GetAssetsRoot(), fileName, _version));
    }

    public static string Script(this UrlHelper helper, string fileName)
    {
        return helper.Content(string.Format("{0}/v{2}/assets/js/{1}", GetAssetsRoot(), fileName, _version));
    }
}

将这些函数与以下rewrite规则结合使用应该可以:

代码语言:javascript
复制
<rewrite>
  <rules>
    <rule name="Rewrite assets">
      <match url="^v(.*?)/assets/(.*?)" />
      <action type="Rewrite" url="/assets/{R:2}" />
    </rule>
  </rules>
</rewrite>

This article讨论了如何在IIS7上创建重写规则。

此代码使用当前程序集的版本号作为它发出的文件路径上的查询字符串参数。当我更新站点并且内部版本号递增时,文件上的querystring参数也会递增,因此用户代理将重新下载该文件。

票数 15
EN

Stack Overflow用户

发布于 2013-08-03 21:43:12

我认为下一个具有高级选项(调试/发布模式、版本)的解决方案:

通过以下方式包含的Js或Css文件:

代码语言:javascript
复制
<script type="text/javascript" src="Scripts/exampleScript<%=Global.JsPostfix%>" />
<link rel="stylesheet" type="text/css" href="Css/exampleCss<%=Global.CssPostfix%>" />

在Global.asax中,Global.JsPostfix和Global.CssPostfix的计算方法如下:

代码语言:javascript
复制
protected void Application_Start(object sender, EventArgs e)
{
    ...
    string jsVersion = ConfigurationManager.AppSettings["JsVersion"];
    bool updateEveryAppStart = Convert.ToBoolean(ConfigurationManager.AppSettings["UpdateJsEveryAppStart"]);
    int buildNumber = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Revision;
    JsPostfix = "";
#if !DEBUG
    JsPostfix += ".min";
#endif      
    JsPostfix += ".js?" + jsVersion + "_" + buildNumber;
    if (updateEveryAppStart)
    {
        Random rand = new Random();
        JsPosfix += "_" + rand.Next();
    }
    ...
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4841455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档