在开发MVC视图时强制浏览器刷新javascript代码?

在开发MVC视图时强制浏览器刷新javascript代码?,javascript,asp.net-mvc,browser,cross-browser,browser-cache,Javascript,Asp.net Mvc,Browser,Cross Browser,Browser Cache,很简单,我正在开发一个MVC5应用程序,并且(最近)注意到我的浏览器似乎正在缓存@sectionscripts{}中视图中的JavaScript代码 目前我正在使用Chrome进行开发,我尝试了CTRL+F5&CTRL+SHFT+R,重新加载页面,但javascript代码中未注释的alert()I仍按注释呈现。我还尝试通过隐姓埋名模式和其他浏览器(Firefox、IE)访问我的本地主机,并且得到了相同的行为。这是我的/Home/Index.cshtml视图,它是应用程序启动时加载的默认视图。我

很简单,我正在开发一个MVC5应用程序,并且(最近)注意到我的浏览器似乎正在缓存
@sectionscripts{}
中视图中的JavaScript代码

目前我正在使用Chrome进行开发,我尝试了
CTRL+F5
&
CTRL+SHFT+R
,重新加载页面,但javascript代码中未注释的
alert()
I仍按注释呈现。我还尝试通过隐姓埋名模式和其他浏览器(Firefox、IE)访问我的本地主机,并且得到了相同的行为。这是我的
/Home/Index.cshtml
视图,它是应用程序启动时加载的默认视图。我还尝试在页面中添加一些额外的HTML文本,但新代码仍然没有生效/显示

我当前的Chrome版本是41.0.2272.118 m版,如果有人知道会发生什么事


更新

我在Chrome中的开发者工具=>常规设置下检查了
[X]禁用缓存(当DevTools打开时)
,然后反复尝试
CTRL+SHFT+R
CTRL+F5
,结果与我之前的更改没有生效时相同

更新2

在DevTools打开的情况下,我还按住了刷新按钮,并尝试了正常/硬/和空缓存&硬重新加载选项,所有这些都得到了相同的结果。为了简化测试,我在页面加载后立即在下面的dispaly中添加了一个警报(目前没有警报出现):


您可能希望在脚本url之后添加no_缓存变量,如:

<script src="js/stg/Stg.js?nocache=@random_number"></script> 

如果您将一个随机数放入我指定的位置,浏览器将在F5之后自动下载脚本的最新版本。如果您正在使用,则有两个选项可禁用缓存:

  • 使用。这指示绑定在调试时缩小和优化您的绑定。在这个过程中,它会根据脚本的内容生成一个散列,因此您的客户浏览器可以长时间缓存此文件。下次文件更改时,它将生成一个完全不同的散列,以便您的客户可以看到您的更改。缺点是您的脚本将变得不可读,并且您将无法调试它,因此这可能不是您的最佳选择
  • 使用
    System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(“url”,true)
    来解析脚本的url,第二个参数(
    true
    )是要与url一起生成的哈希,因此,在更改文件时阻止浏览器缓存。这与第一个选项中生成的哈希完全相同,但没有缩小
  • 我创建了一个小演示,显示第二个选项可以防止缓存发生,诀窍是在不缩小脚本的情况下从脚本内容生成哈希

    我创建了一个名为
    myscript.js
    的脚本文件,其中包含以下内容:

    $(document).ready(function () {
        alert('a');
    });
    
    然后我将其添加到我的
    BundleConfig.cs

    // PLEASE NOTE this is **NOT** a ScriptBundle
    bundles.Add(new Bundle("~/bundles/myscripts").Include(
        "~/Scripts/myscript*"));
    
    如果您添加一个
    ScriptBundle
    ,您将再次得到一个缩小的响应,因为
    ScriptBundle
    只是一个使用
    JsMinify
    转换()的
    Bundle
    。这就是为什么我们只使用
    Bundle

    现在,您可以使用此方法添加脚本,以使用散列appendend解析脚本URL。您可以使用
    脚本。渲染

    @Scripts.Render(System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/bundles/myscripts", true))
    
    脚本
    标记:

    <script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/bundles/myscripts", true)"></script>
    
    
    
    任何一种方法都会生成一个带有哈希的URL,以防止缓存:

    编辑我的文件后:


    解决此问题的一个快速技巧是在新选项卡中打开脚本文件,然后在此页面上刷新它。 如果你碰巧打开了Chrome开发工具,它甚至会在那里刷新


    从dev工具中,您甚至可以在脚本的新选项卡中右键单击open

    当开发者工具打开时,你可以禁用Chrome的缓存:你可以发布视图的内容让我们用@section脚本{}查看吗??如果我们能看到你做了什么,可能会更容易些。同样使用chrome open developer tools(F12)并单击cog打开设置,有一个“禁用缓存”复选框,勾选它,现在如果使用developer tools open刷新页面,它也不会使用缓存。这可能没有帮助,但当chrome调试面板打开时,您可以按住页面重新加载按钮以获得重新加载选项。选择empty cache(空缓存)和hard reload(硬重新加载)也可以从缓存中清除任何后续节加载。有关更多信息,请参阅。您是否使用MVC的捆绑/缩小功能,或对脚本文件进行任何类型转换的任何其他机制?@MahmoudAli,是的,我使用
    BundleConfig.cs
    ,设置了一些捆绑包,但此代码特别是直接在
    @section Scripts{}中呈现
    在我的视图中--现在视图代码的更改似乎也没有显示出来。有时候,你不能对一个回复进行n^n次的投票,真是太遗憾了。。。好极了!很好的回答,对我来说很有魅力!谢谢你,真漂亮!工作得很好。感谢即使BundleTable.EnableOptimizations=false,缩小强制是否也能获得最新的javascript?因为在德夫身上,你不一定是真的。ThanksIt本身并不是要提供最新JS文件的缩微版本。正是生成的哈希实现了这一点。我的解决方案就是这样做的:强制生成哈希,即使EnableOptimizations设置为false。
    <script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/bundles/myscripts", true)"></script>