【问题标题】:ColdFusion Link to Previous Page Clears only that Page Session VariablesColdFusion 链接到上一页仅清除该页会话变量
【发布时间】:2015-05-21 22:48:51
【问题描述】:

我有一个这样设置的页面(表单):

<cfif not structKeyExists(session, "checkout")>
    <cflocation url="ownerInfo.cfm" addToken="false">
</cfif>

<cfif not structKeyExists(session.checkout, "vehicle")>
    <cfset session.checkout.vehicle = {ownership=""}

<cfparam name="form.ownership" default="#session.checkout.vehicle.ownership#">

<cfif structKeyExists(form, "submit")>

    <cfset errors = []>
    <cfif not arrayLen(errors)>
        <cfset session.checkout.vehicle = {ownership=form.ownership}
        <cflocation url="ownerCheck.cfm" addToken="false">
    </cfif>
</cfif>

我试图弄清楚如何通过在另一个页面上设置一个链接来重置此表单,当此页面链接回它时,会将所有会话变量重置为 null,从而需要再次填写整个页面。

这是我尝试过的,但没有成功。

<cfif session.checkout.vehicle.ownership != null />
    <cfset session.checkout.vehicle.ownership = null />
</cfif>

我不能使用&lt;cfset StructClear(Session)&gt;,因为我不希望从以前的页面中清除所有会话变量,只希望重置此页面。(不是所有页面或所有会话变量)。对此的任何帮助将不胜感激!

【问题讨论】:

  • 你到底为什么要将表单值放入会话中?查看此内容以更好地了解可用于 CF 的范围。 help.adobe.com/en_US/ColdFusion/9.0/Developing/…
  • 我把它们放在会话变量中,这样我就可以用它们预先填写 pdf 表单
  • 为什么要将用户提交的表单值放入会话中?
  • 所以我可以在其他多个页面上使用它们?
  • 您能否在请求中将它们传递给 pdf 构建器并提取值?

标签: coldfusion


【解决方案1】:

你可以使用 structDelete(structure,key)

<cfif session.checkout.vehicle.ownership != null />
    <cfset structDelete(session.checkout.vehicle,'ownership ')>
</cfif>

【讨论】:

  • 这不起作用 在第 5 行第 42 列发现无效的 CFML 构造。ColdFusion 正在查看以下文本:!
  • 在第 5 行第 42 列发现无效的 CFML 构造。ColdFusion 正在查看以下文本:!
  • 在第 5 行第 42 列发现无效的 CFML 构造。ColdFusion 正在查看以下文本:! CFML 编译器正在处理:从第 5 行第 2 列开始的 cfif 标记。
  • 是删除结构还是将其设置为空?
  • 在第 10 行第 50 列发现无效的 CFML 构造。ColdFusion 正在查看以下文本:/> CFML 编译器正在处理:从第 10 行第 2 列开始的 cfif 标记
【解决方案2】:

如果您想在会话范围内已经存在ownership 键的情况下清除会话范围变量,那么您可以这样做:

<cfif structKeyExists(session.checkout.vehicle, "ownership")>
    <!--- struct key exists so delete it --->
    <cfset structDelete(session.checkout.vehicle, "ownership")>
</cfif>

你实际上可以这样做:

<cfif structKeyExists(session.checkout, "vehicle")>
    <!--- try and delete ownership key might not exist --->
    <cfset structDelete(session.checkout.vehicle, "ownership")>
</cfif>

只要父作用域存在,您就可以尝试删除ownership 键,而无需先检查它是否存在。

如果您想知道密钥是否存在,那么 structDelete 接受第三个布尔参数,因此如果存在则返回 true,如果不存在则返回 false。

<cfset didExist = structDelete(session.checkout.vehicle, "ownership", true)>

如果不是表单 (POST) 提交,则另一种解决问题的方法是重置表单。所以你会这样做:

<cfif structKeyExists(form, "submit")>
   <!--- form has been submitted store values in session and redirect... -->
<cfelse>
   <!--- form not submitted so clear the session vars... --->
</cfif>

【讨论】:

  • 有什么特殊的地方需要我插入这个吗?还是可以直接插在最上面?
  • 这是第一次打破
  • 它不会比这个页面更进一步,因为它在进入下一页之前让所有权为空
  • 也许它不应该删除结构而只是将变量重置为空?
  • Zane Z 在没有看到完整代码的情况下很难给出建议。 ColdFusion 中的 Null 并不真正存在(它可以但通常最好忘记 CF 中的 null)。所以你需要删除该键而不是将其设置为空。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
相关资源
最近更新 更多