如何显示从表单</cfreturn>调用的CFC的<cfreturn>输出

时间:2013-11-02 23:07:50

标签: coldfusion coldfusion-10

我有一个网页表单,它使用action属性来调用这样的CFC:

<form action="mycfc.cfc?method=registeruser">

CFC处理表单中的数据,然后我希望它返回一个变量,告诉用户他们的表单提交是否成功。

所以在我的CFC中,我把它放在:

<cffunction name="registeruser" access="remote" hint="registers a new user" returnformat="JSON">
... PROCESSES FORM HERE THEN...    
<cfset Msg = 'Success'>
<cfreturn Msg>
<cflocation url = "/registrationpage.cfm">
</cffunction>

如何在registrationpage.cfm页面中显示Msg变量?我的输出设置为JSON所以我想我必须DeSerialize但我不知道如何实际引用/访问该方法的输出。

2 个答案:

答案 0 :(得分:3)

我的答案仅限于教育目的,我强烈建议您使用现有框架,而不是重新发明Wheels。请查看Picking a ColdFusion MVC Framework

您可以将值存储在session范围内。许多框架使用闪存概念来实现它,它是一个临时内存(实现为结构),在访问时会破坏成员。

看看http://cfwheels.org/docs/1-1/chapter/using-the-flash它是否可以直接实现执行此操作的API。

客户端代码可能看起来像(取决于您的实现):

<cfset session.flash.set('importantMsg', 'some important msg')>
<cflocation ...>

然后从另一页开始:

<cfif session.flash.has('importantMsg')>
    <!--- The following line should also destroy the 'importantMsg' key --->
    #session.flash.get('importantMsg')#
</cfif>

这是一个实现示例(并非实现不是线程安全的):

FlashMemory.cfc

<cfcomponent>
    <cffunction name="init" returntype="FlashMemory">
        <cfset variables.instance = {flash = {}}>
    </cffunction>

    <cffunction name="set" returntype="void">
        <cfargument name="key" type="string" required="true">
        <cfargument name="value" type="any" required="true">

        <cfset variables.instance.flash[arguments.key] = arguments.value>
    </cffunction>

    <cffunction name="get" returntype="any">
        <cfargument name="key" type="string" required="true">
        <cfset var v = variables.instance.flash[arguments.key]>
        <cfset structDelete(variables.instance.flash, arguments.key)>
        <cfreturn v>
    </cffunction>

    <cffunction name="has" returntype="boolean">
        <cfargument name="key" type="string" required="true">
        <cfreturn structKeyExists(variables.instance.flash, arguments.key)>
    </cffunction>
</cfcomponent>

onSessionStart

<cfset session.flash = new FlashMemory()>

另请注意,在您的情况下,您的远程CFC方法不应该返回任何内容。您将使用闪存来传递数据。这意味着当该方法完成它的工作后,您可以简单地重定向客户端。

在这种特殊情况下,你可能不应该使用远程CFC方法:

我从未真正使用远程CFC方法作为有状态Web服务。远程CFC方法的各种优点,例如它们以多种数据交换格式(JSON,WDDX ......)吐出数据的能力在您的实现中就会丢失。

您可以简单地执行以下操作:

registration.cfm

<cfset errors = session.flash.get('registrationErrors')>

<cfif arrayLen(errors)>
    <!--- Display errors --->
</cfif>

<form method="post" action="register.cfm">
...
</form>

register.cfm

<cfset registration = new Registration(argumentcollection = form)>
<cfset validator = new RegistrationValidator(registration)>

<cfif validator.validate()>
    <cfset application.userService.register(registration)>

    <!--- You can also redirect to a page that represents the correct state --->
    <cflocation url="registered.cfm" addtoken="no">
<cfelse>
    <!--- Store the errors collection in the flash memory --->
    <cfset session.flash.set('registrationErrors', validator.errors())>

    <!--- Redirect to the page the user came from --->
    <cflocation url="#cgi.http_referer#" addtoken="no">
</cfif>

答案 1 :(得分:2)

从你的功能中取出cflocation标签。它无论如何都不会执行,因为它位于cfreturn标记之后。

另外,将表单发布到.cfm页面,而不是.cfc。从.cfm页面开始,执行以下操作:

<cfset MyObject = CreateObject(stuff for your cfc goes here)>
<cfset MessageFromFunction = MyObject.registeruser()>
<cfoutput>#MessageFromFunction</cfoutput.