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?

Foi útil?

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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top