Question

J'ai un outil qui fonctionne parfaitement bien dans Chrome et FF. Mais avec toutes les versions d'Internet Explorer le navigateur affiche les informations du cache sur faire une traction Ajax pour récupérer les données.

Voici ma configuration:

Je critères que la boucle I par:

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

Le ImageActionLink est juste une aide qui crée un ActionLink avec l'intérieur de l'image, je l'ai essayé de faire cela avec un ActionLink normal et le problème se produit si bien que vous pouvez ignorer. J'ai aussi essayé de changer l'ensemble ImageActionLink par un <img> simple avec un déclencheur jQuery sans différence.

Qu'est-ce qui se passe est que lorsqu'un utilisateur clique sur le lien Modifier il fera un appel ajax aux « AddOrEditCriteria », que ActionResult, trouve les critères et affiche la forme PartialView de nouveau dans la div « #AddOrEditCriteriaFormContainer ». Jusqu'à présent, si bon, cela fonctionne très bien dans tous les navigateurs.

Mais quand je clique une deuxième fois sur cette édition, au lieu de faire l'appel ajax, IE affiche simplement l'PartialView de ce qu'elle avait dans le cache, lorsque tous les autres navigateurs tirent correctement les données à nouveau (ce qui est nécessaire, celle vue permet de modifier les critères, il aurait pu être modifiée par quelqu'un d'autre dans le même temps).

La partie étrange est que IE fait l'appel, mais en quelque sorte, il n'a jamais atteint le serveur, il utilise juste le cache en utilisant un résultat 304. Vous pouvez voir cette capture réseau:

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

Le dernier est le premier à arriver, les deux premières ont été faites après et obtiennent un retour 304.

J'ai trouvé un moyen de le corriger en ajoutant un paramètre « breakcache » à l'appel ajax avec un nombre aléatoire, mais cela ne semble pas être une bonne solution.

Ce problème a été visse nos utilisateurs, car ils voient des données qui devraient est pas mis à jour à cause de IE.

Était-ce utile?

La solution

IE cache AJAX GETs à moins que vous lui dites pas.

Vous dites qu'il ne via le Cache-Control tête .

Alors, voici ce que nous faisons:

[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);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top