Как правильно реализовать шаблон PRG в веб-формах asp.net - PullRequest
4 голосов
/ 13 сентября 2011

У меня есть простой трехстраничный веб-сайт asp.net, и у меня возникла проблема с кнопкой «Назад» браузера, которая выдает всплывающее окно «... Firefox должен отправить любую информацию, которая будет повторять любое действие ...» при нажатии на шаг 3.aspx.

Поток таков: пользователь попадает на step1.aspx, сессия запускается, а пользователь цитирует продукт и перенаправляется на step2.aspx.На step2.aspx вы подтверждаете покупку, нажимая кнопку asp :.Обработчик события OnClick, btnPurchase_Click, обрабатывает логику покупки и перенаправляет Response.Redirect ("step3.aspx") на step3.aspx.Step3.aspx просто отображает страницу подтверждения (детали получения).Сессия уничтожается на шаге 3, и когда пользователь нажимает кнопку «Назад» в браузере, ему предлагается всплывающее окно повторной отправки.В идеале я хочу, чтобы пользователь нажимал на шаг 1 при ответном ударе без запроса на повторную отправку.Каждая страница не имеет кэширования и перенаправляет на шаг 1, если сеанс недействителен.

У кого-нибудь есть предложения по улучшению потока?

Этот сайт в конечном итоге будет перенесен на asp.net mvc / ajax, что, скорее всего, упростит реализацию рабочего процесса PRG, но пока, в поисках относительно простого способа.

Ответы [ 3 ]

5 голосов
/ 17 сентября 2011

Простое решение состоит в том, чтобы никогда не позволять странице отображаться при обратной передаче, а вместо этого принимать / хранить любую информацию, которая была опубликована, а затем перенаправлять на следующую страницу (или на себя).

Таким образом, если пользователь нажимает кнопку «Назад», он возвращается к GET, а не к POST и избегает всплывающего окна.

2 голосов
/ 22 сентября 2011

Если я правильно понимаю, вы еще не используете PRG.

На шаге 2 временно сохраните информацию и перенаправьте ее, чтобы отобразить.То, как вы это сделаете, во многом зависит от вашего приложения: сеанс, база данных, файлы cookie и т. Д. - все варианты с различными характеристиками.

Затем перенаправьте, чтобы показать эту информацию.

То же самое происходит на шаге 3

Если вы вернетесь к шагу 3, вы перейдете к шагу 2. Но если вы вернетесь к запросу GET, предупреждения не будет.Как вы сказали, ваше приложение уничтожает данные сеанса на 3, поэтому в соответствии с тем, что вы сказали, пользователь перейдет к шагу 3.

Может быть, я что-то упускаю из того, что вы сказали.

2 голосов
/ 17 сентября 2011

Я попробую этот вопрос.Упомянутый вами поток будет препятствовать нормальной работе страниц, что вы, конечно, уже имеете в виду.Хотя я бы сказал, что это может быть опасно (против ожидаемой функции) и неэффективно.Исходя из того, что я вижу из вашего вопроса, я бы окончательно удалил Page2 и Page3 и сохранил всю логику на одной и той же странице.

Я также был бы рад услышать то, что вы пытаетесь избежать, с этим?Это двойные посты?Как двойной пост контента в корзине?Частичные / неполные вставки ввода данных?Описанным способом воздействия на кнопки «назад» вы можете решить одну проблему, но поднять другую.Большой выбор браузеров, которые могут действовать совершенно по-разному в таких обходных ситуациях.

Я вижу два хороших варианта:

UserControl,
Создайте три элемента UserControl, каждый из которых имеет свою логику для каждой страницы.Вы можете программно загрузить их на страницу.Т.е. на bnButton_Click событие.Пользовательские контролы загружаются с LoadControl("PathToAscxFileOnDisk.ascx").

Панели,
Я бы также подумал о трех <asp:PlaceHolder></asp:PlaceHolder> или, может быть, лучше <asp:Panel></asp:Panel>, чтобы вложить всю логику.

В этом случае вы полностью свободны от проблем обратной передачи и можете сосредоточиться на переносе своих функций в бизнес-логику и использовать Code-File для управления потоком при отображении / скрытии и заполнении элементов управления входом / выходом изпанели / usercontrols.Вы, вероятно, также можете управлять postback / click-URL и push-enter-key.

И вы упомянули Ajax,
Ajax абсолютно необходим для того, чтобы сделать вашу страницу без сохранения состояния (что означает, что вы можете работать без кэша,сессии, viewstate и т. д. Хотя проблема заключается в возможности пользователей перемещаться между страницами. Я думаю, что даже Ajax будет менее полезен, в то время как вы сохраняете трехстраничное решение.

Я бы личноскажем, это простая задача - переместить файлы aspx в каждый ascx и создать aspx в качестве мастер-контейнера. С этой опцией вы даже избегаете дублирования имен (как, например, копирование / вставка кода в панели) и проблем с потоком Page_Load /логика.

...