2010-04-13 43 views
2

可能重复:
force browsers to get latest js and css files in asp.net application如何版本MVC的JavaScript包括

我与别人的代码的工作,所以我不知道的全貌,并且我不T甚至知道MVC那么好,但这里的问题...

在Site.Master有一个

<%= Html.IncludeJs("ProductPartial")%> 

产生此行的最终加价

<script type="text/javascript" src="/Scripts/release/ProductPartial.js"></script> 

我做的JS文件中的一些变化,但旧的显然是由浏览器缓存,所以更改不会显示,直到用户刷新。通常的解决方法是在脚本源路径的末尾添加一个版本标签,但在这种情况下,我不确定如何做到这一点。

有什么建议吗?

+0

类似的问题,但仍然不同。 – Edgar 2010-04-13 14:43:44

回答

0

事实证明,IncludeJs是一种辅助方法,用于在发布模式下自动包含压缩的JS文件:LINK

所以我只需修改该方法一点,以包含版本号。对此感到抱歉。

+0

你提供的链接已损坏,请你更新你的答案新链接。 – Konammagari 2015-06-24 06:14:04

+0

该链接的缓存版本:http://webcache.googleusercontent.com/search?q=cache:OMvTd05XoEMJ:codebetter.com/karlseguin/2008/12/29/compressing-js-files-as-part-of-your -build进程/ + CD = 3&HL = EN&CT = clnk&GL = LV – Edgar 2015-06-28 13:54:45

0

您的版本策略确实不重要。只要文件名不同的是,浏览器将被迫以获得新的脚本。因此,即使这会工作:

<%= Html.IncludeJs("ProductPartialv1")%> 

ProductPartialv1.js 
我一直在使用这种技术的重要JavaScript和CSS的变化(CSS也被浏览器缓存)

- 所以我更新模板使用较新的版本,我很安全知道如果使用新的HTML,新的脚本和CSS文件也是如此。

这是“在行动”http://www.the-mag.me.uk/ - 在那里我只是增加文件的数字后缀。

+0

这意味着我必须每次更改文件时重命名文件并更新所有引用。不是完美的解决方案。 – Edgar 2010-04-13 12:03:56

+0

或者您可以从浏览器缓存中删除该文件..您使用的是哪种浏览器? – 2010-04-13 12:18:11

+0

这是关于强制用户的浏览器更新,而不是我自己的。 – Edgar 2010-04-13 14:41:32

4

为什么不写自己的HTML辅助扩展方法,并使其输出你的应用程序集的版本号?沿着这些线路的东西应该做的伎俩:

public static MvcHtmlString IncludeVersionedJs(this HtmlHelper helper, string filename) 
{ 
    var version = Assembly.GetExecutingAssembly().GetName().Version; 
    return MvcHtmlString.Create(filename + "?v=" + version); 
} 

然后,您可以增加组件的版本号,只要你发布一个新版本的用户,他们的高速缓存将整个应用程序无效。

+0

可能会有用。将看看我是否可以使用它而不是Html.IncludeJs。 – Edgar 2010-04-13 14:42:26

+0

我建议使用属性来只执行一次执行程序集版本。否则,它会为每个包含在每个页面上的每个脚本获取一次(不是特别快)的信息。 – smdrager 2013-08-09 12:56:48

+0

@smdrager当然,或者只是使用脚本捆绑,如果你有很多脚本,并希望自动处理版本问题 – 2013-08-09 15:52:09

4

我通过将最后修改的时间戳记作为查询参数解决了这个问题。

我用扩展方法做了这个,并在我的CSHTML文件中使用它。 注意:该实现将时间戳记缓存1分钟,所以我们不会对磁盘​​造成太大的影响。

这里是扩展方法:

public static class JavascriptExtension { 
    public static MvcHtmlString IncludeVersionedJs(this HtmlHelper helper, string filename) { 
     string version = GetVersion(helper, filename); 
     return MvcHtmlString.Create("<script type='text/javascript' src='" + filename + version + "'></script>"); 
    } 

    private static string GetVersion(this HtmlHelper helper, string filename) 
    { 
     var context = helper.ViewContext.RequestContext.HttpContext; 

     if (context.Cache[filename] == null) { 
      var physicalPath = context.Server.MapPath(filename); 
      var version = "?v=" + 
       new System.IO.FileInfo(physicalPath).LastWriteTime 
       .ToString("yyyyMMddhhmmss"); 
      context.Cache.Add(physicalPath, version, null, 
       DateTime.Now.AddMinutes(1), TimeSpan.Zero, 
       CacheItemPriority.Normal, null); 
      context.Cache[physicalPath] = version; 
      return version; 
     } 
     else { 
      return context.Cache[filename] as string; 
     } 
    } 

然后在CSHTML页:

@Html.IncludeVersionedJs("/MyJavascriptFile.js") 

在渲染HTML,这会显示为:

<script type='text/javascript' src='/MyJavascriptFile.ks?20111129120000'></script>