$ .getJSON renvoyant des données en cache dans IE8
-
06-07-2019 - |
Question
Je joue avec ASP.net MVC et JQuery pour le moment. J'ai rencontré un comportement qui ne semble pas avoir de sens.
J'appelle la fonction $. getJSON
de JQuery pour renseigner certaines div. L'événement est déclenché sur l'événement $ (document) .ready
. Cela fonctionne parfaitement.
Il existe un petit AJAX.BeginForm
qui ajoute une autre valeur à utiliser lors du remplissage des div. Il appelle la fonction distante correctement et, en cas de succès, appelle la fonction javascript d'origine pour repeupler les divs.
Voici la partie étrange: Dans FireFox et Chrome - Tout fonctionne. MAIS Dans IE8 (version bêta), ce deuxième appel au script Populate Div (qui appelle la fonction $ .getJSON) obtient les données mises en cache et ne demande pas au serveur!
J'espère que cette question a du sens: bref, pourquoi $. getJSON
récupère-t-il les données mises en cache? Et pourquoi n'affecte-t-il que IE8?
La solution
Pour votre information, Firefox et Chrome considèrent toutes les demandes Ajax comme non cachables. IE (toutes les versions) traite l’appel Ajax comme une autre requête Web. C'est pourquoi vous voyez ce comportement.
Comment forcer IE à télécharger des données à chaque demande:
- Comme vous l'avez dit, utilisez l'option 'cache' ou 'nocache' dans JQuery
- Ajouter un paramètre aléatoire à la demande (moche, mais fonctionne:))
- Sur le serveur, définissez la cachabilité (par exemple, à l'aide d'un attribut, voir ci-dessous)
Code:
public class NoCacheAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext context)
{
context.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
}
}
Autres conseils
Voici comment cela a fonctionné pour moi ...
$.ajaxSetup({ cache: false });
$.getJSON("/MyQueryUrl",function(data,item) {
// do stuff with callback data
$.ajaxSetup({ cache: true });
});
Merci Kent pour votre réponse. Using $ .ajax ('{cache: no}'); a fonctionné parfaitement. [edit]
Ou du moins je pensais l'avoir fait. Il semble que jquery $ .getJSON ne lit aucune modification apportée à l’objet $ .ajax.
La solution qui a fini par fonctionner consistait à ajouter manuellement un nouveau paramètre
var noCache = Date();
$.getJSON("/somepage/someaction", { "noCache": noCache }, Callback);
la résolution de la date est seulement à la minute; ce qui signifie effectivement que cette solution est encore en cache jusqu'à une minute. Ceci est acceptable pour mes besoins.
J'ai résolu le même problème en plaçant l'attribut suivant sur l'action dans le contrôleur:
[OutputCache(Duration = 0, VaryByParam = "None")]
Si vous utilisez ASP.net MVC, envisagez d'ajouter une méthode d'extension pour implémenter facilement aucune mise en cache, comme suit:
public static void NoCache(this HttpResponse Response)
{
Response.Cache.SetNoStore();
Response.Cache.SetExpires(DateTime.MinValue);
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetValidUntilExpires(false);
Response.Expires = -1;
Response.ExpiresAbsolute = DateTime.MinValue;
Response.AddHeader("Cache-Control", "no-cache");
Response.AddHeader("Pragma", "no-cache");
}
Vous devrez peut-être envoyer un cache-cache.
Je recommanderais d'utiliser $ .ajax ({cache: no}) au cas où (ajoute un suffixe aléatoire à la requête get)
(J'ai tendance à utiliser $ .ajax partout ces jours-ci, plus ajustable)
Prêt pour LA réponse?
http://lestopher.tumblr.com/ post / 21742012438 / if-youre-using-ie8-and-getjson
Ajoutez donc simplement
jQuery.support.cors = true;
au début de votre script et BANG cela fonctionne!