Могут ли Response.Redirect и OnBeforeUnload хорошо играть вместе? - PullRequest
2 голосов
/ 04 апреля 2009

Кто-нибудь знает, как обнаружить в событии OnBeforeUnload, что код на стороне сервера отправил Response.Redirect? Я хочу попросить пользователя не дать им отойти от страницы раньше времени, но когда сервер перенаправляет меня, он не должен запрашивать пользователя.

Я работаю с устаревшим кодом, который широко использует Response.Redirect, и меня не интересует изменение способа перенаправления. Пожалуйста, не предлагайте использовать метод перенаправления X.

Это должно быть возможным сделать это на основе кода ответа в объекте XMLHttpRequest, так как перенаправление ответа должно отправить 302.

Редактировать: Response.Redirect отправляет обратно 200, с кодом перенаправления в теле, которое затем делает window.location.href = новую страницу в коде ASP.Net. Есть ли способ получить ответ сервера, чтобы определить, что это произошло?

Заранее спасибо за любую помощь!

Ответы [ 3 ]

6 голосов
/ 04 апреля 2009

Я разработал решение для него.

Когда PageRequestManager обрабатывает ответ от сервера, он устанавливает флаг _processingRequest. Чтобы позволить response.redirect проходить, я изменил свой JavaScript, чтобы проверить это. Событие теперь выглядит так:

window.onbeforeunload = function() {
  var prm = Sys.WebForms.PageRequestManager.getInstance();
  if (!prm._processingRequest){ 
    return "Are you sure you want to leave?";
  }
};
0 голосов
/ 04 апреля 2009

Да, Response.Redirect имеет перегрузку, которая позволяет вам решить, следует ли прекратить запрос (повысить ThreadAbortException). Если вы позволите Response закончить (передайте false как второй параметр); OnBeforeUnload также будет работать.

Однако простое выполнение OnBeforeUnload не поможет вам в этом случае, поскольку ваш код на стороне клиента (приглашение) будет запущен до того, как новая страница будет отправлена ​​в браузер (и, если вы перенаправите, она также заголовок 302, а не настоящая страница).

Я бы использовал AJAX для запроса к серверу, и, если он сообщает о завершении операции, разрешите перенаправление в коде Javascript.

0 голосов
/ 04 апреля 2009

Для страниц без AJAX вам не повезло, так как страница никогда не отправляется в браузер, только заголовок 302. Так что нет никакой возможности для обработки JavaScript OnBeforeUnload.

С ASP.NET AJAX Response.Redirect действительно не выполняет 302. Он отправляет обратно сообщение через XMLHttpRequest, а ASP.NET AJAX моделирует 302. Теоретически вы можете перехватить это и выполнить свою собственную обработку. ..

...