我一直在搜索关于SO的这个主题,而且找不到它就很头疼。
我已经开发了一段时间的网站,发现目前的问题是在回发后,如果提交有任何错误并且用户重定向回到表单,则表单值全部消失。
有没有好的方法/流程/设计实现,以便在回发后保留值?另外,我需要考虑默认值,数据库中的值和回发中的值 - 那么哪一个优先?
此外,我希望关注Post-Redirect-Get并使用相同的表格。
我想到的是:
答案 0 :(得分:10)
这是我通常的工作流程:
POST失败后我立即输出表单而不重定向到初始表单页面。使用任何体面的模板系统都很容易实现。然后,您可以使用POST数据重新填充表单。
如果表单绑定到视图(作为MVC模式的一部分),您可以初始化默认值并从数据库加载模型(填充下拉菜单等) - 重用整个显示/前端逻辑。
如果当前代码库使用重定向,您可以在回发处理的偶然点处include()
简单地{{1}}所需的表单/视图文件。
那它是如何运作的?简而言之:
答案 1 :(得分:2)
第一个答案是否已将其固定 - 如果帖子未通过验证,请使用错误消息重新生成表单/编辑页面,以便用户可以更正它们并重新提交。 (不要指望他们按“后退”键)。
我想补充一下进一步的调整。
当帖子通过验证并且数据库已更新时,然后将浏览器重定向到页面以显示刚刚更新的数据。这实现了三件好事。
a)如果更新数据库时出现问题,这将显示数据库中的数据,而不是您在变量中留下的数据,因此测试中的问题将非常明确。
b)显示数据库中的数据可让用户确信事情确实按预期发生。
c)如果用户点击远离此页面的链接,然后使用后退按钮返回,则会再次显示数据,而不是重新提交数据的问题。这更符合用户的期望,并且将避免数据库的双重更新。
注意 - 您必须小心重定向。 referer变量将告诉您用户在浏览器窗口中实际拥有的站点。如果他正在使用SSH隧道,这可能不是您所期望的。
伊恩
答案 2 :(得分:0)
如果数据足够小(用于cookie的4k以下的数据?),请将其填入浏览器cookie,这样您就不必存储任何内容,直到您的脚本可以验证每个字段为止。
对于默认值,用户输入应始终优先,否则如果输入的内容无法验证,则默认值将被覆盖。
使用cookie方法和重定向到GET表单有几个好处: