$ .getJson IE8에서 캐시 된 데이터를 반환합니다
-
06-07-2019 - |
문제
나는 현재 ASP.NET MVC와 JQuery와 함께 놀고 있습니다. 나는 말이되지 않는 행동을 만났다.
나는 jQuery를 부르고있다 $.getJSON
일부 div를 채우는 기능. 이벤트는 다음에 트리거됩니다 $(document).ready
이벤트. 이것은 완벽하게 작동합니다.
작은 것이 있습니다 AJAX.BeginForm
DIV를 채울 때 사용할 다른 값을 추가합니다. 원격 기능을 올바르게 호출하고 성공시 원래 JavaScript 함수를 호출하여 DIV를 다시 채 웁니다.
이상한 부분은 다음과 같습니다. Firefox and Chrome에서 모든 것이 작동합니다. 그러나 IE8 (Beta)에서는 Populate DIV 스크립트에 대한이 두 번째 호출 ($ .getJson 함수라고 함)이 캐시 된 데이터를 가져오고 서버를 묻지 않습니다!
이 질문이 의미가 있기를 바랍니다. 너트 쉘에서 - 왜 $.getJSON
캐시 된 데이터를 얻습니까? 그리고 왜 IE8에만 영향을 미칩니 까?
해결책
Firefox와 Chrome은 모든 AJAX 요청을 성향이 없다고 생각합니다. 즉 (모든 버전) Ajax 호출을 다른 웹 요청과 마찬가지로 처리하십시오. 그래서이 행동을 보는 이유입니다.
즉, 각 요청에서 데이터를 다운로드하도록 강요하는 방법 :
- 당신이 말했듯이, jQuery에서 '캐시'또는 '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 사용 ( '{캐시 : 아니오}'); 완벽하게 일했습니다. [편집하다
아니면 적어도 나는 내가 그렇게 생각했다. jQuery $ .getJson은 $ .Ajax 객체에 대한 변경 사항을 읽지 않는 것 같습니다.
작동 한 솔루션은 새로운 매개 변수를 수동으로 추가하는 것이 었습니다.
var noCache = Date();
$.getJSON("/somepage/someaction", { "noCache": noCache }, Callback);
날짜 해결은 1 분에 지나지 않습니다. 이는이 솔루션이 여전히 1 분 동안 계속 캐시를 의미합니다. 이것은 내 목적으로 허용됩니다.
컨트롤러의 동작에 다음 속성을 배치하여 동일한 문제를 해결했습니다.
[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 It!