5

Possiedo uno strumento perfettamente funzionante in Chrome e FF. Ma con qualsiasi versione di IE il browser sta visualizzando le informazioni sulla cache facendo un tiro Ajax per recuperare i dati.Internet Explorer che mostra i dati della cache su Ajax Pull con 304 Risultato

Ecco la mia messa a punto:

Ho criteri che ho un ciclo tra:

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

L'ImageActionLink è solo un aiutante che crea un ActionLink con un'immagine dentro, ho provato a fare questo con un normale ActionLink e il problema si verifica in modo da poterlo ignorare. Ho anche provato a cambiare l'intero ImageActionLink con un semplice <img> con un trigger jQuery senza alcuna differenza.

Quello che succede è che quando un utente fa clic sul link Modifica che farà una chiamata AJAX al "AddOrEditCriteria", che ActionResult, trova i criteri, e visualizza la forma PartialView di nuovo nel div "#AddOrEditCriteriaFormContainer". Fin qui tutto bene, funziona perfettamente con tutti i browser.

Ma quando faccio clic una seconda volta su quella modifica, invece di fare la chiamata ajax, IE mostra semplicemente il PartialView da quello che aveva nella cache, quando tutti gli altri browser tirano di nuovo correttamente i dati (che è richiesto, come quella vista permette di modificare i criteri, potrebbe essere stato modificato da qualcun altro nel frattempo).

La parte strana è che IE sta facendo la chiamata, ma in qualche modo non raggiunge mai il server, utilizza solo la cache utilizzando un Risultato 304. Si può 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'ultima uno è il primo ad accadere, i primi due sono stati fatti dopo e stanno ottenendo un ritorno 304.

Ho trovato un modo per risolverlo aggiungendo un parametro "breakcache" alla chiamata ajax con un numero casuale, ma questa non sembra una buona soluzione.

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

risposta

11

IE memorizzerà nella cache AJAX GET a meno che tu non lo dica.

Si dice di non tramite il Cache-Controlheader.

Così qui è quello che 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); 
    } 
} 
+2

Grazie! Ha funzionato, ho anche scoperto che usare jquery.ajax invece dell'helper e usare 'cache: false' risolve il problema. Ma il tuo mi permetterà di non dover modificare tutte le mie viste per usare jquery. Dall'altro lato mi aspetto che l'helper abbia un'opzione di cache come fa jquery.ajax:/ Grazie ancora! – LanFeusT

+1

come altra alternativa, mi piace il controllo a livello di controller: http://stackoverflow.com/questions/1160105/asp-net-mvc-disable-browser-cache/5546328#5546328 –

+1

@AdamTuliper È possibile utilizzare i controller di destinazione con questo attributo , pure. –