3


我在使用以下代码时遇到问题。我正在寻找验证地址(城市、邮编、州)并将其与我们数据库中的内容(在 CFC 中调用)进行检查。当我为 Ajax 设置 dataFilter 时,它会进入错误并显示“parseerror”,并且我没有看到字符串 javascript 返回。当我删除 dataFilter 时,在控制台中我看到 javascript 字符串返回,但它总是进入成功设置的“else”。
有谁知道发生了什么?我究竟做错了什么?CFC 确实根据 Fiddler 正确返回(真/假)。

$.ajax({
    type: "get",
    url: "/component/validateLenderAddress.cfc",
    data: {
        method: "validateZipCityState",
        returnFormat: "json",
        zip:$('input[name*="zip"]').val(), 
        city:$('input[name*="city"]').val(), 
        state:$('input[name*="state"]').val()
    },
    async: false,
    cache: false,
    dataFilter: function(data) {
        return $.parseJSON(data);
    },
    success:function(data) {
        if (data) {
            alert('Address Validated');
            return true;
        }
        else {
            alert('Address could not be validated');
            return false;
        }
    },
    error: function(xhr, ajaxOptions, thrownError) {
        alert(ajaxOptions);
    }
});

我的 CFC 是

<cfcomponent output="false" extends="component.Database" hint="validates lender address lendermaint.inc">    
<cffunction name="validateZipCityState" output="false" returnType="struct" access="remote"> 
     <cfargument name="zip" type="string" required="true"> 
     <cfargument name="city" type="string" required="true"> 
     <cfargument name="state" type="string" required="true"> 

     <cfset var local = structNew()>

     <cfquery name="local.zipCodeList" datasource="#getDSN()#" username="#getUsername()#" password="#getPassword()#"> 
          SELECT TOP 1 1 
          FROM ZipCode 
          WHERE zipCode = <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(arguments.zip)#"> 
               AND city = <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(arguments.city)#"> 
               AND stateShort = <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(arguments.state)#"> 
     </cfquery> 

     <cfreturn local.zipCodeList.recordCount EQ 1> 
</cffunction>

谢谢!

4

2 回答 2

2

而不是使用刚刚设置的dataFilter { dataType : "json" },您不需要使用dataFilter。此外,如果您在对Content-type: application/jsonjquery 的响应上设置标头,则会自动将响应处理为 json。

此外,请考虑删除异步,因为您已经有处理程序来等待响应,这可能会锁定浏览器并移动您的错误并完成处理程序以使用 jqXHR .done() 和 .fail()

于 2012-08-27T17:57:27.080 回答
2

我将以下内容放入所有远程组件中:

<cfparam name="url.returnformat" default="json">
<cfparam name="url.queryformat" default="column">

这是我写的一个插件来帮助我做ajax:

!function($, window, undefined) {
    $.ajaxSetup ({
         cache: false // http://stackoverflow.com/questions/168963/stop-jquery-load-response-from-being-cached
    });
    $('#msg').ajaxStart(function() {
      $(this).empty().removeClass('alert alert-info');
    });
    $.fn.myAjax = function(myURL, mySettings) {
        var local = {};
        local.settings = {
            type: 'post',
            dataType: 'json',
            context:this[0]
        };
        local.settings = $.extend({}, local.settings, mySettings);
        local.XHR = $.ajax(myURL,local.settings);
        local.XHR.done(function(result) {
            if (result.MSG) {
                $('#msg').html(result.MSG).addClass('alert alert-error');
            }
        });
        local.XHR.fail(function(A,B,C) {
            $('#msg').html(C).addClass('alert alert-error');
        });
        return local.XHR;
    };
}(jQuery, window);

它允许您做的是在返回时使用“this”:

!function($, window, undefined) {
    var settings = {}
    settings.data = {};
    settings.data.method = 'Save';

    $('input:checkbox').on('change',function() {
        $(this).removeAttr('checked');
        settings.data.xxxID = $(this).val();
        var myPromise = $(this).myAjax('xxx.cfc',settings);
        myPromise.done(function(result) {
            if (!result.MSG) {
                $(this).prop('checked',true); // OK, it's been inserted.
                local.qryxxx = result.qry.DATA;
                local.qryxxx.RecordCount = result.QRY.ROWCOUNT;
                local.qryxxx.ColumnList = result.QRY.COLUMNS;
            }
        });
    });
}(jQuery, window);
于 2012-08-28T01:42:00.327 回答