某些表格太复杂,无法将它们放在一页上。例如,如果表单涉及大量结构化数据,例如在 map 上选择位置、在日历小部件中安排事件,或者根据之前的输入使表单的某些部分发生变化,那么能够将某个表单拆分为多个页面。
这对于动态网页和 Javascript 来说很容易做到,因为只需创建一个带有不同页面的选项卡小部件,实际提交的表单将包含整个选项卡小部件及其所有输入字段,生成单个 POST
请求整个操作。
但是,有时生成某些输入字段需要很长时间;即使在页面生成之后,它们甚至可能是计算密集型的,对低端计算机用户的浏览器造成负担。此外,创建根据早期输入自行调整的表单变得困难或不可能。
因此,有必要将某个表单拆分为多个整页请求。
这可能很困难,尤其是因为表单的第一页将 POST
至/location/a
, 这将重定向到 /location/b
并要求为 GET
由客户。从 POST /location/a
传递存储的表单数据至GET /location/b
是困难所在。
Erwin Vervaet,Spring Web Flow(Spring 框架的一个子项目,以其依赖注入(inject)能力而闻名)的创建者曾经写过 a blog article在所述框架中演示此功能,并将其与实现 similar functionality 的 Lift Web 框架进行比较.然后他提出了对其他 Web 框架的挑战,这在 a later article 中有进一步的描述。 .
Yesod 将如何面对这个问题,尤其是考虑到它基于 REST 的无状态特性?
最佳答案
首先,目前还没有预先构建的解决方案(至少我知道)。而且我不熟悉提到的其他框架如何解决问题。所以我在这里说的几乎是猜想。但是,我相当肯定它会起作用。
这里问题的关键是将页面 A 的 POST 参数编码到页面 B 的 GET 请求中。最简单的方法是将页面 A 的 POST 参数粘贴到 session 变量中。但是,这样做会彻底破坏导航:后退/前进根本不会像描述的那样工作。
所以我们回到 REST:我们需要将 POST 参数编码到请求本身。这实际上意味着将信息放在请求的路径或查询字符串中。查询字符串可能是最有意义的。
我担心将原始 POST 参数放入查询字符串中,因为这将允许任何代理服务器轻松窥探内容。所以我想利用来自客户端 session 的现有密码学。换句话说,我们将在查询字符串参数中粘贴之前提交的表单的签名、加密版本。
为了使它更具体一点:
如果有人感兴趣,这看起来将是一个有趣的附加包。
关于forms - 带有页面流的 Yesod 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11600037/