1

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

我尝试将 outputcache 设置为 0 但没有成功,并且我还尝试了 nocache actionfilter,如此处所述禁用整个 ASP.NET 网站的浏览器缓存,但没有成功。我可以阻止 IE 从缓存中提取的唯一方法是物理删除缓存的版本。

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

4

2 回答 2

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);
    }
}
于 2010-01-08T13:06:26.100 回答
0

我对克雷格的伟大解决方案的 2 美分 -

如果您正在使用用户控件并使用“RenderAction”进行渲染

<% Html.RenderAction("UserList", "User"); %>

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

[CacheControl(HttpCacheability.NoCache)]

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

于 2011-12-19T15:27:00.887 回答