Я относительно новичок в разработке веб-сайтов и ASP.Net, так что терпите меня. В ходе тестирования наших веб-страниц я заметил, что если бы пользователь щелкнул «Обновить / перезагрузить» и щелкнул «Повторить попытку» при появлении запроса в диалоговом окне «Отправить повторно», независимо от того, какое последнее событие было запущено до того, как пользователь выбрал на «Обновить», впоследствии будет запущено снова.
В качестве примера у нас есть кнопки навигации «Назад» и «Далее», которые позволяют пользователю перемещаться по ряду вопросов. Если оператор нажмет «Обновить / Обновить», какая-либо кнопка навигации, которую пользователь нажимал последней, сработает снова. Это действительно имеет смысл, но в итоге пользователь попадает на следующую или предыдущую страницу, с которой он раньше просматривал. Есть ли обходной путь для такого рода вещей?
Обновление / перезагрузка побочного эффекта с помощью ASP.net?
Ответы (2)
Это связано с тем, как вы обрабатываете PostBacks.
Необходима небольшая предыстория:
Интернет не имеет состояния, что означает, что каждый запрос от клиента к серверу не зависит от запроса перед ним или запроса после него. Нет никакого «состояния». Если вы посмотрите на уровень HTTP, это просто текстовый blob, отправленный на сервер, который говорит «отправьте мне эту информацию», и сервер отправляет его обратно. Нет «Я тот же пользователь, который был здесь 3 минуты назад, и я хотел бы перейти на следующую страницу с той, на которой я был в прошлый раз, когда мы говорили».
ASP.NET решает эту проблему с помощью ViewState и обратных передач. Каждый раз, когда вы нажимаете кнопку ASP.NET, фактически отправляется форма, в которой есть скрытое поле с кучей закодированных данных. Эти данные содержат всю информацию, необходимую серверу для «восстановления» состояния страницы, как это было в последний раз. Затем он может выполнить команду «перейти к следующей странице», и эта команда имеет смысл. Когда ASP.NET отправляет HTML-код обратно клиенту, он обновляет это скрытое поле новыми данными, снова представляя состояние страницы, как сейчас. И в следующий раз, когда вы нажмете любую кнопку, данные будут отправлены снова, страница снова будет реконструирована, и цикл повторяется.
Когда пользователь нажимает «обновить», браузер спрашивает его, хотят ли они повторно отправить форму. Они повторно представляют те же данные, что и в прошлый раз.
Последствия для вас:
Если вы пытаетесь отслеживать какие-либо данные о пользователе или о том, что он делает независимо от ASP.NET ViewState, вам нужно будет синхронизировать их каждый раз при обработке страницы.
Вероятно, вы захотите сохранить «текущую страницу» в ViewState:
ViewState.Add("CurrentPage", intCurrentPage);
Поэтому, когда вы вызываете обработчик событий MoveNext
, вы можете быть уверены, что перемещаетесь относительно страницы, поскольку это был последний раз, когда она была отправлена клиенту.
Вы можете посмотреть на шаблон Post-Redirect-Get, который чаще используется в asp.net mvc.
Дополнительные сведения см. здесь.