【问题标题】:Working with Form Arrays in ColdFusion?在 ColdFusion 中使用表单数组?
【发布时间】:2011-02-24 19:56:39
【问题描述】:

我不知道如何在 ColdFusion 9 中处理这个问题,我提交了一个带有元素复选框的表单 (POST),称为 items[]。

当我执行<cfdump var="#form#" /> 没有问题时,我会得到所有显示正确名称的项目,例如items[],例如:

struct 
ITEMS[] 13,14  
FIELDNAMES ITEMS[] 

但是执行<cfdump var="#form.items[]#" /> 会导致错误。如何访问 CF9 字段值?以某种方式循环它?

我似乎无法对数组做任何事情来将 id 从中取出?想法?我有点难过,ColdFusion 并不是最容易在网上找到示例/参考的语言。 ;)

有没有正确的方法来处理这个问题?我需要从那里取出 ID,以便我可以参考在表单中检查了哪些行,以便我可以采取后续行动。

谢谢!

【问题讨论】:

    标签: html arrays coldfusion


    【解决方案1】:

    ColdFusion 中没有表单数组。最后有'[]' 并不能使它成为一个数组。您可以像这样从表单范围访问复选框值:

    FORM["ITEMS[]"]
    

    由于'[]',点符号不起作用。见:http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec22c24-7fb2.html

    复选框中的值只是逗号分隔的值,在 ColdFusion 中是一个列表

    要遍历它,请使用 cfloop list=:

    <cfoutput>
      <cfloop index="i" list="#FORM['ITEMS[]']#">    
        #i#
      </cfloop>
    </cfoutput>
    

    要将列表转换为数组,请使用ListToArray()。有listGetAt()之类的列表函数,但如果你做大量随机访问,最好先将列表转换为数组。

    想想,我有点难过 Coldfusion 不是最简单的语言 查找示例/参考 净;)

    【讨论】:

    • FWIW,PHP 将以“[]”命名的表单元素解释为数组。 CF 将同名的表单元素视为逗号分隔的列表。
    • 如果您的输入包含逗号怎么办?!有没有办法摆脱它?
    • @rkingon 不确定你在问什么。请提出一个新问题。
    • 来自表单数组输入的列表(即:ITEMS[])返回逗号分隔。因此,如果您的输入恰好包含逗号,CF 会将其读取为分隔符。我最终只是用 js 在我的表单字段名称上附加了 _1 _2 _3 并有一个带有总行数的隐藏输入,然后在冷融合中循环
    • @Henry 我相信您所指的选项是this.sameformfieldsasarray=true; 但这最终是有缺陷的。 Source
    【解决方案2】:

    我强烈推荐 Brian Kotek 的“Form Utils”,例如:http://www.briankotek.com/blog/index.cfm/2007/9/4/Implicit-Creation-of-Arrays-and-Structures-from-Form-Fields

    我在我构建的每个应用程序中都使用它,因为在表单提交端使用数组和结构比使用列表更可取,imo。

    【讨论】:

    • Form Utils 非常有价值,也是我在 CFML 中处理表单数组的首选方式。这是一个更新版本的 Form Utils 的链接,旨在与较新版本的 ColdFusion 一起使用:github.com/jmohler1970/FormUtils
    【解决方案3】:

    另见第二个答案here。它描述了如何从表单上具有多个实例的字段中检索值作为数组。我不得不说,我已经在 CFML 工作了很多年,我自己还没有这样做,或者在我开发过的任何应用程序中看到它完成。我认为这只是因为避免使用逗号要简单得多,但是如果您不能或不想以这种方式解决它,这是可能的。

    【讨论】:

      【解决方案4】:

      另外,请注意,在 ajax 世界中,如果您对 post 请求的整个正文进行 json 编码,而不是单个表单字段,则它可以是任意数据结构,可以在服务器上轻松检索。下面的 sn-p 显示了如何从 ColdFusion 获取它。我不确定其他语言,但几乎可以肯定。

      要使用 jQuery 发送类似的帖子,请在将数据传递给 jQuery 之前对数据进行 JSON.stringify,如 herehere 所述。

      如果您正在构建自己的 ajax 请求,则重点是:

      xhr.send(JSON.stringify(data));
      

      要在服务器端访问该数据,此 ColdFusion 示例首先查找那种 json 编码的帖子正文,然后在表单字段“输入”中查找带有 json 数据的帖子,然后在具有相同名称的 url 字段中查找。在所有情况下,生成的数据都会被反序列化并分配给本地变量“input”,然后您可以将其放入请求范围、“rc”或您的代码期望的任何内容中。

      if (Find('application/json', cgi.content_type))
      {
          input = ToString(GetHttpRequestData().content);
          if (IsJSON(input))
              input = DeserializeJSON(input);
      }
      else if (StructKeyExists(form, 'input') and IsJSON(form.input))
          input = DeserializeJSON(form.input);
      else if (StructKeyExists(url, 'input') and IsJSON(url.input))
          input = DeserializeJSON(url.input);
      

      【讨论】:

        【解决方案5】:

        如果你列出的是 ID,它可以正常工作,但如果你有一个带逗号的数组,那么你就卡住了。

        在这种情况下,您可以使用 Java 方法 getParameterValues。

        <cfdump var="#getPageContext().getRequest().getParameterValues('ITEMS')#">
        

        这将为您提供一个可以使用的标准 CF 数组。

        【讨论】:

        【解决方案6】:

        对于 ColdFusion 10+,如果您在 Application.cfc 中使用 sameformfieldsasarray 设置,如下所示:

        component {
            this.name = "testingzone2c";
            this.sameformfieldsasarray=true;
        }
        

        您将获得一个具有相同名称的实际表单字段数组。

        ColdFusion 10 Missing Feature - Form Fields and Arrays

        【讨论】:

          【解决方案7】:

          我建议您从名称中删除“[]”,因为它不允许在另一个答案中提到的点表示法。当多个表单元素包含相同的name 属性时,浏览器将连接所有提交表单时将值转换为逗号分隔的字符串。幸运的是,ColdFusion 有许多将分隔字符串视为列表的函数。您可以将&lt;cfloop&gt; 与这些函数一起使用来使用列表。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-04-07
            • 2016-01-06
            • 1970-01-01
            • 2013-04-09
            • 2016-06-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多