假设我有一个具有未确定数值的表单,其名称如下:
PARAM1VCHRNAME
PARAM2VCHRNAME
PARAM3VCHRNAME
...
我希望使用本文所述的引用命名来循环使用这些命名:http://www.bennadel.com/blog/152-dynamic-coldfusion-variables-via-quoted-naming.htm
但为了做到这一点,我需要找到有多少这些项目才能设置我的循环。
我过去遇到过这种情况,我能想到的唯一方法就是将一些javascript写入一个隐藏的字段到表单中,其中有多少项。但这是一个混乱的解决方案,因为如果用户点击后退按钮,它会搞砸。我确信必须有一种方法可以在服务器端执行此操作。
谢谢
@kevin
好的,我写了一个东西来循环表单字段名称并过滤它们。不是我写过的最漂亮的代码。但它的确有效。谢谢你的帮助。
<cfset totalParams = 0>
<cfloop index="i" list="#Form.FieldNames#" delimiters=",">
<cfif LEFT(i,5) eq 'PARAM' AND
RIGHT(i,8) eq 'VCHRNAME' AND
LSParseNumber(Replace(Replace(i, 'PARAM',''),'VCHRNAME','')) gt totalParams>
<cfset totalParams = LSParseNumber(Replace(Replace(i, 'PARAM',''),'VCHRNAME',''))>
</cfif>
</cfloop>
答案 0 :(得分:1)
如果模式为PARAM#i#VCHRNAME
并且序列始终以1开始且连续,则可以尝试连续循环,直到找不到FORM
范围内的字段名称:< / p>
function findLastVchrname()
{
var i=1;
while (structKeyExists(FORM, 'PARAM#i#VCHRNAME'))
i++;
return i;
}
如果系列不连续,那么您需要遍历form.fieldnames
并计算其中有多少人使用reFind()
"^PARAM(\d)+VCHRNAME$"
或者如果您想要花哨,请在form.fieldNames
上尝试listFilter(),使用过滤器函数确定它是否与模式匹配,然后对结果执行listLen()。
如果您使用CF11并且也想要更加特别,请尝试将上述逻辑重构为ListReduce()