如何使用CFINVOKE将结构传递给Coldfusion CFC?

时间:2012-07-18 07:30:30

标签: coldfusion struct cfc 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 ,我只能让它工作,这很痛苦,因为我传递了大量数据。

问题: 如何使用 argumentCollection 来实现此功能。

即使我像这样CFINVOKE:

 <cfinvoke component="mailer_user" argumentcollection="#User.data#" method="say_hi"></cfinvoke>

它仍然没有做任何事情。我正在设置cfinvoke之前和之后的输出标志,以及进入和退出的“say_hi”函数内部。我只是在CFINVOKE之前得到了旗帜。

旁注:这一切都是通过AJAX完成的,如果我的CFC在某处出现错误,我只会获得成功=“false”。我只在系统上远程工作,所以我不能在CFADMIN中设置AJAX调试

4 个答案:

答案 0 :(得分:3)

当我输入上面的评论时,我发现问题可能是什么。

您正在将结构传递给您的函数。您将具有名称,电子邮件,等等的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" /> 

当您将集合作为argumentCollection传递时,您应该执行argumentCollection =“#user#”,以便userData部分与函数中的cfargument匹配。

清除泥土?

答案 1 :(得分:2)

我认为你应该通过编写

来保持cfscript风格
// call mailer
mailUser = createObject("component", "mailer_user");    // or new mailer_user(); for CF9+
mailUser.say_hi(User.data);

这应该有效,如果没有,它就是你代码中的其他地方。尝试查看错误日志。

答案 2 :(得分:1)

您应该将变量映射到您传递的数据,然后发送结构没有问题。这样做吧

<cfset objMailer = createObject("component","mailer_user") />

<cfset objMailer.say_hi(userData:user.data)/>

这甚至在CF7中也有效。

答案 3 :(得分:0)

确定。我的邮件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> 
    ...

也许其他人可以使用该代码段。