代码之家  ›  专栏  ›  技术社区  ›  jrduncans

如何使用jQuery通过ajax将数组变量发送到ColdFusion CFC远程方法?

  •  10
  • jrduncans  · 技术社区  · 15 年前

    我有一个ColdFusion CFC函数,如下所示:

    <cffunction access="remote" name="getResults"
        returntype="struct"
        returnformat="JSON"
        output="no">
    
        <cfargument name="q" required="true" type="array" />
    
    ...
    </cffunction>
    

    如何从jQuery调用此函数?jQuery的两种数组编码形式都不会得到ColdFusion来将值视为数组。

    如果传递“q=a&q=b”(与jQuery.ajaxSettings.traditional=true类似),函数将获得字符串“a,b”,而不是数组。虽然在逗号上拆分似乎是一种可能性,但如果其中一个“q”值包含逗号,它将不起作用。另外,理想情况下,服务器端的函数不必知道如何通过连接序列化数据的问题,并且应该继续接受数组。

    如果传递“q[]=a&q[]=b”(jQuery默认值),它将不会映射到“q”参数。如果试图将“q”参数的名称更改为“q[]”,则CFC将由于参数名称无效而出错。

    3 回复  |  直到 15 年前
        1
  •  8
  •   orangepips 111111    15 年前

    首先要知道的是 jQuery Ajax requests do not encode arrays so have you to use something else to encode the data (这是jquery.JSON.js来自下面引用的地方)。因此,在那里找到了一个JSON编码,然后通过使用 cfajaxproxy 研究它在Firebug中生成的URL:

    http://localhost/remote.cfc?method=getResults&argumentCollection=%7B%22q%22%3A%5B1%2C2%5D%7D

    是的,“argumentcollection”方法是正确的,其中包含引用数组的变量“q”。

    远程.cfc

    <cfcomponent output="false">
        <cffunction access="remote" name="getResults"
            returntype="struct"
            returnformat="JSON"
            output="no">
    
            <cfargument name="q" required="true" type="array" />
    
            <cfreturn {a=1,b=2}>
        </cffunction>
    </cfcomponent>
    

    查看cfajaxproxy如何生成其url

    <cfajaxproxy cfc="Remote" jsclassname="Remote">
    <cfoutput>
    <script language="javascript" type="text/javascript">
    var oRemote = new Remote();
    alert(oRemote.getResults([1,2]));
    </script>
    </cfoutput>
    

    使用jQuery

    <script language="javascript" src="http://code.jquery.com/jquery-1.4.3.min.js"></script>
    <script language="javascript" src="jquery.JSON.js"></script>
    <script language="javascript" type="text/javascript">
    var argumentCollection = { q: [1,2] };
    $.ajax({
        url:        'remote.cfc',
        data:       {
            method: 'getResults',
            argumentCollection: $.JSON.encode(argumentCollection)
        },
        success:    function(response) {
            alert(response);
        },
        dataType:   'json'
    });
    
    </script>
    
        2
  •  6
  •   jrduncans    15 年前

    http://www.coldfusionjedi.com/index.cfm/2010/3/23/Using-jQuery-to-post-an-array-to-a-ColdFusion-Component -这建议将数组编码为一个JSON字符串,然后在CFC方法中反序列化它,不幸的是需要CFC函数必须更改才能处理JSON。

    通过查看使用cfajaxproxy时进行的HTTP调用,我发现可以将单个argumentCollection参数作为JSON字符串发送来调用远程CFC方法。

    因此,客户端调用如下所示(使用jquery json插件进行序列化):

    var params = {q: ['a', '1,2,3']};
    
    $.getJSON('My.cfc?method=getResults', {argumentCollection: $.toJSON(params)}, function(data) {
    // handle data
    });
    
        3
  •  -1
  •   Daniel Mendel    15 年前

    ListToArray 转换并(如有必要)重新编码逗号?