2011-03-11 26 views
1

我想找到将下面的html提交给cfc函数的最佳方法。in coldfusion 9,如何在文本中正确提交包含“,”的表单文本输入数组?

<form action="test.cfc"> 
    <input type="hidden" name="method" value="save"> 
    <input type="text" name="mytext[]" value="f,oo"> 
    <input type="text" name="mytext[]" value="bar"> 
<input type="submit"> 
</form> 

test.cfc文件内容:

<cfcomponent displayname="test"> 
     <cffunction name="init"> 
     <cfreturn this> 
    </cffunction> 
    <cffunction name="save" output="false" returnformat="JSON" access="remote"> 
     <cfargument name="mytext" type="string" required="true"> 
     <!--- ***comments*** 
     i want to do this: 
     <cfloop list="arguments.mytext" index="curRowValue"> 
      <cfquery blah blah...> 
    insert into fooBar (stuff) values (curRowValue) 
</cfquery 
     </cfloop> 
     ---> 
     <cfreturn arguments> 
    </cffunction> 
    </cfcomponent> 

的'test.save()函数将返回此JSON在我的设置{mytext:"f,oo,bar"}这将插入3行,而不是2,如果我注释掉插入码。混淆用户输入的文本和ColdFusion的标准列表定界符的正确方法是什么?

+0

这个问题是造成这个问题: http://stackoverflow.com/questions/5266522/on-keypress-event-how-do-i-change-a-to-a – DefyGravity 2011-03-11 20:26:09

回答

1

在处理程序中,如果您访问ColdFusion窗体作用域本身,您已经看到CF会将同名表单域值减少到一个单一的键值对,其值与逗号无关地混合在一起。

但是,您还可以访问原始请求数据并解析出键值对 - 无论是否存在键名冲突,每个键都是不同的。这里有一个快速的方法来循环经历的“实际”的网友值:

arFormscope = gethttprequestdata().content.split('&'); 
for(i=1; i<=arraylen(arFormscope); i++){ 
    arElement = arFormscope[i].split('='); 
    key = urldecode(arElement[1]); 
    value = urldecode(arElement[2]); 
    do_something_with(key, value); // <-- your logic here 
            // value == f,oo on first pass 
            // value == bar on second pass 
} 

有了您的样本数据,你会通过回路的每个mytext[]表单字段得到一通。

作为一个方面说明,您还可以通过提交按钮本身的循环访问。

+0

我用替换了,并且返回的JSON中的“content”字符串为空。在窗体提交中调用一个cfc函数要求cfc函数具有'access = remote'安全性。我相信Coldfusion正在解析表单并重新请求与“参数”范围的函数。 – DefyGravity 2011-03-11 22:03:18

+0

我认为你的想法会起作用,如果我改变了表单行为后,像改变''form action =“fooBar.cfm”>他的回答 – DefyGravity 2011-03-13 00:45:22

+0

中提到的marc esher这样的cfm页面''我可以像你的解决方案一样循环建议。不是一个'

解决方案,但是可以直接用于我们需要的东西。 – DefyGravity 2011-03-14 19:44:49

1

布赖恩Kotek的FormUtilities是完美的。我无法想象回到不使用这个我所建立的所有表单:http://www.briankotek.com/blog/index.cfm/2007/9/4/Implicit-Creation-of-Arrays-and-Structures-from-Form-Fields

+0

+1好主意,是一项体面的工作。然而,我需要将test.save()中的'arguments'结构传递给它还能工作吗? – DefyGravity 2011-03-11 21:44:35

+1

您可以将save()更改为一个结构,即。然后,在您的操作页面上,这将是一个.cfm页面而不是一个.cfc,您可以执行 2011-03-11 23:12:02

+0

marc,这个解决方案的工作原理和我喜欢它,但需要对现有的,旧的,尘土飞扬,可怕的代码进行大量重构。与Ken的答案一起向后兼容 – DefyGravity 2011-03-14 19:43:54

相关问题