我有一个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 component="mailer_user" argumentcollection="#User.data#" method="say_hi"></cfinvoke>还是一事无成。我在cfinvoke之前和之后设置输出标志,以及在"say_hi“函数中输入和输出。我只会在CFINVOKE之前拿到国旗。
附带注意:这一切都是通过AJAX完成的,如果我的CFC在某个地方有错误,我只能返回success="false“。我只在系统上远程工作,所以无法在CFADMIN中设置AJAX调试
发布于 2012-07-18 08:02:47
当我输入上面的评论时,我意识到问题可能是什么。
您正在将一个结构传递给您的函数。您通过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匹配。
像泥一样干净?
发布于 2012-07-18 07:50:05
我认为你应该保持cfscript风格
// call mailer
mailUser = createObject("component", "mailer_user"); // or new mailer_user(); for CF9+
mailUser.say_hi(User.data);如果它不起作用,它就会在代码中的其他地方。尝试查看错误日志。
发布于 2012-07-19 07:14:42
您应该将变量映射到您传递的数据,然后发送结构就没有问题了。这样做
<cfset objMailer = createObject("component","mailer_user") /><cfset objMailer.say_hi(userData:user.data)/>
即使在CF7中也是如此。
https://stackoverflow.com/questions/11536363
复制相似问题