MVC 3和ajax调用 - 无法阻止它的缓存

时间:2011-12-13 11:34:11

标签: jquery ajax asp.net-mvc-3

我遇到了部分视图被缓存的问题,我不想这样做。我用谷歌搜索了这个,有几种方法可以解决这个问题,但这些方法似乎都不适用于我。

基本上我在服务器上有一个返回局部视图的动作。我首先在页面加载时从Html.RenderPartial调用它。然后所有其他调用都来自同一页面上的jQuery,当点击链接时,然后刷新部分视图所在的页面部分。每个按下的链接发送不同的数据,因此第一次点击每个链接它调用teh服务器,但每次后续点击都是从缓存副本中呈现的。

在我的_Layout页面(我的母版页)上,我在顶部有以下内容:

<script type="text/javascript">
        $.ajaxSetup({
            cache: false
        });
</script>

每个ajax调用都禁用缓存,如下所示:

$.ajax({
        url: UrlToGetEmployeeGrid,
        type: 'GET',
        cache: 'false',
        success: function (response) {
            $EmployeeGridObject.html(response);
        },
        error: function (xhr) {
            alert('There was an error contacting the server to refresh the employee grid');
        }
    });

呼叫永远不会到达服务器。但我也尝试在控制器操作中添加(以防万一)以下内容:

[HttpGet]
[OutputCache(Duration = 0)]

但这给了我一个错误:

System.InvalidOperationException: Duration must be a positive number.

我也尝试过:

[HttpGet]
[OutputCache(Duration = 0, VaryByParam="none")]

并得到了同样的错误。

我有什么想法可以停止从ajax调用到正确的操作吗?

更新:

根据Paulo的评论,这在Chrome中运行良好,但在IE中不起作用。我添加了一个随机数来解决这个问题。但是,从长远来看,我需要一个更好的解决方案,因为有些情况下我需要缓存一段时间的操作,IE需要能够做到。

3 个答案:

答案 0 :(得分:3)

我设置了NoStore属性并将VaryByParam更改为“*”。

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]

答案 1 :(得分:3)

您可以像这样创建自己的NoCacheAttribute:

public class NoCacheAttribute : FilterAttribute, IActionFilter
{
    #region IActionFilter Members
    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        return;
    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
        filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
        filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        filterContext.HttpContext.Response.Cache.SetNoStore();
    }
    #endregion
}

您可以将其应用于您的行动:

[HttpGet]
[NoCache]

应该解决你的问题(我现在使用这个解决方案很长时间了。)

答案 2 :(得分:1)

编辑:这是可行的

将Guid作为随机字符串附加肯定会绕过这个明显的IE错误(并且是真正随机的)。例如将r=Guid.NewGuid().ToString()附加到查询字符串或类似字符串。

在你的情况下(使用javascript)它有点复杂并且在javascript中生成UUID的复杂性是众所周知的,但可以这样做:

见这里:https://github.com/broofa/node-uuid然后可能在这里:https://gist.github.com/982883这个宝石:

function b(a){return a?(a^Math.random()*16>>a/4).toString(16):([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,b)}

底线:尝试使用此单行javascript函数生成随机字符串以附加到查询字符串以防止缓存:http://jsfiddle.net/Dommer/yQWht/