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?

Était-ce utile?

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!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top