2015-01-26 73 views
0

这个问题可能以前曾被问到过,但我已经搜索过高和低,并且找不到答案,所以发布。 。 。在Coldfusion中以编程方式触发事件

我有一个html/javascript页面提交给Coldfusion页面,它会消耗数据(写入数据到数据库),当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> 

谢谢你的任何想法,和道歉提前如果这是太基本。

+3

*我们的环境不允许跨站点脚本*该术语通常[暗含不同的内容](https://en.wikipedia.org/wiki/)跨站点脚本),所以我不知道我明白你为什么不能使用ajax(假设你需要它)。你能澄清吗? – Leigh 2015-01-26 19:09:13

+0

您可能遇到可用性问题。如果你在这一努力中取得成功,用户将如何知道发生了什么? – 2015-01-26 23:51:55

回答

3

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

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

谢谢你,迈克尔。很棒! – SlimJim 2015-01-26 19:28:14

3

这一切都取决于您的代码。你在使用框架吗?你在使用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> 
0

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

由于这基本上与克里斯建议的一样,所以它应该是一个评论。 – Leigh 2015-01-27 04:06:07

1

在常规的冷聚变页面中,按照这种方式进行设置。

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{....}>这样的变量。这样做会将表单的值设置为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> 
相关问题