Есть ли способ узнать, что пользователь покидает страницу с asp.net?

2

Мой вопрос немного сложный. по крайней мере, я думаю. Может, и нет. Я хочу знать, есть ли способ узнать, покидает ли пользователь страницу. Как бы то ни было, если он нажимает кнопку "Предыдущая", закрывая окно или просматривая ссылку на моем веб-сайте. Если моя память все еще хороша, я думаю, что это возможно с JavaScript.

Но в моем случае я хочу сделать кое-что (чистящие объекты) в моем коде.

Теги:
events

5 ответов

3
Лучший ответ

На самом деле это невозможно. Событие не запускается, когда браузер возвращается.

Вы можете сделать это с помощью Javascript, но в лучшем случае это сложно.

Смотрите здесь.

Этот script также будет работать. Было найдено здесь

<script>

window.onbeforeunload = function (evt) {
var message = ‘Are you sure you want to leave?’;
if (typeof evt == ‘undefined’) {
evt = window.event;
}
if (evt) {
evt.returnValue = message;
}
return message;
}

</script> 
  • 1
    Я думаю, это будет срабатывать на каждом постбэке тоже
3

Вы можете использовать javascript, чтобы сообщить серверу, когда пользователь покидает страницу. Но веб-сервер моет руки страницы, когда он покидает сервер, в то время как пользователь может оставить страницу открытой в течение недели.

Если вы используете javascript на странице, чтобы отключить уведомление на вашем сервере при выгрузке страницы, вы можете предпринять некоторые действия. Но вы не можете сказать, покидает ли он вашу страницу на другой странице, на другом веб-сайте или закрывает браузер.

И последнее уведомление не всегда будет отправлено, поэтому вы не можете полностью полагаться на него.

Таким образом, использование уведомления javascript для очистки объектов (кешей или сеансов) является ошибочной системой. Вам лучше использовать стратегии кэширования и сеанса, которые не зависят от уведомления onunload.

  • 0
    Хороший ответ. Действительно ясно ... особенно для такого парня, как я, который обычно говорит по-французски. Поблагодарить!
3

Если цель состоит в том, чтобы очистить объекты в вашем коде, то достаточно ли этого, чтобы полагаться на тайм-аут сеанса? Это будет 20-минутная задержка перед очисткой этих объектов (или того, на что у вас установлен тайм-аут сеанса).

Но это простой и надежный способ сделать это. В файле Global.asax вы просто выполните следующее:

Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
  ' Clean up stuff
End Sub
  • 0
    Да, хорошие идеи в некоторых случаях, но я не совсем понял, думаю, в моем основном посте. Это предотвращение, когда пользователь вернулся на страницу, которая обрабатывает переменную Session ... см. Мой второй пост. Спасибо за ответ TheSteve.
  • 1
    Просто предостережение: Session_End не сработает, если вы используете State State или SQL Server для управления состоянием. Вам может просто потребоваться явно очистить объекты Session в Page_Load или Init, а не находить событие «ухода».
1

Как уже упоминалось, вы можете сделать это неосуществимо в JavaScript, но я исхожу из формулировки вашего вопроса, что вы хотите сделать это в коде на стороне сервера ( "код-позади" ).

Это невозможно, поскольку код работает на другом компьютере (веб-сервере) и не имеет представления о том, что происходит на компьютере пользователя, если браузер не отправит запрос на сервер (для чего требуется некоторый Javascript или другой код на стороне клиента).

Если необходимо, используйте события таймаута сеанса, чтобы очистить любую информацию о состоянии, которую вы храните за пределами срока службы запроса.

0

Euuwww... хорошо нормально. Моя проблема в том, что я сохранил в переменной Session объекты (с кучей критериев поиска). Сохраняя его в переменной сеанса, если пользователь вернется к результату поисковой страницы, он вернет тот же результат, что и в последний раз. Но после некоторого рефлексии (не в коде, а в голове и после просмотра вашего ответа: oP), я добавлю в объект объект boolean, что будет означать что-то вроде "IsDirty" или "HasBeenListed". И когда я вернусь, если он настроен на загрязнение, он перенаправит обратно на другую страницу.

Спасибо Дэвиду.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню