我正在使用MVC,我们希望阻止浏览器加载旧的.js / .css文件。大多数'net表示在.js文件末尾使用查询字符串。所以,在一个视图中,我已经这样做了:
@section scripts
{
<script src="@Url.Content("/Scripts/Person/people_list.js?" + System.DateTime.Now)"></script>
}
到目前为止一切顺利,这很有效。缓存测试表现得像我想的那样。
这是我的问题 - 我们在几个不同的文件中有很多这些脚本标签。我们希望所有的.js / .css都使用这种模式。我想知道是否有办法在某处添加代码来更新所有这些脚本标记以添加查询字符串。 (可能在共享文件夹的Layout.cshtml中?)或者,我是否应该手动更新每个视图中的每一个?
由于
答案 0 :(得分:1)
不,你应该转而使用捆绑和缩小。每次更改其中一个文件时,它都会为您自动生成查询字符串值。您的代码将永远不会允许缓存资源,因为DateTime.Now在调用之间永远不会相同(除非您也输出缓存)。
这是一篇关于如何做到这一点的文章:http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification虽然它谈到MVC 4 / .NET 4.5,你可以从早期版本的.NET获得nuget的捆绑和缩小内容,并且可以在较旧的webforms网站,它只是没有内置。
另外,为了便于调试,以及更快/更小的生产文件,您应该包括以下样式:
@section styles {
@Styles.Render("~/content/home")
}
和你的javascript一样:
@section scripts {
@Scripts.Render("~/bundles/jquery")
}
这允许您在调试中单独包含脚本和样式之间切换,以及在生产中使用web.config中的开关完全组合和缩小版本。有关一个不错的示例,请创建一个新的MVC 4互联网Web应用程序,您可以看到他们如何在App_Start\BundleConfig.cs
中构建默认捆绑包,以及如何将它们放在Views\Shared\_Layout.cshtml
答案 1 :(得分:0)
常用模式是在请求的页面上生成一个常量服务器端。这样,您可以在调试时使用时间戳或与特定提交/上载相关的“版本”号,以便仅在需要时清除缓存。
当然,这也可以由客户端完成。例如,RequireJS提供了“bust”选项。
e.g。 (这个例子是在PHP中,但可能是真的)
<?php define('VERSION', 34); ?>
...
<?php
function get_url_bust( $url ) {
return $url . "?" . VERSION; // you would also like to check if the URL already contains a query etc. of course
}
?>
...
<script src="<?php get_url_bust('something.js'); ?>">