jQuery $ .getJSON работает только один раз для каждого элемента управления. Не достигает сервера снова - PullRequest
8 голосов
/ 28 августа 2009

Первый мой код

$.getJSON("./posts/vote/" + postId + "/1", null, function(result) {
   if (result.result == true)
      $("#pst" + postId + " > .pstside > .rank > .score").html(result.voteCount);
 });

У меня есть несколько кнопок, каждая с кодом, который выводит некоторые результаты голосования из действия контроллера ASP.Net MVC.

Это работает хорошо при первом нажатии кнопки, но при повторном нажатии ничего не происходит. Ничто не достигает сервера.

Я тестирую на FireFox.

Что не так? Какое-то странное кеширование? Поскольку запрос никогда не достигает моего контроллера во второй раз, JavaScript, кажется, выполняется нормально, но продолжает возвращать старые значения.

Ответы [ 4 ]

18 голосов
/ 28 августа 2009

Похоже на проблему с кэшем браузера (если я уверен, что это происходит с IE), вы можете использовать $. Ajax и установить для параметра кэширования значение false, поскольку false по умолчанию только для dataType script и jsonp:

$.ajax({
  type: "GET",
  url: "./posts/vote/" + postId + "/1",
  success: function (result) {
    if (result.result == true)
      $("#pst" + postId + " > .pstside > .rank > .score").html(result.voteCount);
  },
  dataType: "json",
  cache: false
});

Или вы можете установить эту опцию глобально для всех функций jQuery Ajax, используя $. AjaxSetup перед использованием $ .getJSON:

$.ajaxSetup({ cache: false });

Редактировать: Вы можете сделать POST-запрос, возвращающий JSON, следующим образом:

$.post("./posts/vote/" + postId + "/1", 
  function (result) {
    if (result.result == true)
      $("#pst" + postId + " > .pstside > .rank > .score").html(result.voteCount);
  }, "json");

Если вы планируете выполнять много запросов postJSON , вы можете сделать свою собственную функцию:

jQuery.postJSON = function(url, data, callback) {
    jQuery.post(url, data, callback, "json") ;
};

И вы сможете использовать его так же, как $ .getJSON

2 голосов
/ 27 мая 2011

Да, $.ajaxSetup({ cache: false }); действительно решает проблему! Мое приложение с MVC 2. Код как показано ниже:

<script type="text/javascript">
    jQuery(document).ready(function () {
        $.ajaxSetup({ cache: false });

        $('#btnApplyForm').click(function () {
            $("#applyForm").html("Loading...");
            $("#divApplyForm").dialog("open");
            var id = $('#applyFormID').attr("value");
            $.get('<%= Url.Content("~/Applying/FillApplyForm/") %>' + id,
                    function (response) { $("#intakeForm").html(response); }
            );
            return false;
        });

        $("#divApplyForm").dialog({
            title: "Application Form",
            autoOpen: false,
            bgiframe: true,
            modal: true,
            width: 600,
            height: 540
        });
    });
</script>
2 голосов
/ 28 августа 2009

Поскольку вы выполняете «GET», не исключено, что проблема может быть в некотором кешировании (в браузере, прокси / посреднике или на сервере). Возможно, попробуйте использовать «POST», если вы изменяете данные («продолжает возвращать старые значения»). Или введите в запрос какой-нибудь случайный компонент.

0 голосов
/ 28 августа 2009

Вы можете сделать то же самое с запросом GET, просто добавьте временную метку в конце запроса, например, см. Приведенный ниже пример запроса

http://www.abc.com/api/v1/votes?user=123&tag=jQuery&_timestamp=1234421352

Таким образом, браузер не будет кэшировать ваши запросы, так как URL будет меняться при каждом вызове. Вы можете легко получить метку времени из Javascript. Также вам не нужно обрабатывать эту временную метку на стороне сервера, но это на ваше усмотрение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...