2015-01-26 72 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> 
相關問題