5

我有一个在 Chrome 和 FF 中运行良好的工具。但是对于任何版本的 IE,浏览器都会显示缓存信息,而不是通过 Ajax 拉取来检索数据。

这是我的设置:

我有我循环的标准:

@foreach (var item in Model)
{
        <div class="sizeTDCriteria">
            @Html.DisplayFor(modelItem => item.Text)
        </div>
        <div class="sizeTDCriteriaAction">
            @Ajax.ImageActionLink(Url.Content("~/Content/images/icons/edit.png"), "Edit Criteria", "AddOrEditCriteria", "Management", new { competencySectionId = ViewBag.competencySectionId, criteriaId = item.Id }, new AjaxOptions { UpdateTargetId = "AddOrEditCriteriaFormContainer" }, new { @class = "iconPosition" })
            @Ajax.ImageActionLink(Url.Content("~/Content/images/icons/delete.png"), "Delete Criteria", "RemoveCriteria", "Management", new { criteriaId = item.Id }, new AjaxOptions { UpdateTargetId = "CompetenciesManagementWrapper" }, new { @class = "iconPosition" })
        </div>
}

ImageActionLink 只是一个帮助器,它创建一个内部带有图像的 ActionLink,我尝试使用普通的 ActionLink 执行此操作,并且问题也发生了,因此您可以忽略它。我还尝试通过一个普通<img>的 jQuery 触发器来更改整个 ImageActionLink,没有区别。

发生的情况是,当用户单击“编辑”链接时,它将对“AddOrEditCriteria”进行 ajax 调用,该 ActionResult 找到条件,并将 PartialView 表单显示回 div“#AddOrEditCriteriaFormContainer”。到目前为止一切顺利,这在所有浏览器中都可以正常工作。

但是,当我第二次单击该编辑时,IE 不执行 ajax 调用,而是简单地显示缓存中的 PartialView,当所有其他浏览器再次正确提取数据时(这是必需的,因为该视图允许编辑标准,同时它可能已被其他人编辑)。

奇怪的是 IE 正在调用,但不知何故它永远不会到达服务器,它只是通过使用 Result 304 来使用缓存。你可以从这个网络捕获中看到:

URL Method  Result  Type    Received    Taken   Initiator   Wait??  Start?? Request??   Response??  Cache read??    Gap??
/PerformanceMVC/Management/AddOrEditCriteria?competencySectionId=178&criteriaId=369&X-Requested-With=XMLHttpRequest GET 304 text/html   182 B   < 1 ms  JS Library XMLHttpRequest
/PerformanceMVC/Management/AddOrEditCriteria?competencySectionId=178&criteriaId=369&X-Requested-With=XMLHttpRequest GET 304 text/html   182 B   < 1 ms  JS Library XMLHttpRequest
/PerformanceMVC/Management/AddOrEditCriteria?competencySectionId=178&criteriaId=369&X-Requested-With=XMLHttpRequest GET 200 text/html   1.53 KB 1.24 s  JS Library XMLHttpRequest

最后一个是第一个发生的,前两个是在之后完成的,并且得到了 304 回报。

我找到了一种方法来修复它,方法是向带有随机数的 ajax 调用添加“breakcache”参数,但这似乎不是一个好的解决方案。

这个问题一直困扰着我们的用户,因为他们看到了不应该因为 IE 而更新的数据。

4

1 回答 1

11

IE 将缓存 AJAX GET,除非您告诉它不要这样做。

你告诉它不要通过Cache-Control header

所以这就是我们要做的:

[CacheControl(HttpCacheability.NoCache), HttpGet]
public ActionResult MyAction() { return Json("Hi!", JsonRequestBehavior.AllowGet); }

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public sealed class CacheControlAttribute : ActionFilterAttribute
{
    public CacheControlAttribute(HttpCacheability cacheability)
    {
        this._cacheability = cacheability;
    }

    public HttpCacheability Cacheability { get { return this._cacheability; } } 

    private HttpCacheability _cacheability;

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
        cache.SetCacheability(_cacheability);
    }
}
于 2012-01-13T18:35:34.823 回答