1

我有一个 Web 表单,它使用该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>

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

4

2 回答 2

3

我的整个答案仅用于教育目的,我强烈建议您使用现有框架而不是重新发明轮子。看看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...)吐出数据的能力,随着您的实施而丢失。

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

注册.cfm

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

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

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

注册.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>
于 2013-11-02T23:14:25.477 回答
2

将 cflocation 标签从您的函数中取出。它无论如何都不会执行,因为它在 cfreturn 标记之后。

此外,将您的表单发布到 .cfm 页面,而不是 .cfc。在该 .cfm 页面中,执行以下操作:

<cfset MyObject = CreateObject(stuff for your cfc goes here)>
<cfset MessageFromFunction = MyObject.registeruser()>
<cfoutput>#MessageFromFunction</cfoutput.
于 2013-11-02T23:19:23.170 回答