Как обрабатываются ошибки на стороне сервера в шаблоне Post / Redirect / Get? - PullRequest
29 голосов
/ 01 марта 2009

В случае успешного использования рабочий процесс Post / Redirect / Get (PRG) довольно прост: просто перенаправьте (на стороне клиента) на нужную страницу. Но как насчет случаев, когда во время проверки на стороне сервера возникают ошибки, и мы хотим сохранить входные данные при повторном отображении входной страницы?

Насколько я могу судить, есть два подхода: просто заново визуализировать страницу ввода после отправки формы POST (т.е. без перенаправления) во время ошибок (таким образом, игнорируя шаблон PRG); или перенаправить на страницу ввода и сохранить предыдущие входные данные там, где они могут быть получены позже (например, сеанс), во время рендеринга. У обоих есть недостатки: во-первых, у нас есть проблемы, которые помогает нам избежать шаблон PRG (например, возможность добавления закладок, двойное представление); второй подход приводит к несогласованности GET (первый GET найдет сохраненные входные данные, последующие GET могут и не найти). Есть ли другие альтернативы упомянутым здесь? Я надеюсь получить от сообщества информацию о том, как лучше всего справиться с этим делом.

Ответы [ 5 ]

12 голосов
/ 01 марта 2009

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

7 голосов
/ 01 марта 2009

Если URL-адрес, используемый для заполнения формы, используется для отправки формы, я не думаю, что есть проблема. Если ввод действителен, Redirect и GET. Если он недействителен, перезапустите заполненную форму. Таким образом, взаимодействие выглядит так:

GET  /your-url => blank form
POST /your-url (success) => Redirect => GET /success-url
POST /your-url (failure) => filled-in form
3 голосов
/ 17 мая 2015

Упомянутая проблема с закладками затрагивает оба подхода: вы не можете действительно добавить в закладки что-либо, опирающееся на некоторые временные данные, сохраненные на сервере.

И двойная отправка на самом деле не является проблемой, если вы гарантируете, что в случае сбоя проверки вы не сохраните никаких данных (то есть каждая отправка с ошибочными данными является идемпотентным запросом).

Так что PRG только в случае успеха - очень чистый подход.

2 голосов
/ 03 февраля 2016

Как и в других ответах, используйте только шаблон Post / Redirect / Get для успешной проверки на стороне сервера. Если форма недействительна, просто ответьте на ответ напрямую с сообщениями об ошибках.

Для удобства использования вы должны убедиться, что проверка на стороне клиента превосходна , это хорошая идея в любом случае, поскольку пользователям нравится немедленная обратная связь. Используйте Javascript или новые функции формы HTML5 , такие как атрибут required или атрибут maxlength или type="email" и т. Д.

Конечно, у вас все еще должна быть проверка на стороне сервера для обеспечения безопасности и для постепенного снижения качества.

0 голосов
/ 18 декабря 2011

Если вы используете ASP.NET MVC, то есть другой метод, который можно использовать для ситуации Post -> fail. Это рассматривается в # 13 этой статьи: Рекомендации ASP.NET MVC (часть 1) .

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

...