[jquery] IE8에서 캐시 된 데이터를 반환하는 $ .getJSON

현재 ASP.net MVC 및 JQuery를 사용하고 있습니다. 말이되지 않는 행동을 발견했습니다.

$.getJSON일부 div를 채우기 위해 JQuery의 함수를 호출하고 있습니다. 이벤트는 이벤트에서 트리거됩니다 $(document).ready. 이것은 완벽하게 작동합니다.

AJAX.BeginFormdiv를 채울 때 사용할 다른 값을 추가 하는 작은 값이 있습니다. 원격 함수를 올바르게 호출하고 성공하면 원래 javascript 함수를 호출하여 div를 다시 채 웁니다.

이상한 부분은 다음과 같습니다. FireFox 및 Chrome에서-모든 것이 작동합니다. 하지만 IE8 (베타)에서는 ($ .getJSON 함수를 호출하는) 채우기 Div 스크립트에 대한이 두 번째 호출이 캐시 된 데이터를 가져오고 서버에 묻지 않습니다!

이 질문이 이해되기를 바랍니다. 간단히 말해서- $.getJSON캐시 된 데이터를 가져 오는 이유는 무엇 입니까? 그리고 IE8에만 영향을 미치는 이유는 무엇입니까?



답변

알려 드리기 위해 Firefox와 Chrome은 모든 Ajax 요청을 케이블이 아닌 것으로 간주합니다. IE (모든 버전)는 Ajax 호출을 다른 웹 요청처럼 처리합니다. 이것이 바로이 동작을 보는 이유입니다.
IE가 각 요청에서 데이터를 다운로드하도록하는 방법 :

  • 말했듯이 JQuery에서 ‘cache’또는 ‘nocache’옵션을 사용하십시오.
  • 요청에 임의의 매개 변수를 추가하십시오 (추악하지만 작동합니다 :))
  • 서버 측에서 캐서 빌리티를 설정합니다 (예 : 속성 사용, 아래 참조).

암호:

public class NoCacheAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        context.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    }
}


답변

이것이 나를 위해 일한 방법입니다 …

$.ajaxSetup({ cache: false });
$.getJSON("/MyQueryUrl",function(data,item) {
     // do stuff with callback data
     $.ajaxSetup({ cache: true });
   });


답변

답변 해 주셔서 감사합니다. $ .ajax ( ‘{cache : no}’); 사용 완벽하게 작동했습니다. [편집하다]

아니면 적어도 내가 그렇게 생각했다. jquery $ .getJSON이 $ .ajax 객체에 대한 변경 사항을 읽지 않는 것 같습니다.

결국 작동하게 된 솔루션은 새 매개 변수를 수동으로 추가하는 것이 었습니다.

var noCache = Date();
$.getJSON("/somepage/someaction", { "noCache": noCache }, Callback);

날짜 해상도는 분 단위입니다. 이는이 솔루션이 최대 1 분 동안 여전히 캐시된다는 것을 의미합니다. 이것은 내 목적에 적합합니다.


답변

Controller의 Action에 다음 속성을 배치하여 동일한 문제를 해결했습니다.

[OutputCache(Duration = 0, VaryByParam = "None")]


답변

ASP.net MVC를 사용하는 경우 다음과 같이 캐싱을 쉽게 구현하지 않도록 확장 메서드를 추가하는 것이 좋습니다.

    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");
    }


답변

캐시 브레이커를 보내야 할 수도 있습니다.

경우에 대비해 $ .ajax ({cache : no}) 사용하는 것이 좋습니다 (get 요청에 임의의 접미사 추가).

(저는 요즘 어디서나 $ .ajax를 사용하는 경향이 있습니다.


답변

대답 할 준비가 되셨습니까?

http://lestopher.tumblr.com/post/21742012438/if-youre-using-ie8-and-getjson

그래서, 그냥 추가하십시오

jQuery.support.cors = true;  

스크립트의 시작 부분에 BANG이 작동합니다!