Frage

Ich habe ein Werkzeug, das in Chrome und FF vollkommen gut funktioniert. Bei allen Versionen des IE wird der Browser jedoch Cache -Informationen über einen Ajax -Zug angestellt, um die Daten abzurufen.

Hier ist mein Setup:

Ich habe Kriterien, die ich durchschleifen habe:

@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>
}

Der ImageActionLink ist nur ein Helfer, der einen ActionLink mit einem Bild im Inneren erstellt. Ich habe auch versucht, den gesamten ImaginactionLink durch eine Ebene zu ändern <img> mit einem JQuery -Trigger ohne Unterschied.

Wenn ein Benutzer auf den Link Bearbeiten klickt, wird ein AJAX -Anruf bei "AddoredItCriteria" erledigt, das ActionResult die Kriterien findet und das PartialView -Formular wieder in das DIV "#AdDoreditCriteriaformContainer" anzeigt. So weit so gut, dass dies in allen Browsern gut funktioniert.

Wenn ich jedoch auf ein zweites Mal auf diese Bearbeitung klicke, anstatt den Ajax -Anruf durchzuführen, zeigt der IE einfach die Teilansicht aus dem an, was sie im Cache hatte, wenn alle anderen Browser die Daten wieder korrekt abziehen (was erforderlich ist, wie diese Ansicht zulässt Bearbeiten Sie die Kriterien, es hätte in der Zwischenzeit von jemand anderem bearbeitet werden können.

Der seltsame Teil ist, dass der IE den Anruf tätigt, aber irgendwie nie den Server erreicht. Er verwendet den Cache nur mit einem Ergebnis 304. Sie können aus dieser Netzwerkaufnahme sehen:

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

Der letzte ist der erste, der passiert ist, die ersten beiden wurden nach der Nachfolgerin und erzielen eine 304 -Rendite.

Ich habe einen Weg gefunden, es zu beheben, indem ich dem AJAX -Aufruf mit einer zufälligen Zahl einen "Breakcache" -Parameter hinzufügte, aber das scheint einfach keine gute Lösung zu sein.

Dieses Problem hat unsere Benutzer verarscht, da sie angezeigt werden, dass Daten aufgrund des IE nicht alle aktualisiert werden.

War es hilfreich?

Lösung

Dh wird ajax zwischenspeichern GETs, es sei denn, Sie sagen es nicht.

Sie sagen es nicht über die Cache-Control Header.

Also hier ist, was wir tun:

[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);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top