簡體   English   中英

如何使用CFINVOKE將結構傳遞給Coldfusion CFC?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM