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でこれを実行しようとしましたが、問題が発生するため、無視してかまいません。また、ImageActionLink全体<img>をjQueryトリガーを使用したプレーンで変更しようとしましたが、違いはありません。

ユーザーが[編集]リンクをクリックすると、「AddOrEditCriteria」へのajax呼び出しが行われ、そのActionResultが条件を見つけて、PartialViewフォームをdiv「#AddOrEditCriteriaFormContainer」に表示します。これまでのところ、これはすべてのブラウザで正常に機能します。

しかし、その編集を2回クリックすると、ajax呼び出しを行う代わりに、IEは、他のすべてのブラウザーがデータを正しくプルするときに、キャッシュにあったものから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が原因ですべて更新されるべきではないデータが表示されるため、この問題はユーザーを悩ませてきました。

4

1 に答える 1

11

IEは、指定GETしない限りAJAXをキャッシュします。

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);
    }
}
于 2012-01-13T18:35:34.823 に答える