coldfusion“String index超出范围”错误与argumentcollection

时间:2010-12-13 05:15:24

标签: coldfusion

我在cfinvoke参数集合中传递表单变量:

<cfinvoke component="#application.componentPath#.account" method="updateServices" argumentcollection="#form#" />

但我一直收到错误:“字符串索引超出范围:0 null” 我已经将它缩小到与argumentcollection中传递的表单变量有关的内容。当我执行<cfdump var="#form#">时,它看起来像这样:

form - struct

EMAIL_1 wendy 
EMAIL_2 [empty string] 
EMAIL_3 [empty string] 
EMAIL_4 [empty string] 
FIELDNAMES EMAIL_1,EMAIL_2,EMAIL_3,EMAIL_4, 

(我无法对结构进行截图,因此你不得不想象它。)

如果我从cfinvoke中丢失了argumentcollection,则错误消失。

接收CFC:

<cffunction name="updateServices" access="public" output="true" returntype="void">

     <!--- deliberately emptied to see if it was anything inside the cfc causing the issue--->

</cffunction>

任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

我唯一看到的可能是错误的是:

component="#application.componentPath#.account"

尝试将其硬编码到您知道存在的cfc路径(com.whatever.account),如果它可以工作,那么您就知道导致问题的原因(动态组件表达式)。

答案 1 :(得分:0)

我们无法看到您的组件中发生了什么,所以这是猜测。当您将argumentcollection<cfinvoke>一起使用并传入结构时,结构将在组件中分解,就好像它的元素已作为单独的参数传递一样。所以如果你有:

<cfset foo.this = 1>
<cfset foo.that = 2>

<cfinvoke...argumentcollection="#foo#">

...然后在你将拥有的组件内:

arguments.this; // 1
arguments.that; // 2

您不会arguments.foo.this,也不会foo.this。因此,如果您想传入表单范围并将其封装在组件中,您可以尝试这样做:

<cfinvoke...formscope="#form#">

然后,在调用的组件方法中,您将能够使用:

arguments.formscope.EMAIL_1
arguments.formscope.EMAIL_2
arguments.formscope.FIELDNAMES

...等。您也可以查看<cfinvokeargument>。如果这些都没有帮助,可能会在组件内部发布一些内容将会进一步发挥作用。