ASP.NET MVC 2 RC缓存问题

时间:2010-01-08 12:49:18

标签: asp.net-mvc internet-explorer browser-cache

自从mvc 2 beta 2升级到rc后,我在Internet Explorer中提交ajax时遇到问题。在执行jquery表单帖子时,该函数返回一个控制器动作的URL。这很好用控制器操作拾取它是一个ajaxrequest然后管道回部分视图来更新页面。这在Firefox中仍然可以正常工作,但是在Internet Explorer中,对控制器操作的最终调用现在来自缓存并且返回因此返回完整视图而不是部分视图。

我已经尝试将outputcache设置为0但没有成功,我也尝试了如此处所述的nocache actionfilter Disable browser cache for entire ASP.NET website,但没有运气。我可以阻止IE从缓存中提取的唯一方法是物理删除缓存版本。

任何人都有任何想法(道歉,如果这不是很清楚,很难解释!)?

2 个答案:

答案 0 :(得分:3)

出于某种原因,IE非常积极地缓存AJAX GET。所以如果你通过AJAX获取它,这种行为对我来说并不奇怪。同样不足为奇的是,使用输出缓存属性并没有解决问题,因为它是IE,而不是服务器,它正在进行缓存。您需要做的是通过在HTTP中设置适当的标头来告诉IE不要缓存请求。我们是这样做的:

    [CacheControl(HttpCacheability.NoCache), HttpGet]
    public JsonResult DoStuff()
    {
        //...
    }

public class CacheControlAttribute : ActionFilterAttribute
{
    public CacheControlAttribute(HttpCacheability cacheability)
    {
        this._cacheability = cacheability;
    }

    private HttpCacheability _cacheability;

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
        cache.SetCacheability(_cacheability);
    }
}

答案 1 :(得分:0)

我对克雷格的出色解决方案2美分 -

如果您正在使用用户控件并使用“RenderAction”

进行渲染
<% Html.RenderAction("UserList", "User"); %>

此页面通过GET和POST调用它,然后在属性声明中不提及请求方法。

[CacheControl(HttpCacheability.NoCache)]

例如,我有一个搜索网格和一个搜索面板。我已经使我的网格成为用户控件,以便我可以调用sort&amp;通过AJAX(GET)进行分页时,当我按下“搜索”按钮(POST)时也会调用它,所以我需要它。