Обновление / Перезагрузка побочного эффекта с ASP.net? - PullRequest
6 голосов
/ 21 августа 2009

Я относительно новичок в разработке веб и ASP.Net, так что терпите меня. В ходе тестирования наших веб-страниц я заметил, что если пользователь нажимает «Обновить / Перезагрузить» и нажимает «Повторить» при появлении запроса в диалоговом окне «Отправить информацию», независимо от того, какое последнее событие было запущено до того, как пользователь выбрал «Обновить», впоследствии будет запущен снова.
В качестве примера у нас есть кнопки «Назад» и «Далее», которые позволяют пользователю перемещаться по ряду вопросов. Если оператор нажал «Обновить / Перезагрузить», то та кнопка «Навигация», которую пользователь нажал последним, снова будет срабатывать. Это на самом деле имеет некоторый смысл, но в итоге пользователь попадает на следующую или предыдущую страницу, с которой он ранее просматривал. Есть ли обходной путь для такого рода вещей?

Ответы [ 2 ]

4 голосов
/ 21 августа 2009

Это связано с тем, как вы обрабатываете PostBacks .

Необходим небольшой фон:

Сеть "не имеет состояния", что означает, что каждый запрос от клиента к серверу не зависит от запроса до него или запроса после него. Там нет "государства" поддерживается. Если вы посмотрите на уровень HTTP, то это просто текстовое пятно, отправленное на сервер с надписью «пришлите мне эту информацию», и сервер отправит ее обратно. Там нет «Я тот же пользователь, который был здесь 3 минуты назад, и я хотел бы перейти на следующую страницу с той, на которой я был в прошлый раз, когда мы говорили».

ASP.NET решает эту проблему с помощью ViewState и обратных передач. Каждый раз, когда вы нажимаете кнопку ASP.NET, она фактически отправляет форму, в которой есть скрытое поле с кучей закодированных данных. Эти данные содержат всю информации, необходимой серверу для «восстановления» состояния страницы в том виде, в котором оно было в последний раз. Затем он может выполнить «перейти на следующую страницу», и эта команда имеет смысл. Когда ASP.NET отправляет HTML обратно клиенту, он обновляет это скрытое поле новыми данными, снова представляя состояние страницы, как сейчас. И в следующий раз, когда вы нажимаете любую кнопку, данные отправляются снова, страница восстанавливается снова и цикл повторяется.

Когда пользователь нажимает кнопку «обновить», браузер спрашивает его, хотят ли они повторно отправить форму. Они повторно отправляют те же данные, что и в прошлый раз.

Последствия для вас:

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

Возможно, вы хотите сохранить "текущую страницу" в ViewState:

ViewState.Add("CurrentPage", intCurrentPage);

Поэтому, когда вы вызываете обработчик события MoveNext, вы можете быть уверены, что перемещаетесь относительно страницы, как это было в последний раз, когда она была отправлена ​​клиенту.

1 голос
/ 21 августа 2009

Вы можете взглянуть на шаблон Post-Redirect-Get, который чаще используется в asp.net mvc.

Подробнее см. здесь .

...