以编程方式触发 Coldfusion 中的事件

Programmatically trigger event in Coldfusion

本文关键字:事件 Coldfusion 编程 方式触      更新时间:2023-09-26
我有一个提交到 Coldfusion 页面的 html/javascript 页面,

该页面使用数据(将数据写入数据库),当 Coldfusion 页面完成后,我希望它重新提交回原始的 html/javascript 页面。简而言之,我希望 Coldfusion 页面以编程方式触发提交事件。我该怎么做?注意:我不能使用 Ajax,因为我们的环境不允许跨站点脚本。

HTML/JS (MainForm.html):

<form name="myForm" action="processStuff.cfm">
    <input type="submit" name="btnSubmit">
</form>

CF:

<cfif IsDefined("Form.btnSubmit")>
  . . . Do a bunch of stuff, then submit back to MainForm.html . . . 
</cfif>

也许您想要的是重定向回表单?如果是这样,只需使用 cflocation .

<cfif isDefined("form.btnSubmit")>
  . . . Do a bunch of stuff, then submit back to MainForm.html . . .
  <cflocation url="MainForm.html" />
</cfif>

这实际上完全取决于您的代码。您使用的是框架吗?您是否正在使用氟氯化碳。您是否使用纯过程代码?等。

但为了简单起见,假设您正在编写过程代码,并将模型和视图合并在一起。

只需在同一.用于显示表单的 CFM 文件。然后,您的表单将提交回同一页面。

我的表格.cfm

<html><body>
<cfif structKeyExists(form, "btnSubmit")>
    <cfquery>
        INSERT INTO formResults(name)
        VALUES(<cfqueryparam value="#form.name#" cfsqltype="CF_SQL_VARCHAR">)
    </cfquery>
</cfif>
<form method="POST">
    Name: <input type="text" name="name">
    <input type="submit" name="btnSubmit">
</form>
</body></html>

在常规冷聚变页面中,以这种方式设置。

形式.cfm

<cfif isDefined("form.submitb") and form.submitb is "yes">
  ... submit form
<cfelse>
  ... show form ...
</cfif>

你可以这样做

其他页面.cfm

<cfset form.submitb = "yes" />
<cfset form.firstname = "John" />
<cfset form.lastname = "Doe" />
<cfinclude template="form.cfm">

如果您使用的是最新版本的 CF/Railo,您可以...

<cfset StructAppend(form, {submitb = "yes", firstname = "John", lastname = "Doe"}, false) />

其中false是 OverWriteFlag 的值,它指定如果发生冲突,第二个结构的值是否会覆盖第一个结构的值。

请注意,我们不会将 StructAppend 的值分配给像 <cfset form = StructAppend{....}> 这样的变量。这样做会将表单的值设置为 true ,这将是不好的。其他一些功能(如ArrayAppend())以相同的方式工作。

我们也可以说

<cfset form = {....}>

但您可能不想擦除和覆盖 otherpage.cfm 的表单数据。

最后,提交表单时,Cold Fusion 会生成一个名为 form.fieldnames 的字段,其中包含表单中所有表单元素的字段名称。以编程方式添加到窗体范围时不会生成此值。

<cfset form.newfield = "test" />newfield添加到表单范围,但不会将newfield添加到 form.fieldnames 列表中。解决方法是(如果需要)

<cfset ffnames = StructKeyList(form) />
<cfif listfind(ffnames,"fieldnames") />
  <cfset ffnames = ListDeleteAt(ffnames,ListFind(ffnames,"fieldnames")) />
</cfif>

有很多方法可以做到这一点。我喜欢根据它是get还是post来分离行为。

<cfif cgi.request_method EQ "post">
    <cfquery>
       INSERT INTO formResults(name)
       VALUES(<cfqueryparam value="#form.name#" cfsqltype="CF_SQL_VARCHAR">)
    </cfquery>
</cfif>
<form method="POST">
   Name: <input type="text" name="name">
   <input type="submit">
</form>