之前好像某舊版ColdFusion可以直接前後端用矩陣做傳遞,但是年代久遠已經忘記作法了,試了幾次沒做出來就變通改用另一個方式來抓取資料。
test.cfm - 前端有待輸入的姓名跟成績若干個:欄位以 name_流水號 及 rank_流水號 命名
<CFOUTPUT>
<form action="test2.cfm" method="post">
<CFSET sno =0>
<CFLOOP from="1" to="5" index="iii">
<CFSET sno = sno + 1 >
姓名#sno#: <INPUT type="text" name="name_#sno#">
成績#sno#: <INPUT type="text" name="rank_#sno#"><bR>
</CFLOOP>
<INPUT type="hidden" name="sno" value="#sno#">
<INPUT type="submit">
</form>
</CFOUTPUT>
test2.cfm - 後端承接時用將欄位分別抓取下來丟到Array:
<CFOUTPUT>
<!--- 設定接收變數Array --->
<cfset getname=ArrayNew(1)>
<cfset getrank=ArrayNew(1)>
<CFLOOP from="1" to="#form.sno#" index="iii">
<cfset getname[iii] = "">
<cfset getrank[iii] = "">
</CFLOOP>
<!--- 如果有Form變數存在, 則進行分析, 將各資料放入對應的Array中 --->
<cfif isdefined('fieldnames') and fieldnames is not ''>
<cfloop from="1" to="#listlen(fieldnames)#" index="ano">
<!--- 利用底線_ 來區隔名稱與流水號 --->
<CFSET wordFirst = ListFirst(listgetat(fieldnames,ano) , "_")>
<CFSET wordNumber = ListLast(listgetat(fieldnames,ano) , "_")>
<!--- 判定變數名, 也過濾掉非動態產生的Form變數 --->
<CFIF wordFirst IS "name">
<cfset getname[wordNumber] = #trim(evaluate(listgetat(fieldnames,ano)))#>
<CFELSEIF wordFirst IS "rank">
<cfset getrank[wordNumber] = #trim(evaluate(listgetat(fieldnames,ano)))#>
</CFIF>
</cfloop>
</cfif>
<!--- 結果輸出 --->
<TABLE border="1">
<TR>
<TD>姓名</TD>
<TD>成績</TD>
</TR>
<CFLOOP from="1" to="#form.sno#" index="iii">
<TR>
<TD>#getname[iii]#</TD>
<TD>#getrank[iii]#</TD>
</TR>
</CFLOOP>
</TABLE>
</CFOUTPUT>
輸出畫面:
test.cfm
test2.cfm
這樣前端的欄位不管怎麼長,用JavaScript產生也好、從資料庫撈出不同的資料筆數也好,只要是固定的欄位名稱加上流水號,後端都能抓到。
沒有留言:
張貼留言