2011-08-10 89 views
1

我正在向CF定制标记传递一个结构。我想要这个自定义标签的CFM页面将这个结构赋值给一个动态创建的会话变量。创建会话变量时,将其分配给一个简单的值(如数字)时工作正常,但以下面的方式将其分配给结构时会失败。我可以在Coldfusion会话变量中存储结构吗?

<cfset Evaluate("SESSION.myVar#ATTRIBUTES.count# = #ATTRIBUTES.myStruct#")> 

我认为这是可能的,但是当我尝试这样做,我得到一个错误: 复杂的对象类型不能转换为简单的值。

这是怎样的结构创建:

<cfset testStruct = StructNew()> 
<cfset testStruct.something = 2> 

并通过自定义标签传递:

<cf_myTag myStruct="#testStruct#" count="#i#"> 

我认为评估部分被搞乱这里的东西了。

+0

你能告诉我们更多的代码?也许你在哪里创建/设置Struct,以及将它传递给Custom Tag的位置。您如何执行代码可能存在问题。 –

+4

您确定从该cfset行引发错误吗?可以在Session范围中存储结构 – Henry

回答

4

正如雷说,使用数组符号,而不是评估()来创建动态命名会话变量:

<cfset SESSION[ "myVar" & ATTRIBUTES.count ] = ATTRIBUTES.myStruct> 
2

是的,你可以,

只需使用重复的方法

<cfset SESSION.myVar = duplicate(ATTRIBUTES.myStruct) /> 
+2

为什么他需要使用duplicateated()? –

+0

这里的问题是会话变量名称需要是动态的:myVarN不只是myVar。 – CfSimplicity

2

是的,你可以做到以下几点: 注意到我使用一个CFLOCK这里,以避免任何潜在的竞争条件。

<cflock scope="session" throwontimeout="true" timeout="5" type="exclusive"> 
    <cfset session["myVar" & ATTRIBUTES.count] = attributes.myStruct /> 
</cflock> 
1

上面的问题是评估声明。它试图将结构作为字符串中的一个简单值进行蒸发,然后评估字符串。

您可以完全避开。原因是你想要一个动态命名的会话变量?

+0

是的,我将Evaluate用于动态命名的会话变量。这是我知道这样做的唯一途径。你知道我可以如何构造这个来处理结构分配吗? – dtone

+1

使用关联数组表示法。请参阅http://help.adobe.com/zh_CN/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec22c24-7fb2.html和http://help.adobe.com/zh_CN/ColdFusion/9.0/Developing/WSf01dbd23413dda0e-2a6ba8891200fcc8c06-7ffd.html 。 – Leigh

相关问题