使用jQuery将数组传递给ColdFusion组件

4

在我开始之前,我必须承认我对jquery非常陌生,事实上,在3个月前我还没有任何javascript的背景。

我想要完成的目标是将一个我在jquery中可用的信息数组传递到一个.cfc文件中,以便处理该信息。

以下是我的jquery代码:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script type="text/javascript" src="jquery.json.min.js"></script>
<script type="text/javascript">
  $(function() {
    var mydata = {data:[1,2,3,4,5]};
                      
    $.post('test.cfc', {method:"handleArray", returnFormat:"plain", argumentCollection:   $.toJSON(mydata)}, function(res) {
    alert($.trim(res));
    });
  });
</script>

这是我在五年前Stephen Duncan Jr的帖子中找到的一段代码。

以下是cold fusion代码:

<cfcomponent>

<cffunction name="handleArray" access="remote" returnType="numeric">
<cfargument name="data" type="array" required="true">

  <cfquery name = "qTest" datasource="#REQUEST.dsn#" username="#REQUEST.dsu#" password="#REQUEST.dsp#"> 
    INSERT INTO test
      (value1, value2, value3, value4, value5)
    VALUES (
      <cfqueryparam cfsqltype="cf_sql_integer" value="#handleArray[1]#">,
      <cfqueryparam cfsqltype="cf_sql_integer" value="#handleArray[2]#">,
      <cfqueryparam cfsqltype="cf_sql_integer" value="#handleArray[3]#">,
      <cfqueryparam cfsqltype="cf_sql_integer" value="#handleArray[4]#">,
      <cfqueryparam cfsqltype="cf_sql_integer" value="#handleArray[5]#">)
    </cfquery>

<cfreturn arrayLen(arguments.data)>
</cffunction>

</cfcomponent>

这段代码当然只是一个测试,目的是让它正常工作。但是我需要将大约40个变量传递给CFC。
非常感谢能提供任何信息,特别是任何解释为什么结果有效的东西。

4
具体的问题或疑问是什么? - charlietfl
1
代码无法运行,我不知道为什么。JQuery中的警告从未触发,我必须假设这就是CFC未被运行的原因。 - Tim Howey
1
先从简单的事情开始。我在变量创建之前、创建之后、.post函数内部以及函数之后都放置了一个警报。除了.post函数内部的警报之外,其他所有警报都触发了。我还在cfc文件中使用了cfabort标签,但它从未到达任何一个标签。现在,问题完全出现在.post行中,但我不知道它有什么问题。 - Tim Howey
使用适当的调试工具,如Firebug等,它可以使调试ajax变得更加容易。您可以查看请求是否已发送,检查响应等等。 非常新的jquery 首先,您是否先验证了组件在CF中是否正常工作?我之所以问这个问题,是因为一个常见的错误是在确保服务器端代码实际上能够正常工作之前插入jQuery,这会使问题更难以调试... - Leigh
2
忘记 AJAX 方面的事情,如果您只是在浏览器地址栏中直接调用 CFC 方法呢? - Adam Cameron
显示剩余4条评论
1个回答

2

@TimHowey,你的jQuery post方法似乎有问题。我认为你需要做以下操作:

<script type="text/javascript" src="jquery.json.min.js"></script>
<script type="text/javascript">
  $(function() {
      var mydata = "[1,2,3]";
      $.post('test.cfc', {
          method: "handleArray",
          returnFormat: "plain",
          data: mydata
      }, function(res) {
          alert("ok");
      });
  });
</script>

您正在使用POST方法,因此所有内容都将在form范围内发送。在您的CFC中,您只需要像这样反序列化参数:

    <cffunction name="handleArray" access="remote" returnType="numeric">
        <cfargument name="data" type="any" required="true">
        <cfset var getArray = DeserializeJSON(arguments.data)/>
        <cfset var qTest = "">

        <cfquery name = "qTest" datasource="#REQUEST.dsn#" username="#REQUEST.dsu#" password="#REQUEST.dsp#"> 
            INSERT INTO test
            (value1, value2, value3)
            VALUES (
                <cfqueryparam cfsqltype="cf_sql_integer" value="#getArray[1]#">,
                <cfqueryparam cfsqltype="cf_sql_integer" value="#getArray[2]#">,
                <cfqueryparam cfsqltype="cf_sql_integer" value="#getArray[3]#">
          )
        </cfquery>

        <cfreturn arrayLen(getArray)>
    </cffunction>

编辑

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script type="text/javascript" src="jquery.json.min.js"></script>
<script type="text/javascript">
  $(function() {
      var mydata = '[1,"keshav",3]';
      $.post('test.cfc', {
          method: "handleArray",
          returnFormat: "plain",
          data: mydata
      }, function(res) {
          alert("ok");
      });
  });
</script>

好的,这是我在解决问题上看到的第一点线索。我可以在Firebug中看到信息被转储了,但它的格式并不像我预期的那样。所以现在我很困惑如何将它从那里传递到cfquery中,但至少我有一些东西可以使用。 - Tim Howey
@TimHowey 更新了我的答案,请查看 jQuery 和 CF 代码。 - Keshav jha
我似乎在Firebug中遇到了一个错误。"500您已尝试将类型为class java.lang.String的标量变量作为具有成员的结构进行引用。" - Tim Howey
2
我已经以表单作用域中的JSON格式发送了数据,以便可以反序列化并将其转换为数组。因为你不能访问或发送JavaScript数组到CF,你需要将其作为JSON发送,然后在服务器端进行转换。 - Keshav jha
@TimHowey - 另外,你为什么一定要传递一个数组呢?命名参数是直观的,并且在 CF 端具有更好的错误处理支持。 - Leigh
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接