【问题标题】:MVC3 - AJAX Partial View is being cached...and I can't stop itMVC3 - AJAX 部分视图正在被缓存......我无法阻止它
【发布时间】:2011-06-25 03:22:28
【问题描述】:

我正在使用 MVC3 - 我有一个使用 jQuery get() 从控制器获取 PartialView 的 javascript 函数。

问题是它被缓存了,我不断地找回过时的内容。

我在动作上尝试了 [OutputCache(Duration=0)],认为它会阻止它缓存,但没有乐趣。会不会是客户端也在缓存它?

编辑:

我最近一直在使用另一种方法来防止缓存,这可能对某些人有用。

$.get("/someurl?_="+$.now(),function(data) {  
     // process data
});

它显然不是那么干净,但是因为每个请求都传递了一个_=12345678(时间戳),所以它永远不会被缓存。

希望对你有帮助。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    GET 请求可以被浏览器自动缓存,因此您可以使用 .ajax() 函数,与 .get() 函数相反,您可以禁用缓存:

    $.ajax({
        url: '/foo',
        type: 'GET',
        cache: 'false',
        success: function(result) {
    
        }
    });
    

    另一种可能是使用 POST:

    $.post('/foo', function(result) {
    
    });
    

    【讨论】:

      【解决方案2】:

      IE 在这方面特别糟糕。您可以使用以下方法禁用所有 AJAX 缓存:

      $.ajaxSetup({
          cache: false
      });
      

      【讨论】:

      • 这比 Darin 的方法更好,因为它让你仍然可以使用 MVC 的 Ajax.foo 辅助方法
      • 这将为所有可能不是所需行为的 AJAX GET 请求全局禁用大小写。
      【解决方案3】:

      默认情况下,似乎所有 MVC 3 部分视图都会自动缓存,但您可以从控制器中控制每个部分视图,这些部分视图在操作前带有属性(或在 Java 中调用的注释)返回:

      [OutputCache(Duration = 0)]
      public ActionResult PersonEdit(string id)
      {
        // do query and fill editvm here
        return PartialView("PersonEdit",editvm);
      }
      

      因此,持续时间设置为零。可能还有许多其他属性可以设置为关闭缓存,但到目前为止,这似乎对我个人有用。

      【讨论】:

      • [OutputCache(Duration = 0)] 抛出错误:“Duration must be a positive number” [OutputCache(NoStore=true)] 代替。
      • Duration = 0 在我做 MVC3 时工作正常,也许以后的更新添加了这个错误?如果 NoStore=true 也可以工作,那还是很好的,那么一定要使用它! :)
      • 可能是,但我也收到了子操作的错误,我了解到子操作的处理方式略有不同,这很烦人。
      【解决方案4】:

      感谢你们两个,即使指定了 cache:'false',第一个仍然使用 type="GET" 缓存。那是使用 chrome 和本地 IIS7。

      我最终得到了

      $.ajax({
                  url: '@Url.Action("GetMyPartialView","MyController")/' + parameterId,
                  type: 'POST',
                  cache: 'false',
                  success: function (result) {
                      $('#dynamicContentDiv').html(result);
                  }
       });
      

      工作正常,感谢您的回复。

      【讨论】:

      • 这是唯一对我有用的 IE。使用 cache: false 无效,使用 OutputStore 属性无效,其他问题的其他答案无效。将“?randomIdAddedToStopCaching=@Guid.NewGuid().ToString()”添加到 URL 的末尾是唯一有效的方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多