Мне нужно выполнить действие контроллера, когда пользователь покидает страницу (закрыть, обновить, перейти по ссылке и т. Д.). Код действия выглядит так:
public ActionResult WindowUnload(int token)
{
MyObjects[token].Dispose();
return Content("Disposed");
}
При загрузке окна я делаю Ajax
запрос к действию:
$(window).unload(function ()
{
$.ajax({
type: "POST",
url: "@Url.Action("WindowUnload")",
data: {token: "@ViewData["Token"]"},
cache: false,
async: true
});
//alert("Disposing.");
})
Вышеуказанный запрос ajax
не приходит на мой контроллер, т.е. действие не выполняется.
Чтобы приведенный выше код работал, мне нужно раскомментировать строку alert
, но я не хочу оповещать пользователя.
Если я изменю параметр async
на false
(комментируется alert
), то иногда он работает. Например, если я обновлю страницу несколько раз слишком быстро, то действие не будет выполняться при каждой выгрузке.
Есть предложения, как выполнить действие при каждой выгрузке без предупреждения?
Обратите внимание, мне не нужно ничего возвращать из действия на страницу.
Обновлено: резюме ответов
Невозможно надежно выполнить запрос при выгрузке, так как он не является правильным или ожидаемым поведением при выгрузке. Поэтому лучше перепроектировать приложение и избегать выполнения HTTP-запроса при выгрузке окна.
Если этого не избежать, то есть общие решения (описанные в вопросе):
- Звоните
ajax
синхронно, т.е. async: false
.
- Плюсы: в большинстве случаев работает.
- Плюсы: тихий
- Минусы: не работает в некоторых случаях, например, когда пользователь обновляет окна в несколько раз слишком быстро (наблюдается в Firefox)
- Используйте
alert
на success
или после ajax
вызова
- Плюсы: похоже, работает во всех случаях.
- Минусы: не тихий и всплывающие оповещения.