$ .GetJSON retornar dados em cache no IE8
-
06-07-2019 - |
Pergunta
Eu estou brincando com ASP.net MVC e JQuery no momento. Eu me deparei com behavour que não parece fazer sentido.
Eu estou chamando a função $.getJSON
do JQuery para preencher alguns de div. O evento é disparado no evento $(document).ready
. Isso funciona perfeitamente.
Há uma pequena AJAX.BeginForm
que acrescenta um outro valor para ser usado ao preencher os divs. Ele chama a função remota corretamente e no sucesso chama a função javascript original para repovoar os divs.
Aqui está a parte estranha: no Firefox e Chrome - Tudo funciona. Mas, em IE8 (Beta) esta segunda chamada para o script Div populate (que chama a função .getJSON $) fica armazenada em cache de dados e não pedir ao servidor!
Hope esta pergunta faz sentido: Em uma casca de noz - Por que é $.getJSON
recebendo dados em cache? E por que é que só efetuar IE8?
Solução
Apenas para que você saiba, Firefox e Chrome considerar todas pedido Ajax como não cachable. IE (todas as versões) deleite Ajax chamada, assim como outro pedido web. É por isso que você vê esse comportamento.
Como forçar o IE para download de dados em cada pedido:
- Como você disse, o uso 'cache' ou a opção 'nocache' em JQuery
- Adicionar um parâmetro aleatório para o pedido (feio, mas funciona:))
- No lado do servidor, conjunto cachability (por exemplo, usando um atributo, veja abaixo)
Código:
public class NoCacheAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext context)
{
context.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
}
}
Outras dicas
Esta é a forma como ele trabalhou para mim ...
$.ajaxSetup({ cache: false });
$.getJSON("/MyQueryUrl",function(data,item) {
// do stuff with callback data
$.ajaxSetup({ cache: true });
});
Graças Kent pela sua resposta. Usando $ .ajax ( '{cache: no}'); funcionou perfeitamente. [Editar]
Ou pelo menos eu pensei que eu fiz. Parece que o jquery $ .getJSON não está lendo as alterações feitas ao objeto $ .ajax.
A solução que acabou de trabalho foi adicionar um novo parâmetro manualmente
var noCache = Date();
$.getJSON("/somepage/someaction", { "noCache": noCache }, Callback);
a resolução da data é apenas ao minuto; que efectivamente significa esta solução ainda guarda para até um minuto. Isto é aceitável para os meus propósitos.
Eu resolvi esse mesmo problema, colocando o seguinte atributo na ação no controller:
[OutputCache(Duration = 0, VaryByParam = "None")]
Se você estiver usando ASP.net MVC, considere a adição de um método de extensão para facilmente implementar nenhum cache assim:
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");
}
Você pode precisar enviar um cache-breaker.
Eu recomendaria usando $ .ajax ({cache: no}) apenas no caso (acrescenta um sufixo aleatória ao pedido get)
(I tendem a usar $ .ajax em toda parte estes dias, mais sintonizável)
pronto para a resposta?
http://lestopher.tumblr.com/ post / 21742012438 / if-youre usando-IE8-and-getJSON
Assim, basta adicionar
jQuery.support.cors = true;
no início do seu script e BANG funciona!