0

我正在使用 MVC,我们希望阻止浏览器加载我们的旧 .js/.css 文件。大多数网络都说在 .js 文件的末尾使用查询字符串。所以,在一个视图中,我是这样做的:

@section scripts
{
     <script src="@Url.Content("/Scripts/Person/people_list.js?" + System.DateTime.Now)"></script>
}

到目前为止一切顺利,这很好用。缓存测试的行为如我所愿。

这是我的问题 - 我们在几个不同的文件中有很多这些脚本标签。我们希望我们所有的 .js/.css 都使用这种模式。我想知道是否有一种方法可以在某处添加代码来更新所有这些脚本标签以添加查询字符串。(就像在共享文件夹的 Layout.cshtml 中一样?)或者,我是否应该手动更新每个视图中的每一个?

谢谢

4

2 回答 2

1

不,您可能应该改用捆绑和缩小。每当您更改其中一个文件时,它都会为您自动生成查询字符串值。您的代码永远不会允许缓存资源,因为 DateTime.Now 在调用之间永远不会相同(除非您也进行输出缓存)。

这是一篇关于如何做到这一点的文章:http ://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification虽然它谈到 MVC 4/.NET 4.5,但您可以获得捆绑和从 nuget 为早期版本的 .NET 缩小内容,并且可以在较旧的 webforms 网站上使用它,它只是没有内置。

此外,为了更轻松地调试和更快/更小的生产文件,您应该包括您的样式,例如:

@section styles {
    @Styles.Render("~/content/home")
}

和你的 javascript 喜欢:

@section scripts {
    @Scripts.Render("~/bundles/jquery")
}

这允许您在调试中单独包含的脚本和样式与生产中的完全组合和缩小版本之间切换,并在 web.config 中进行切换。举个不错的例子,创建一个新的 MVC 4 Internet Web 应用程序,您可以看到它们如何在 中构建默认捆绑包App_Start\BundleConfig.cs,以及它们如何放置在Views\Shared\_Layout.cshtml

于 2013-06-05T21:28:14.540 回答
0

一种常用的模式是在请求的页面上生成一个常量服务器端。这样,您既可以在调试时使用时间戳,也可以使用与特定提交/上传相关的“版本”号,以便仅在需要时清除缓存。

当然,这也可以通过手动客户端完成。例如,RequireJS 提供了一个 'bust' 选项来执行此操作。

例如(这个例子是在 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'); ?>">
于 2013-06-05T21:27:46.423 回答