[英]How to pass a struct to Coldfusion CFC using CFINVOKE?
我有一個CFC文件,用於處理我從應用程序發送的所有電子郵件(使用Coldfusion8)。
我正在使用CFINVOKE來調用此CFC中的各個函數,並傳遞了一個帶有所有用戶數據的結構,如下所示:
<cfscript>
var User.data = {};
User.data.name = "John Doe";
User.data.email = "john@doe.com";
...
</cfscript>
// call mailer
<cfinvoke component="mailer_user" method="say_hi">
<cfinvokeargument name="userData" value="#User.data#">
</cfinvoke>
在我的mailer.cfc中
<cffunction name="say_hi" access="public" output="false">
<cfargument name="userData" type="struct" required="true" />
....
由於某種原因,該操作現在失敗了,並且僅當我作為cfargument單獨傳遞字段時,我才能使它正常工作,這很痛苦,因為我正在傳遞大量數據。
問題 :如何使用argumentsCollection使它正常工作。
即使我像這樣CFINVOKE:
<cfinvoke component="mailer_user" argumentcollection="#User.data#" method="say_hi"></cfinvoke>
它仍然無能為力。 我在cfinvoke之前和之后以及在“ say_hi”函數進出內部設置輸出標志。 我只在CFINVOKE之前得到標志。
旁注:這一切都是通過AJAX完成的,如果我的CFC在某處有錯誤,我只會找回success =“ false”。 我只能在系統上遠程工作,因此無法在CFADMIN中設置AJAX調試
當我鍵入上面的評論時,我想到了可能是什么問題。
您正在將結構傳遞給函數。 您在該結構中傳遞具有名稱,電子郵件,等等的User.data作為鍵。 這些鍵需要匹配函數中的參數
<cffunction name="say_hi" access="public" output="false">
<cfargument name="name" type="struct" required="true" />
<cfargument name="email" type="struct" required="true" />
<cfargument name="blah" type="struct" required="true" />
<cfargument name="etc" type="struct" required="true" />
如果要將結構作為參數傳遞,則需要使用user.userData作為用戶數據的結構,並且函數應為
<cffunction name="say_hi" access="public" output="false">
<cfargument name="userData" type="struct" required="true" />
當您將集合作為argumentsCollection傳遞時,您應該執行argumentsCollection =“#user#”,以便userData部分與函數中的cfargument相匹配。
像泥一樣清澈?
我認為您應該通過寫作保持cfscript風格
// call mailer
mailUser = createObject("component", "mailer_user"); // or new mailer_user(); for CF9+
mailUser.say_hi(User.data);
那應該行得通,如果沒有,那就在代碼中的其他地方。 嘗試查看錯誤日志。
您應該將變量映射到傳遞的數據,然后發送結構沒有問題。 這樣做
<cfset objMailer = createObject("component","mailer_user") />
<cfset objMailer.say_hi(userData:user.data)/>
即使在CF7中也可以使用。
好。 郵件CFC內有一個錯字,其中有一個帶有“ ##”的變量。 就像我的電子郵件中的內容一樣,它沒有被注意到...
因此,您可以使用以下命令傳遞一個結構好:
<cfinvoke component="mailer_user" method="say_hi">
<cfinvokeargument name="userData" value="#User.userdata#">
</cfinvoke>
然后像這樣在您的調用函數中抓取它:
<cffunction name="say_hi" access="public" output="false" hint="">
<cfargument name="userData" type="struct" required="true" hint="user data passed" />
<cfscript>
var internalInfo = "";
var User = {};
User.userdata = userData;
</cfscript>
...
也許其他人可以使用該代碼段。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.