我在以下代码方面遇到问题。我想验证一个地址(城市,邮政编码,州),并对照我们的数据库(在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>
谢谢!
最佳答案
不用设置dataFilter而是只需设置{ dataType : "json" }
即可,而无需使用dataFilter。另外,如果将响应的标头设置为Content-type: application/json
,则jquery将自动将响应作为json处理。
另外,考虑删除异步,因为您已经有处理程序等待响应,并且这可能锁定浏览器并移动您的错误,并完成处理程序以使用jqXHR .done()和.fail()