我想发布以下内容:
<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对象中未定义任何人都知道如何解决这个问题?
答案 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”
这正是我所需要的!