Как обрабатываются ошибки на стороне сервера в шаблоне Post / Redirect / Get?

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

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

27

Решение

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

11

Другие решения

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

GET  /your-url => blank form
POST /your-url (success) => Redirect => GET /success-url
POST /your-url (failure) => filled-in form
7

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

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

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

3

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

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

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

2

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

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

0
По вопросам рекламы [email protected]