В случае успешного использования рабочий процесс Post / Redirect / Get (PRG) довольно прост: просто перенаправьте (на стороне клиента) на нужную страницу. Но как насчет случаев, когда во время проверки на стороне сервера возникают ошибки, и мы хотим сохранить входные данные при повторном отображении входной страницы?
Насколько я могу судить, существует два подхода: просто заново визуализировать страницу ввода после отправки формы POST (то есть без перенаправления) во время ошибок (таким образом, игнорируя шаблон PRG); или, перенаправить на страницу ввода и сохранить предыдущие входные данные там, где они могут быть получены позднее (например, сеанс), во время рендеринга. Оба имеют недостатки: во-первых, нам представляются проблемы, которые помогает нам избежать шаблон PRG (например, возможность добавления закладок, двойное представление); второй подход приводит к непоследовательности GET (первый GET найдет сохраненные входные данные, последующие GET могут не найти). Есть ли другие альтернативы упомянутым здесь? Я надеюсь получить от сообщества информацию о том, как лучше всего справиться с этим делом.
Обычно я делаю это первым способом, который вы описываете — перенаправление только в случае успешной отправки. Трудно увидеть реальный вариант использования для закладки формы, содержащей неверные данные; с другой стороны, часто имеет смысл добавить страницу подтверждения (после успешной отправки).
Если URL-адрес, используемый для заполнения формы, является тем, к которому отправляется форма POST, я не думаю, что есть проблема. Если ввод действителен, Redirect и GET. Если он недействителен, перезапустите заполненную форму. Таким образом, взаимодействие выглядит так:
GET /your-url => blank form
POST /your-url (success) => Redirect => GET /success-url
POST /your-url (failure) => filled-in form
Упомянутая проблема с закладками затрагивает оба подхода: вы не можете на самом деле сделать закладку на то, что зависит от некоторых временных данных, сохраненных на сервере.
И двойная отправка на самом деле не является проблемой, если вы гарантируете, что если проверка не пройдена, вы не сохраните никакие данные (то есть каждая отправка с ошибочными данными является идемпотентным запросом).
Так что PRG только в случае успеха — очень чистый подход.
Как и в других ответах, используйте только шаблон Post / Redirect / Get для успешной проверки на стороне сервера. Когда форма недействительна, просто ответьте на ответ напрямую, с сообщениями об ошибках.
Для удобства использования вы должны убедиться, что проверка на стороне клиента отличная, В любом случае это хорошая идея, поскольку пользователям нравится немедленная обратная связь. Используйте Javascript или новые возможности формы HTML5, такой как required
атрибут или maxlength
атрибут или type="email"
атрибут и так далее.
Конечно, у вас все еще должна быть проверка на стороне сервера для безопасности и для постепенной деградации.
Если вы используете ASP.NET MVC, то есть другой метод, который можно использовать для ситуации Post -> fail. Это покрыто # 13 этой статьи: ASP.NET MVC Best Practices (часть 1).
Если вы реализуете этот метод, то вы можете всегда перенаправить после сообщения, даже если сообщение привело к сбою.