fullCalendar, IE 11, refetchEvents срабатывает только тогда, когда открыто окно отладчика/разработчика [F12]

Проблема:

fullCalendar не обновляет события с помощью .fullCalendar('refetchEvents') после успешного вызова AJAX.


Использование

  • MSIE 11.0.41 (11.0.9600.18638) -- возникает проблема
  • FireFox 53.0 (32-разрядная версия) — проблема не возникает
  • Chrome 58.0.3029.81 (64-разрядная версия) — проблема не возникает

  • VS2015, C# MVC на локальном хосте, IIS Express
  • полный календарь.js v3.3.0
  • jquery-3.1.1.js
  • jquery-ui-1.12.1.js

Описание симптомов:

При вставке нового события в fullCalendar с помощью нижеприведенного вызова $.ajax

$.ajax({
        type: 'POST',
        url: '@Url.Action("SaveEvent","Calendar")',
        data: dataRow,
        success: function (response) {
                 if (response == 'True') {
                    $('#_Calendar').fullCalendar('refetchEvents');
                    alert('New event saved!');
                }
                else {
                    alert('Error, could not save event!');
                }
            }
        });

Когда приходит обратный вызов, метод 'refetchEvents' fullCalendar срабатывает только в MSIE 11, если открыто окно отладчика/разработчика. Неважно, установлена ​​ли фактическая точка останова, только при открытом окне отладчика/разработчика рутина работает?

Даже запуск 'refetchEvents' полностью отдельно от вызова $.ajax имеет такое же поведение. т.е. если я запускаю функцию, как показано ниже:

<button type="button" class="btn" onclick="fetchEvents(); return false;">trigger</button>

с функцией:

function fetchEvents() {
    $('#_Calendar').fullCalendar('refetchEvents');
}

Эффект точно такой же, «refetchEvents» срабатывает только в MSIE 11, если открыто окно отладчика/разработчика?

Я подумал, что это может быть проблема с синхронизацией, поэтому мой вариант запуска вручную, но поведение такое же, даже несмотря на то, что вызов 'refetchEvents' происходит после того, как событие было вставлено. Даже обновление страницы не вызывает 'refetchEvents'обновление событий только срабатывает - в MSIE 11- когда открыто окно отладчика/разработчика.

Как указано, ни один другой браузер на любой платформе (которую я тестировал) не дает такого же результата? (FireFox/Chrome/Safari/Android[Chrome и FireFox] работают безупречно...)

Кто-нибудь сталкивался с таким поведением и/или потенциально имел решение?

Буду признателен за ваш вклад!


person mtholen    schedule 03.05.2017    source источник
comment
Это раньше происходило из-за этого: stackoverflow.com/questions/7742781/, но это не должно влиять на IE11, см. сообщение для предложений, связанных с кэшированием .   -  person Alex K.    schedule 03.05.2017
comment
Спасибо за быстрый ответ, я попробовал вариант $.ajax({cache: false, ...}) из предложенного вами поста, но не повезло...   -  person mtholen    schedule 03.05.2017


Ответы (1)


Как оказалось, это действительно проблема кэширования, согласно ответу Алекса К., когда IE слишком увлечен кэшированием событий для календаря и не обновляет события.


Решение

На более раннем этапе я наткнулся на это вопрос и фантастический ответ. Несколько позже я также отметил этот вопрос с таким же хороший ответ. (обязательно проголосуйте за них!)

Я объединил их вместе в один атрибут, как показано ниже.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class NoCacheAttribute : ActionFilterAttribute
    {
    public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
        filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
        filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
        filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        filterContext.HttpContext.Response.Cache.SetNoStore();

        //Added later from: https://stackoverflow.com/questions/49547/how-to-control-web-page-caching-across-all-browsers
        filterContext.HttpContext.Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
        filterContext.HttpContext.Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
        filterContext.HttpContext.Response.AppendHeader("Expires", "0"); // Proxies.

        base.OnResultExecuting(filterContext);
        }
    }

Итак, украсив мой метод GetDiaryEvents атрибутом [NoCache], ответ JSON соответствующим образом помечен правильными заголовками, сообщая браузеру НЕ кэшировать возвращаемые значения.

Вот так:

    //GET: All Diary events
    [NoCache]
    public JsonResult GetDiaryEvents(string start, string end)
        {

        // code code code...

        var rows = eventList.ToArray();
        return Json(rows, JsonRequestBehavior.AllowGet);

        }

И поэтому сообщение JSON отправляется в браузер как:

HTTP/1.1 200 OK
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/10.0
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?SDpcTWFydGlqbiBUaG9sZW5cTXkgRG9jdW1lbnRzXFZpc3VhbCBTdHVkaW8gMjAxNVxQcm9qZWN0c1xGaW5pc2hMaW5lXzQuMlxGaW5pc2hMaW5lXzQuMlxDYWxlbmRhclxHZXREaWFyeUV2ZW50cw==?=
X-Powered-By: ASP.NET
Date: Thu, 04 May 2017 09:36:35 GMT
Content-Length: 9265

задача решена...

person mtholen    schedule 04.05.2017