Обновление / перезагрузка побочного эффекта с помощью ASP.net?

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


person Community    schedule 20.08.2009    source источник
comment
См .: stackoverflow.com/questions/743580/   -  person Shog9    schedule 21.08.2009


Ответы (2)


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

Необходима небольшая предыстория:

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

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

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

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

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

Вероятно, вы захотите сохранить «текущую страницу» в ViewState:

ViewState.Add("CurrentPage", intCurrentPage);

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

person Rex M    schedule 20.08.2009

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

Дополнительные сведения см. здесь.

person redsquare    schedule 20.08.2009
comment
Это хороший метод для смягчения фактических повторных отправок форм, но я не уверен, было бы хорошей идеей использовать его для практически каждого запроса в приложении WebForms с высоким уровнем отслеживания состояния. Это удваивает количество запросов в масштабе всего приложения. - person Rex M; 21.08.2009
comment
OP ничего не упомянул о высоком уровне состояния, это всего лишь ваше предположение, и если у него не будет ›200 запросов в секунду, его инфраструктура вряд ли заметит дополнительный обход. Чтобы избавиться от этих диалогов и опасностей повторной отправки, стоит потрудиться. - person redsquare; 21.08.2009
comment
Если вы заметили, SO использует ту же технику. Я не вижу здесь большого количества проблем с производительностью, и он просматривается чаще, чем несколько раз в секунду! - person redsquare; 21.08.2009
comment
@redsquare, как я уже сказал, в технике нет ничего плохого. Просто обсуждаю, является ли это идеальным решением для такой распространенной задачи, как пейджинг. - person Rex M; 21.08.2009
comment
ну, проблема действительно в веб-формах ... viewstate ... и т. д. - person redsquare; 21.08.2009