避免 "undo" 返回 button-ing 表单的历史条目

avoid "undo" history entries for back button-ing over forms

令我惊讶的是,我找不到关于这个主题的任何信息,但是搜索这些东西总是会产生很多相似但不相关的东西......

总之,一些注意事项以避免误解: - 问题是关于 HTML、HTTP、Javascript 和浏览器行为。我有意不谈论 server-side 技术,因为我认为让这部分工作对我来说不是问题。 - 我的目标不是安全性,也不想限制用户 he/she 的行为。事实上,我想改进 UI。

假设我们有一个带有 POST-redirect-GET 表单的 HTML 页面。提交表单会导致 server-side 验证,然后是结果或验证错误。现在假设需要几次尝试才能使所有值都有效。 URL 保持不变,尽管我尝试使用更改 URLs。现在用户查看结果,然后想返回到链接到表单的任何页面。对于一个漂亮的用户界面,这应该需要点击 2 次后退按钮,一次 return 从结果页面到表单,第二次 return 到表单之前的页面。但是,用户必须点击过去每次失败的尝试才能输入有效值。

我怎样才能避免这种情况?再次注意,我不想 "hide" 来自用户的任何东西,只是不存在无效表单值有用的实际情况。我发现 "single-page application" 由于未填充历史记录而遇到相关问题的提示,但这实际上是相反的问题,我的应用程序不是 "single-page".

作为避免历史条目的替代方法,我也完全可以 side-stepping 以某种方式解决问题,甚至可以围绕它构建一个良好的用户界面。但是现在,按钮显示 "back"(在导航的意义上),但对表单显示 "undo"(在更改值的意义上)。人们希望后退按钮能够返回——他们已经有 ctrl-z 用于撤消。

直接的解决方案——虽然我找不到类似的东西——将是一个 HTTP header 说,"here's an updated version of the same resource you requested before, note how it has the same URL, so don't make it appear twice when back-button-ing"。

我认为最简单的方法是使用 ajax 来处理您的表单提交,即使它是一个多部分表单。

我会结合使用客户端验证来为您的用户提供更快的反馈,然后在您收到来自 ajax 请求的 return 数据时处理服务器端验证错误。

使用此方法,您的浏览器历史记录应该相对保留,而不是填满 success/failure 表单提交。

我个人喜欢这个客户端bootstrap验证器插件:

https://github.com/1000hz/bootstrap-validator

当我从服务器 return 收到错误消息时,我也使用它来更新界面。