1

我有一个三步表格,其中每个步骤都有自己的动作。操作重定向到下一步。数据存储在会话范围内。我有一个过滤器,可以防止用户通过发布请求以外的任何方式访问表单处理程序。

但是,没有什么可以阻止某人手动输入步骤的地址。为了解决这个问题,我在会话中设置了一个 currentStep 变量。

<!--- Some data is processed here --->
<cfset session.currentStep = "stepTwo">

在第二步中,我将检查结构键:

<cfif NOT session.currentStep = "stepTwo">
<!--- redirect to #session.currentStep# --->

这种方法有效,但它有一个主要缺点:用户不能在浏览器窗口中按下后退按钮,或编辑他或她已经输入的任何数据。

实施多步骤表单的最佳实践是什么?我可以改进我的流程以合并后退按钮功能吗?

4

2 回答 2

2

如果需要,您可以继续使用 Session 方法。

为了解决你的主要缺点,你可以稍微改变你的逻辑。

在最后一步,确保在会话中找到所有步骤的数据。如果没有,将用户重定向到第一个未填写的步骤?应该不会太难。

于 2010-09-16T04:35:00.980 回答
2

与其使用会话变量只允许他们访问当前步骤,不如允许他们访问当前或以前的步骤。有点像“你能走多远”的标志。

现在,添加前面步骤的链接,例如面包屑路径。

最后,在持久存储(数据库、会话、xml、持有包等)中查找已为该表单输入的数据。创建一组空白的表单数据,用持久存储中的任何内容覆盖它,然后用表单范围本身的任何内容覆盖它。就像是:

populate = structNew(); // this is the data to populate your form with on load
populate.someValue = "";
structappend(populate, dataFromStorage);
structappend(populate, form); // from things submitted from the form scope, in case validation fails
<input type="text" name="someValue" value="#variables.populate.someValue">

现在,如果有人两次点击相同的表单步骤,他们将看到(按优先顺序)他们提交但未通过验证的值、来自持久数据存储的值,然后是一个空表单。

于 2010-09-16T13:24:36.693 回答