在coldfusion中发布多维数组

时间:2012-11-07 05:46:31

标签: html forms post coldfusion

我想发布以下内容:

<input name="answer[1][]" value="Answer 1 question 1"/> <input name="answer[1][]" value="Answer 2 question 1"/>

<input name="answer[2][]" value="Answer 1 question 2"/> <input name="answer[2][]" value="Answer 2 question 2"/>

不幸的是,发布时收到了一个coldfusion错误:

表达式元素ANSWER在类型为[Ljava.lang.String;。

的Java对象中未定义

任何人都知道如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

你不能只调用一个表单字段“answers [1] []”并希望ColdFusion能够解决这个字符串的问题 - 因为所有的“答案[1] []”是:一个字符串 - 应该是被解释为数组引用。 CF不能那样工作。

即使 像这样工作,你也需要在数组符号的第二维中加一个值:answers[1][]是无效的CFML。

当变量看起来与您期望的不同时,第一个故障排除步骤是将变量转储出去(或者在这种情况下,form范围外):

<cfdump var="#form#">

这很快就会发现你没有数组,你在表单范围内有两个变量:一个名为answer[1][],另一个名为answer[2][](其中每个变量都被称为) 。 CF中的点符号规则不允许将其引用为form.answer[1][],您需要将其引用为form["answer[1][]"]

从ColdFusion 10开始,通过在Application.cfc中设置它,可以在表单范围中将表格变量设置为与数组相同的形式变量:

 this.sameformfieldsasarray = true

然而,显然(?)仅适用于单维数组。

如果你想要一个多维数组,你必须在表单范围内使用循环和变量名检查,以查看每个值应该进入的数组/维度。

答案 1 :(得分:1)

可能发生的事情是ColdFusion正在尝试使用键“answer [1] []”创建FORM Scope,并将其评估为ColdFusion / Java的无效变量名称表达式。根据您的目的,您可能需要将输入字段重命名为answer_Q_A,即answer_1_1,answer_1_2,answer_2_1,然后从那里处理成数组。

<cfset answerArray = arrayNew(2)>

<cfloop collection="#form#" item="thisField">
     <cfif left(thisField,6) eq 'ANSWER' and listLen(thisField,'_') eq 3>
         <cfset answerArray[listGetAt(thisField,2,'_')][listGetAt(thisField,3,'_')] = form[thisField]>
     </cfif>
</cfloop>

答案 2 :(得分:1)

感谢Adam和Ben的回答,他们非常乐于助人并驱使我解决这个难题。 我经常在php编码,其中使用name =“xxx []”在$ _POST变量中创建一个数组。 现在Coldfusion会抛出一个错误,因为不需要添加“[]”。

我做的是: <input name="answer_1" value="Answer 1 question 1"/> <input name="answer_1" value="Answer 2 question 1"/>

<input name="answer_2" value="Answer 1 question 2"/> <input name="answer_2" value="Answer 2 question 2"/>

Coldfusion将返回2个结构“answer_1”和“answer_2”,其中包含2个逗号分隔的字符串。

但如果我的字符串包含逗号,例如:答案1,问题1

当我尝试转换列表中的字符串时,这会给我带来问题。

使用方法getPageContext()。getRequest()。getParameterMap()Codfusion转换数组中逗号分隔的字符串:

struct answer_1将包含一个数组:

array [1] =“回答1个问题1” array [2] =“回答1个问题2”

这正是我所需要的!