Domanda

Ho uno strumento che funziona perfettamente in Chrome e FF. Ma con qualsiasi versioni di IE il browser visualizza le informazioni sulla cache su un tiro AJAX per recuperare i dati.

Ecco la mia configurazione:

Ho criteri che tiro in giro:

@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 è solo un aiutante che crea ActionLink con un'immagine all'interno, ho provato a farlo con un normale ActionLink e si verifica anche il problema in modo da poterlo ignorare. Ho anche provato a cambiare l'intero ImageActionLink da una pianura <img> con un grilletto jQuery senza differenza.

Quello che succede è che quando un utente fa clic sul collegamento di modifica, farà una chiamata AJAX a "ADDREDITCRITRITRIO", che ActionResult, trova i criteri e visualizza il modulo PartialView nel Div "#AdDoREDITCRITRITRITERFORMCONTAINER". Fin qui tutto bene, funziona bene in tutti i browser.

Ma quando faccio clic su una seconda volta su quella modifica, invece di fare la chiamata Ajax, cioè visualizza semplicemente il parziale da ciò che aveva nella cache, quando tutti gli altri browser estraggono correttamente i dati (che è richiesto, poiché quella vista consente di Modifica i criteri, avrebbe potuto essere modificato da qualcun altro nel frattempo).

La parte strana è che IE sta effettuando la chiamata, ma in qualche modo non raggiunge mai il server, utilizza solo la cache usando un risultato 304. Puoi vedere da questa cattura di rete:

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

L'ultimo è il primo ad accadere, i primi due sono stati fatti dopo e stanno ottenendo un ritorno di 304.

Ho trovato un modo per risolverlo aggiungendo un parametro "Breakcache" alla chiamata Ajax con un numero casuale, ma semplicemente non sembra una buona soluzione.

Questo problema ha fregato i nostri utenti perché vedono dati che non dovrebbero essere aggiornati tutti a causa di IE.

È stato utile?

Soluzione

Cioè cache ajax GETS a meno che tu non lo dica di non farlo.

Lo dici di non tramite il Cache-Control intestazione.

Quindi ecco cosa facciamo:

[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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top