Pregunta

Tengo una herramienta que funciona perfectamente bien en Chrome y FF. Pero con cualquier version de IE, el navegador muestra información de caché sobre hacer una extracción de AJAX para recuperar los datos.

Aquí está mi configuración:

Tengo criterios que atravieso:

@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 solo un ayudante que crea un enlace de acción con una imagen en el interior, he intentado hacerlo con un Link Action Normal y el problema también ocurre para que pueda ignorarlo. También he tratado de cambiar toda la imagen de imagen por una llanura <img> con un gatillo jQuery sin diferencia.

Lo que sucede es que cuando un usuario hace clic en el enlace de edición, hará una llamada AJAX a los "AddoreditCriteria", que ActionResult, encuentra los criterios y muestra el formulario ParcialView en el Div "#AddoreditCriteriaFormContainer". Hasta ahora 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, es decir, simplemente muestra la vista parcial de lo que tenía en el caché, cuando todos los demás navegadores extraen correctamente los datos (lo que se requiere, ya que esa vista permite editar los criterios, podría haber sido editado por otra persona mientras tanto).

La parte extraña es que IE está haciendo la llamada, pero de alguna manera nunca llega al servidor, solo usa el caché usando un resultado 304. Puede ver desde 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

El último es el primero en suceder, los dos primeros se realizaron después y obtienen un regreso de 304.

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

Este problema ha estado atornillando a nuestros usuarios porque ven datos que no deberían actualizarse todo debido a IE.

¿Fue útil?

Solución

Es decir, caché Ajax GETS a menos que lo digas no lo hagas.

Le dices no a través del Cache-Control encabezamiento.

Así que esto 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);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top