jrd*_*ans 10 coldfusion jquery
我有一个像这样的ColdFusion CFC函数:
<cffunction access="remote" name="getResults"
returntype="struct"
returnformat="JSON"
output="no">
<cfargument name="q" required="true" type="array" />
...
</cffunction>
Run Code Online (Sandbox Code Playgroud)
如何从jQuery调用此函数?jQuery的数组编码都不会让ColdFusion将值视为数组.
如果传递"q = a&q = b"(与jQuery.ajaxSettings.traditional = true一样),函数将获得字符串"a,b",而不是数组.虽然在逗号上拆分似乎是可能的,但如果其中一个"q"值包含逗号,它将无法工作.另外,理想情况下,服务器端的功能不应该知道如何通过线路序列化数据的问题,并且应该继续接收数组.
如果传递"q [] = a&q [] = b"(jQuery默认值),它将不会映射到"q"参数.如果您尝试将"q"参数的名称更改为"q []",则由于参数名称无效,CFC将出错.
首先要知道的是jQuery Ajax请求不对数组进行编码,因此您可以使用其他东西来编码数据(这是jquery.JSON.js来自下面引用的地方).因此,通过在那里找到JSON编码,我通过使用cfajaxproxy并研究它在Firebug中生成的URL来找出正确的语法:
HTTP://localhost/remote.cfc方法= getResults&argumentCollection =%7B%22Q%22%3A%5B1 2C2%%5D%7D
是的"argumentcollection"方法是正确的,并且带有对数组的引用的变量"q"在那里.
我使用以下代码作为测试床:
remote.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>
Run Code Online (Sandbox Code Playgroud)
remote.cfm,了解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>
Run Code Online (Sandbox Code Playgroud)
remote.html使用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>
Run Code Online (Sandbox Code Playgroud)
调查这个问题,我发现了以下博客文章: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
});
Run Code Online (Sandbox Code Playgroud)