Как мне в ASP.NET сохранить информацию со страницы, когда пользователь покидает страницу?

В нашей CMS у нас есть место, где мы позволяем пользователям играть с иерархией своего сайта — перемещать страницы, добавлять и удалять страницы и т. д.

Мы используем перетаскивание для реализации перемещения страниц.

Каждое движение должно быть сохранено в БД и экспортировано во множество файлов HTML. Если мы будем делать это при каждом движении, это замедлит работу пользователей. Поэтому мы подумали, что предпочтительнее дать пользователям поиграться сколько угодно, сохраняя каждое изменение в БД, но только когда они покидают страницу - чтобы экспортировать свои изменения в файлы HTML.

Мы подумали о том, чтобы заставить пользователя нажать кнопку «Опубликовать», когда он будет готов зафиксировать свои изменения, но мы опасаемся, что пользователи не забудут сделать это, потому что с их точки зрения, как только они переместили страницу в новое место - действие выполнено. Другая проблема с кнопкой заключается в том, что она несовместима с поведением других частей сайта (например, когда пользователь перемещает текст внутри страницы, изменения сохраняются автоматически, так как нужно обновить только 1 HTML-файл).

Итак, как мы можем автоматически сохранять изменения пользователя при выходе со страницы?


person Lea Cohen    schedule 25.09.2008    source источник


Ответы (4)


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

Из http://www.siafoo.net/article/67:

В современных браузерах есть событие с именем window.beforeunload, которое запускается сразу же, как только происходит какое-либо событие, которое может привести к выгрузке страницы. Это включает в себя нажатие на ссылку, отправку формы или закрытие вкладки или окна.

Посетите эту страницу для примера работы в большинстве браузеров:

http://www.webreference.com/dhtml/diner/beforeunload/bunload4.html

Я считаю плохой практикой сохранять страницу без предварительного запроса пользователя, так не работают обычные веб-страницы.

Образец:

<SCRIPT LANGUAGE="JavaScript1.2" TYPE="text/javascript">
<!--
function unloadMess(){
    mess = "Wait! You haven't finished."
    return mess;
}

function setBunload(on){
    window.onbeforeunload = (on) ? unloadMess : null;
}

setBunload(true);
//-->
</SCRIPT>
person Espo    schedule 25.09.2008
comment
Я понимаю ваш комментарий о том, что это не так, как работают веб-страницы. Однако это веб-приложение, и если вы что-то делаете (например, перемещаете, добавляете или удаляете), вы ожидаете, что изменения будут сохранены без повторного щелчка. - person Lea Cohen; 25.09.2008

Самый простой способ, который я могу придумать, - это хранить информацию о странице каждый раз, когда пользователь перемещает элементы с помощью Ajax (например, с помощью события UpdatePanel, onUpdated, пусть он запускает некоторый скрипт, который обновляет конфигурацию страницы пользователя.

В качестве альтернативы - реализация .Net WebParts делает это автоматически без вмешательства программиста (если вы не хотите изменить механизм хранения, по умолчанию он использует локальный mdb).

person Martin    schedule 25.09.2008

Используйте флажок/кнопку «Опубликовать», и когда пользователь взаимодействует со страницей таким образом, что заставляет его уйти, спросите их, хотят ли они опубликовать, если этот флажок НЕ отмечен/кнопка не нажата. Имейте в виду, что есть действия (закрытие браузера, доступ к меню избранного и т. д.), которые вы, вероятно, не захотите или не сможете предложить пользователю.

person Community    schedule 25.09.2008

Я бы заставил их нажать кнопку, например, опубликовать. Это вопрос «обучения».

Автоматическое сохранение изменений после их выхода может иметь и другие последствия. Например, если пользователь открывает запись и экспериментирует с ней и не собирается ее изменять, он закрывает ее, как документ Word, Excel и т. д. . Я бы хотел, чтобы ваш сайт имитировал эту модель.

Вы также должны помнить, что Интернет — это автономная среда и не требуется, чтобы все веб-приложения работали как приложения Windows.

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

person David Basarab    schedule 25.09.2008