通过Json将JavaScript数组传递给ColdFusion CFC

3

我使用这个JavaScript来捕获在Flexigrid中所有选中的复选框,并尝试将这个行ID数组发送到CFC。

function removeCertidao(){
    var allVals = [];
    $("input[id='certidao']:checked").each(function() {
        allVals.push($(this).val());
    });
    if (allVals.length == 0) {
        alert('É necessário escolher ao menos uma certidão.');
        return false;
    } else {
        alert(allVals);
    }
    $.ajax({
        type: "post",
        url: "../../CFC/CRC.cfc",
        data: {
            method: "removeCertidaoCRC",
            numSeqCertidao: allVals,
        },
        dataType: "json",
        success: function(){
            alert('YES');
        },
        error: function(){
            alert('NO');
        }
    });             
 }

下面是CFC。
<cffunction access="remote" name="removeCertidaoCRC" returntype="boolean">
    <cfargument name="numSeqCertidao" type="array" required="true">
<cftry>
    <cftransaction>
        <cfquery datasource="portalCompras">
        UPDATE CRC_CERTIDAO CC
           SET CC.ncdcrcstatus = 0
             WHERE CC.NCDCRCCERTIDAO in <cfqueryparam value="#numSeqCertidao#"
                                                          cfsqltype="cf_sql_integer"
                                                          list="yes">
    </cfquery>
        </cftransaction>
    <cftransaction action="commit" />
    <cfreturn 0>
    <cfcatch type="any">
        <cftransaction action="rollback" />
        <cfreturn #cfcatch.message#>
        </cfcatch>
</cftry>
</cffunction>

当我尝试运行此函数时,我的服务器回应说传递给 removeCertidaoCRC 函数的 NUMSEQCERTIDAO 参数不是数组类型。 在一个我最近加入的延迟项目中,我已经没有更多的选择。
2个回答

4

jQuery会很好地将数组分隔开,例如numSeqCertidao[] = 'val1', numSeqCertidao[] = 'val2' ...,但是ColdFusion处理得很差,不能将其重建为数组。

您的JavaScript没有以JSON格式发送数据,dataType选项是用于响应数据格式的。对于您的需求,我建议您将numSeqCertidao作为列表发送,将CFC方法的参数类型设置为字符串,并将其余部分保留不变,应该可以正常工作。

稍加修改的代码:

function removeCertidao(){
    var allVals = [];
    $("input[id='certidao']:checked").each(function() {
        allVals.push($(this).val());
    });
    if (allVals.length == 0) {
        alert('É necessário escolher ao menos uma certidão.');
        return false;
    } else {
        alert(allVals);
    }
    $.ajax({
        type: "post",
        url: "../../CFC/CRC.cfc",
        data: {
            method: "removeCertidaoCRC",
            numSeqCertidao: allVals.join(),
        },
        dataType: "json",
        success: function(){
            alert('YES');
        },
        error: function(){
            alert('NO');
        }
    });             
 }

<cffunction access="remote" name="removeCertidaoCRC" returntype="boolean">
    <cfargument name="numSeqCertidao" type="string" required="true">
<cftry>
    <cftransaction>
        <cfquery datasource="portalCompras">
        UPDATE CRC_CERTIDAO CC
           SET CC.ncdcrcstatus = 0
             WHERE CC.NCDCRCCERTIDAO in <cfqueryparam value="#numSeqCertidao#"
                                                          cfsqltype="cf_sql_integer"
                                                          list="yes">
    </cfquery>
        </cftransaction>
    <cftransaction action="commit" />
    <cfreturn 0>
    <cfcatch type="any">
        <cftransaction action="rollback" />
        <cfreturn #cfcatch.message#>
        </cfcatch>
</cftry>
</cffunction>

这个运行得非常完美...但是现在ajax中的成功/错误函数不起作用了...它总是失败,但是数据库中的记录已经改变了。 - lagranzotto
可能是因为你期望的是json格式,尝试从ajax调用中删除datatype参数或将其更改为text/html。 - Phil Parsons
非常微妙的差别,我不得不将代码转储到Beyond Compare中才能看到它。.join(),大获全胜,这也解决了我遇到的问题(将JavaScript数组传递给CFC)。 - HPWD

0
你传递给 CFC 的是一个 JavaScript 数组,而不是 ColdFusion 数组。因此,在 CFC 中它看起来像一个字符串。将类型更改为 "string"、"any" 或完全省略即可。

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