【问题标题】:How do you disable caching on Modal dialogs in IE?如何在 IE 中禁用模态对话框的缓存?
【发布时间】:2010-09-24 17:49:55
【问题描述】:

我们已经使用 IE 方法实现了一个弹出窗口作为模式对话框:

window.showModalDialog('...aspx')

弹出窗口的目标本身就是一个 ASP.Net 网页。

假设弹出窗口从未启动过以下步骤:

  1. 启动弹出窗口。
  2. Page_Load 事件处理程序在服务器端执行。
  3. 关闭弹出窗口。
  4. 立即再次启动弹出窗口。
  5. 这次没有执行 Page_Load 事件处理程序。

很明显,弹出内容正在被缓存,因为如果在第 4 步我们清除临时 Internet 文件,Page_Load 事件处理程序将第二次执行。

我们已经尝试将以下内容添加到网页的头部(如其他几个来源所推荐的那样),但似乎都没有效果。

<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="-1" />

我们也看到了使用这些的地方discouraged

谁能帮忙?

【问题讨论】:

    标签: html internet-explorer caching modal-dialog


    【解决方案1】:

    将时间戳查询字符串变量添加到对话框内容的 URL - 自 1/1/08 以来的滴答数或其他内容 - IE 会将其视为新页面并忽略缓存。

    【讨论】:

    • 这将在 IE 缓存中为您提供页面的多个实例。
    • 应添加额外的说明或示例,以证明此模式优于 Cacheability 设置。
    • @CertifiedCrazy - 随意添加它们;我敢肯定 6 年前的这个答案现在有点陈旧了。
    【解决方案2】:

    要清除缓存,请在页面加载中添加:

    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    

    【讨论】:

      【解决方案3】:

      鉴于 http-equiv 指令不起作用(并且可以说不应该使用),尽管不幸的是它属于 hack 解决方案类别,但我认为我们将不得不这样做(由格雷格)...

      url = "<Some url with query string>"
      var date = new Date();
      window.showModalDialog(url + “&” + date.getTime(), ... );
      

      奇怪的是,没有明确的方法来禁用这些模式对话框上的缓存。我不确定在网络浏览器中使用模式对话框是否被接受为“好主意”,但我们至少知道一些缺点和替代方案,但遗憾的是无法在这个项目中使用它们。

      感谢您的建议。

      【讨论】:

      • 确实有点老套,但我认为问题的根源在于 IE 中的缓存错误(当我告诉它不要缓存时,我已经记不清 IE 缓存了多少次了)。
      【解决方案4】:

      在 IE 和服务器之间放置 Fiddler。然后检查对您的请求的响应是否带有 HTTP 标头 Cache-Control。除了 no-cache 之外,还有其他一些值吗?如果是这样,那么 IE 可能会将此标头优先于您的 http-equiv 指令。

      如果没有,你应该尝试让服务器发送 HTTP 头 Cache-Control:no-cache。如果 IE 不尊重这一点,那就是 IE 中的一个错误。经验表明,选择不同的解决方案比要求修复错误更容易,所以在这种情况下,我同意 Greg 的建议。

      【讨论】:

        【解决方案5】:

        首先我尝试使用以下代码。

        meta http-equiv="Cache-Control" content="no-cache" 
        meta http-equiv="Pragma" content="no-cache" 
        meta http-equiv="Expires" content="-1" 
        

        但之后没有给出任何解决方案,我尝试使用带有时间戳变量的查询字符串, 喜欢

        vat time = new Date().getTime();
        
        url?queryString&time=time
        

        然后就可以了....

        谢谢...

        【讨论】:

          【解决方案6】:

          您忘记了重新处理页面的标签。

          <base target="_top" />
          

          如果你把下面的标签,缓存将被清除:

          <meta http-equiv="Expires" content="0" />
          <meta http-equiv="Cache-Control" content="no-cache, must-revalidate" />
          <meta http-equiv="Pragma" content="no-cache" />
          <base target="_top" />
          

          【讨论】:

            【解决方案7】:

            IE 的一个奇怪的怪癖是在文件的开头设置 no-cache 似乎不起作用,但是将那个部分移到原始 HTML 之后通常可以。仍然最好将其作为 HTTP 标头发送,但以下在大多数情况下都可以使用:

            <html>
               <head><title>Blah</title></head>
               <body>Contents</body>
            </html>
            <html>
               <head>
                  <meta http-equiv="Cache-Control" content="no-cache" />
                  <meta http-equiv="Pragma" content="no-cache" />
                  <meta http-equiv="Expires" content="-1" />
               </head>
            </html>
            

            【讨论】:

              【解决方案8】:

              答案 Response.Cache.SetCacheability(HttpCacheability.NoCache);是唯一能与 IE9 一起正常工作的。如果您在查询字符串中设置了时间戳,您仍然需要刷新页面以获取不同的 URL。因此,除非您使用 Response.Cache.SetCacheability(HttpCacheability.NoCache); 在 URL 和 Response.Cache.SetCacheability(HttpCacheability.NoCache) 上使用时间戳;最好,覆盖所有的基础。毕竟我们要处理的是 IE。

              【讨论】:

                【解决方案9】:

                您也可以在被调用的 aspx 页面顶部尝试以下语句:

                <%@ OutputCache Location="None" %>
                

                【讨论】:

                  猜你喜欢
                  • 2013-11-05
                  • 1970-01-01
                  • 2019-10-17
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-09-09
                  • 2011-10-28
                  相关资源
                  最近更新 更多