2

我正在尝试在 Play 2.0.3 中实现一些流控制,这是一个包含几个步骤的向导。在 Play 中最好的方法是什么?

我想要多步骤流程,例如step1 -> step2 -> finish

主要问题是不允许用户跳过例如 step2 并直接完成(用户可以在浏览器中手动输入链接/finish)。

谢谢。如果我没有很好地解释自己,请告诉我。

4

3 回答 3

4

你至少有两个选择:

  • 使用 POST 方法在步骤之间发送数据,这将始终使用相同的 URL,如果用户刷新页面,他将返回到第一步。您的步骤标识符将只是隐藏的表单字段。
  • 使用 jQuery 显示后续步骤,您甚至不需要在步骤之间将数据发送到服务器。您可以构建一个大表单(如果它是表单)并使用 jQuery 显示/隐藏其部分。最后,您将执行包含所有步骤的通用表单提交,在那里您可以验证并显示“谢谢”页面。
  • 或者,您可以使用 AJAX 和 jQuery 来分离验证和保存步骤。
于 2012-11-07T14:27:33.950 回答
2

一种完全无状态的方式可能包括将所有数据存储在步骤的 URL 中,其中步骤n + 1包含来自步骤的所有数据n

GET   /step1    controllers.Application.step1
GET   /step2    controllers.Application.step2(dataFromStep1)
GET   /step3    controllers.Application.step3(dataFromStep1, dataFromStep2)
POST  /finish   controllers.Application.finish

该解决方案的优势在于其简单性以及 Play! 免费执行下一步之前检查所有必需步骤是否已完成的事实!路由器。

但是,如果您有大量数据,您的 URL 将非常庞大,从而使该解决方案不太适用。在这种情况下,您需要:

  • 将每个步骤的数据保存到持久存储(使用会话是另一种选择,但大小限制为 4KB);
  • 识别您的用户,例如/step2URL 不会为不同的用户返回相同的内容;
  • 设置超时以丢弃不完整的提交并清理您的持久存储;
  • 手动检查您的业务代码是否已完成最终提交的所有步骤。
于 2012-11-07T20:55:35.143 回答
1

我会将这些步骤存储在数据库中(长期)或缓存中(短期)。这样,您可以构建一些逻辑if (secondQuestionAnswered) { .. }并确保您的用户没有跳过任何内容和/或用户可以在他想要的时候完成这些步骤。如果您的应用程序增长并且您需要对其进行扩展,那么持久保存在数据库或缓存中也会受益。

于 2012-11-07T20:56:48.280 回答