2010-12-13 80 views
0

我傳遞表單變量的參數CFINVOKE集合:ColdFusion的「字符串索引超出範圍」錯誤與argumentcollection

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

但我不斷收到錯誤:「字符串索引超出範圍:0零」 我已經把它縮小到與在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, 

(我不能做結構的截圖,所以你必須想象它。)

如果我從失去argumentcollection cfinvoke,錯誤消失。

接收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

我們無法看到組件中發生了什麼,所以這是一個猜測。當您使用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>。如果這些都沒有幫助,那麼可能會發布一些關於組件內部發生的事情將會進一步闡明。

+0

謝謝,formcope的人做了詭計,但我必須在cfc中使用ARGUMENTS.formscope.EMAIL_1來引用它,而不是僅僅使用函數無法識別的formscope.EMAIL_1。 – user460114 2010-12-13 21:22:31

+0

是的,你是對的 - 上面例子中的'formcope'成爲參數範圍的成員;它已被更新。很高興你能解決它。 – 2010-12-13 22:44:41

0

我看可能是錯的唯一的一點是:

component="#application.componentPath#.account" 

嘗試硬編碼,要你知道存在(com.whatever.account)一個CFC路徑,如果再工作,再你知道是什麼導致了問題(動態組件表達式)。