AJAX的最佳方式是提交具有未知数量元素的表单

时间:2014-01-03 21:32:55

标签: jquery coldfusion coldfusion-10

这是一个逻辑/最佳实践问题,而不是纯编程,所以如果它违反规则就道歉。

我正在使用JQuery的AJAX功能提交我的一些表单:

$.ajax({
      type: "POST",
      url: form-actions.cfc?method=NewSubmission,   
      data: $('#form1').serialize(),
      success: function (result) {
         // alert user of success
      }
      error: function (result) {
         // alert user of success
      }
 });

表单被提交给ColdFusion组件,该组件获取已经序列化的表单的所有参数,并在插入SQL数据库之前将它们放入变量中。这是一个例子:

<cfcomponent>
<cffunction name="NewSubmission" access="remote" hint="Saves or Submits New Submission" returntype="JSON">
  <cfargument name="CustomerID" type="numeric" />
  <cfargument name="Name" type="any" />
  <cfargument name="DOB" type="any" />
     <cfquery>
      ...the cfarguments automatically map to the key:value pairs 
      submitted by JQuery and insert into SQL here...
     </cfquery>
</cffunction>
</cfcomponent>

主要问题:我现在有一个表格可以包含0-infinity <input type="file" name="upload1" />元素,因为它们是由用户点击“添加文件”按钮动态生成的。每次单击此按钮时,都会生成一个带有新输入字段的新<li>

因为我不知道该人想要上传多少文件,所以我似乎无法设置CFC来处理它们。我正在考虑这个选项来处理这种情况:

  1. 在JQuery中创建一个变量,如下所示:var numoffiles = $('#FileUploader ul li').size();计算我在FileUploader div中有多少<li>个元素。然而,这必须是用户想要上传的文件数量。然后我必须在表单提交中将此号码传递给CFC,以便它动态创建适当数量的CFARGUMENTS来处理上传的文件名。它必须创建这些CFARGUMENTS才能映射键:值对。我不确定它是否能做到这一点。
  2. 有人可以建议另一种方式或更好的方法吗?我想我在某个地方错过了一个技巧,因为我的解决方案看起来有点原始。

1 个答案:

答案 0 :(得分:5)

不要担心创建一个计数器,这样做......

<!---this cfset is for demo purposes, you will leave this line out--->    
<cfset form.fieldnames="someOtherFieldsYouMayHave,upload1,upload2,upload3,upload4,upload5">
<cfloop list="#form.fieldnames#" index="i">
  <cfif left(i,6) eq "upload">
    <cfoutput>processing #i#...<br/></cfoutput>
  </cfif>
</cfloop>
output:
processing upload1...
processing upload2...
processing upload3...
processing upload4...
processing upload5...

注意:由于您说它可能是无限的,您应该记下Cf10中的新设置:“POST请求参数的最大数量”。您可能必须从默认值中提取此数字,我认为是100.如果您低于ColdFusion 10,则可以在其中一个xml文件中编辑此设置。您可以在此处阅读:http://helpx.adobe.com/coldfusion/kb/coldfusion-security-hotfix.html