对于成功的用例,Post/Redirect/GET(PRG)工作流程非常简单:简单地重定向(客户端)到所需的页面。但是,当服务器端验证期间遇到错误时,我们想在再次显示输入页面时保留输入呢?

据我所知,有两种方法:只需在错误期间提交后(即没有重定向)之后重新渲染输入页面(因此忽略了PRG模式);或者,重定向到输入页面,并在渲染过程中以稍后(例如会话)的位置存储以前可以检索的先前输入。两者都有缺点:首先,我们遇到了PRG模式的问题,可以帮助我们避免(例如,书签性,双重提交);第二种方法导致不一致(首先要找到存储的输入,随后的获取可能不会)。这里提到的那些人还有其他选择吗?我希望从社区获得有关如何最好地处理这种情况的投入。

有帮助吗?

解决方案

我通常是您描述的第一种方法 - 仅在成功提交的情况下重新进行。很难看到用于为包含无效数据的表格书签书签的真实用例。另一方面,书签为确认页面(成功提交后)通常是有意义的。

其他提示

如果用来填写表单的URL是表格帖子的表单,那么我认为没有问题。如果输入有效,请重定向并获得。如果是无效的,请重新播放填充表格。这样,互动看起来像:

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

提到的书签性问题正在影响两种方法,您实际上无法将某些依赖于保留在服务器上的临时数据的内容添加书签。

而且,如果确保验证失败,则不会保存任何数据(即每个提交失败的数据的提交是IDEMPOTENT请求),双重访问并不是真正的问题。

因此,只有成功的PRG才是一种非常干净的方法。

就像其他答案所说的那样,仅在成功的服务器端验证中使用Post/Redirect/GET模式。当表单无效时,只需直接使用错误消息响应响应。

为了可用性,您应该确保 客户端验证非常好, ,无论如何,这都是一个好主意,因为用户像立即反馈一样。使用JavaScript或 新的HTML5形式功能, , 如那个 required 属性或 maxlength 属性或 type="email" 属性等。

当然, 您仍然应该有服务器端验证 安全和优雅的退化。

如果您使用的是ASP.NET MVC,则可以将另一种方法用于帖子 - >失败情况。本文的#13涵盖了: ASP.NET MVC最佳实践(第1部分).

如果您实现该方法,那么您可以 总是 帖子后重定向,即使帖子导致故障。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top