Internet Explorer通过Ajax Pull显示缓存数据,结果为304
本文关键字:数据 结果 缓存 显示 Explorer 通过 Ajax Pull Internet | 更新日期: 2023-09-27 18:20:10
我有一个在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,没有任何区别。
结果是,当用户单击Edit链接时,它将对ActionResult的"AddOrEditCriteria"进行ajax调用,找到标准,并将PartialView表单显示回div"#AddOrEditCriteriaFormContainer"中。到目前为止还不错,这在所有浏览器中都能正常工作。
但是,当我第二次点击该编辑时,IE并没有调用ajax,而是简单地显示缓存中的PartialView,当所有其他浏览器再次正确提取数据时(这是必需的,因为该视图允许编辑标准,它可能同时被其他人编辑)。
奇怪的是,IE正在进行调用,但不知何故,它从未到达服务器,它只是通过使用Result304来使用缓存。你可以从这个网络捕获中看到:
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而更新。
IE将缓存AJAX GET
s,除非你告诉它不要缓存。
您告诉它不要通过Cache-Control
标头。
所以我们要做的是:
[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);
}
}