我有一个网页表单,它使用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但我不知道如何实际引用/访问该方法的输出。
答案 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.