Post/Redirect/Get模式中如何处理服务器端错误?

33

对于成功的使用案例,Post/Redirect/Get (PRG) 工作流程非常简单:只需将页面重定向(客户端)到所需页面即可。但是,在服务器端验证过程中遇到错误并且我们希望在再次显示输入页面时保留输入内容,该怎么办呢?

据我所知,有两种方法:在提交表单后(即无需重定向),在出现错误时简单地重新渲染输入页面(因此忽略了 PRG 模式);或者重定向到输入页面,并在呈现期间将先前的输入存储在某个可以稍后检索的位置(例如会话)中。这两种方法都有缺点:在第一种方法中,我们面临 PRG 模式帮助我们避免的问题(例如可打书性和重复提交);第二种方法会导致 GET 请求不一致(第一个 GET 将找到存储的输入,后续的 GET 可能不会)。这里是否有其他替代方案?我希望社区能够提供最佳处理此案例的意见。

5个回答

13
我通常会按照你所描述的第一种方式进行操作——只有在提交成功的情况下才进行重定向。很难想象在书签中保存包含无效数据的表单的真实用例;另一方面,在成功提交后,将确认页面加入书签通常是有意义的。

7
如果用于填写表单的URL是表单POST到的URL,我认为就没有问题了。如果输入有效,则重定向并GET。如果无效,则重新显示填好的表单。这样,交互看起来像这样:
GET  /your-url => blank form
POST /your-url (success) => Redirect => GET /success-url
POST /your-url (failure) => filled-in form

3

提到的可书签性问题影响了两种方法,你不能真正地为依赖于服务器上一些临时数据保存的东西设置书签。

如果您确保在验证失败时不保存任何数据(即每个带有错误数据的提交都是幂等请求),那么双重提交并不是真正的问题。

因此,只有成功时使用PRG是一个非常清晰的方法。


2
像其他答案所说,只有在成功的服务器端验证后才使用Post/Redirect/Get模式。当表单无效时,直接响应错误消息。

为了提高可用性,您应确保客户端验证非常好,这是一个好主意,因为用户喜欢即时反馈。使用JavaScript或新的HTML5表单功能,例如required属性、maxlength属性或type="email"属性等。

当然,您仍然需要服务器端验证以确保安全性和优雅降级。


0

如果您正在使用ASP.NET MVC,则有另一种方法可用于Post失败情况。请参阅本文的第13部分:ASP.NET MVC 最佳实践(第1部分)

如果您实施了该方法,那么即使Post导致失败,您也可以始终进行重定向。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接