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

Programmatically trigger event in Coldfusion

我有一个提交到 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>

这完全取决于您的代码。你在使用框架吗?你在使用 CFC 吗?您使用的是纯过程代码吗?等等

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

只需在用于显示表单的同一个 .CFM 文件中添加条件逻辑即可。然后您的表单将提交回同一页面。

myForm.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>

有很多方法可以做到这一点。我喜欢根据行为是 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>

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

form.cfm

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

你可以做到这一点

otherpage.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{....}> 这样的变量。这样做会将 form 的值设置为 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>