代码之家  ›  专栏  ›  技术社区  ›  Mohamad

对于冷聚变中的多步骤形式,有哪些最佳实践?

  •  1
  • Mohamad  · 技术社区  · 15 年前

    我有一个三步的表格,每一步都有自己的行动。该操作将重定向到下一步。数据存储在会话作用域中。我有一个过滤器,它阻止用户通过除POST请求之外的任何其他方式访问表单处理程序。

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

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

    在步骤2中,我将检查structkey:

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

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

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

    2 回复  |  直到 15 年前
        1
  •  2
  •   Ben Doom    15 年前

    不使用session变量只允许它们访问当前步骤,而是允许它们访问当前或以前的步骤。有点像“你能走多远”的标志。

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

    最后,在持久存储(db、session、xml、bag of holding等)中对已经为该表单输入的数据进行查找。创建一组空白表单数据,用在持久存储中找到的任何内容覆盖它,然后用表单范围本身中的任何内容覆盖它。比如:

    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">
    

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

        2
  •  2
  •   Henry    15 年前

    如果您愿意,可以继续使用会话方法。

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

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

    推荐文章