304結果のAjax Pull上にキャッシュデータを表示するインターネットエクスプローラー
-
28-10-2019 - |
質問
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でこれを試してみました。問題も発生しているため、それを無視できます。また、平野でimageactionlink全体を変更しようとしました <img>
違いのないjQueryトリガーで。
起こることは、ユーザーが編集リンクをクリックすると、「addoreditcriteria」にajax呼び出しを行い、そのactions result、基準を見つけ、partialViewフォームをdiv "#addeditcriteriaformcontainer"に表示することです。これまでのところ、これはすべてのブラウザで正常に機能します。
しかし、その編集で2回目のクリックをクリックすると、AJAXコールを実行する代わりに、つまり、キャッシュにあるものからPartialViewを表示するだけで、他のすべてのブラウザが再びデータを正しくプルした場合(そのビューが許可されているため、必要です。基準を編集すると、その間に他の誰かによって編集された可能性があります)。
奇妙な部分は、IEが呼び出しを行っているが、どういうわけかサーバーに到達することはないということです。結果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
最後の1つは最初に起こり、最初の2つは後に完了し、304リターンを取得しています。
乱数でAJAXコールに「BreakCache」パラメーターを追加することで修正する方法を見つけましたが、それは良い解決策のようには見えません。
この問題は、IEのためにすべて更新されるべきではないデータが表示されるため、ユーザーをねじ込んでいます。
解決
IEはajaxをキャッシュします GET
あなたがそれを言わない限り。
あなたはそれを介してそれを言います 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);
}
}