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

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

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

Ответов (5)

Решение

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

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

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

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

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

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

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

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

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

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

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