5

Tengo una herramienta que funciona perfectamente bien en Chrome y FF. Pero con cualquier versión de IE, el navegador muestra información de caché al hacer una extracción de Ajax para recuperar los datos.Internet Explorer muestra datos de caché sobre Ajax Pull con 304 Resultado

Aquí está mi configuración:

tengo criterios que recorrer:

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

El ImageActionLink es sólo un ayudante que crea un ActionLink con una imagen en el interior, lo he intentado hacer esto con una el ActionLink normal y el problema también ocurren, así que puedes ignorar eso. También traté de cambiar toda ImageActionLink por un simple <img> con un activador jQuery sin diferencias.

Lo que sucede es que cuando un usuario hace clic en el enlace Editar hará una llamada ajax a "AddOrEditCriteria", ActionResult, encuentra los criterios y muestra el formulario PartialView en el div "#AddOrEditCriteriaFormContainer". Hasta aquí todo bien, esto funciona bien en todos los navegadores.

Pero cuando hago clic por segunda vez en esa edición, en lugar de hacer la llamada ajax, IE simplemente muestra el PartialView de lo que tenía en el caché, cuando todos los demás navegadores recuperan los datos correctamente (lo cual es necesario, esa vista permite editar los criterios, podría haber sido editada por otra persona mientras tanto).

La parte extraña es que IE está haciendo la llamada, pero de alguna manera nunca llega al servidor, sólo se utiliza la caché mediante el uso de un Resultado 304. Se puede ver en esta captura de red:

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 

La última uno es el primero en suceder, los dos primeros se hicieron después y están obteniendo un retorno de 304.

Encontré una manera de solucionarlo agregando un parámetro "breakcache" a la llamada ajax con un número aleatorio, pero eso simplemente no parece una buena solución.

Este problema ha estado atormentando a nuestros usuarios porque ven datos que no se deben actualizar debido a IE.

Respuesta

11

IE guardará en caché AJAX GET s a menos que le diga que no lo haga.

Usted dice que no a través del Cache-Controlheader.

Así que aquí es lo que hacemos:

[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

Gracias! Eso funcionó, también descubrí que usar jquery.ajax en lugar del helper y usar 'cache: false' resuelve el problema. Pero el tuyo me permitirá no tener que editar todas mis vistas para usar jquery. Por otro lado, esperaría que el ayudante tenga una opción de caché como lo hace jquery.ajax:/ ¡Gracias de nuevo! – LanFeusT

+1

como otra alternativa, me gusta controlar a nivel del controlador: http://stackoverflow.com/questions/1160105/asp-net-mvc-disable-browser-cache/5546328#5546328 –

+1

@AdamTuliper Puede apuntar a los controladores con este atributo , también. –

Cuestiones relacionadas