以编程方式触发 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>
我有一个提交到 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>