我在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>
任何帮助表示赞赏。
答案 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>
。如果这些都没有帮助,可能会在组件内部发布一些内容将会进一步发挥作用。