我有一个返回结构的远程CFC。使用cfajaxproxy调用。我希望返回的JSON是有序的,即先进入结构,再进入JSON对象。但是,返回的JSON的顺序是混乱的。
下面是远程函数。
<cfcomponent displayname="validation" hint="">
<cffunction name="validateForm" displayname="validateForm" hint="" access="remote" verifyClient="yes" returntype="struct">
<cfargument name="formVals" type="struct" required="yes">
<cfset errors = StructNew()>
<cfif formVals.project neq "project">
<cfset errors["project"] = "Invalid project name." />
</cfif>
<cfif Len(formVals.description) eq 0>
<cfset errors["description"] = "Please enter a description." />
</cfif>
<cfif StructIsEmpty(errors)>
<cfset errors["message"]["type"] = "success">
<cfset errors["message"]["text"] = "Client and server-side validation passed successfully.">
<cfset errors["areErrors"] = false>
<cfelse>
<cfset errors["message"]["type"] = "validation">
<cfset errors["message"]["text"] = "Please fix the errors, and resubmit.">
<cfset errors["areErrors"] = true>
</cfif>
<cfreturn errors />
</cffunction>
</cfcomponent>这是我在表单页面顶部设置的cfajaxproxy。
<cfajaxproxy cfc="validation" jsclassname="validation">下面是对我的表单的onSubmit处理程序中的远程函数的调用。
var v = new validation();
v.setHTTPMethod("POST");
var errors = v.validateForm(o);下面是在post请求中发送给函数的数据(上面的o变量)。
{"formVals":{"project":"","description":""}}下面是函数返回的JSON响应。
{"message":{"text":"Please fix the errors, and resubmit.","type":"validation"},"description":"Please enter a description.","project":"Invalid project name.","areErrors":true}我希望响应的顺序与创建结构的顺序相同,如下所示。
{"project":"Invalid project name.","description":"Please enter a description.","message":{"text":"Please fix the errors, and resubmit.","type":"validation"},"areErrors":true}这样,当我迭代响应时,我可以将焦点设置到第一个包含错误的表单域。
var focusSet = false;
$.each(errors, function(key, val){
//alert(key + ': ' + val);
if(key != 'message' && key != 'areErrors') {
var fi = $('#' + key).parents('.formItem').filter(':first');
fi.addClass("inError");
fi.find('.err').filter(':first').html(val);
if(!focusSet) {
$('#' + key).focus();
focusSet = true;
}
}
});现在,这将焦点放在表单的第二个字段description中,而不是放在项目字段中。
发布于 2011-09-28 00:33:18
ColdFusion结构的键永远不会以任何特定的顺序存储。然而,我的found one post展示了如何创建一个java LinkedHashMap (它是CF结构下的java )来以特定的顺序存储和检索关键字。
<cfset pets = CreateObject("java", "java.util.LinkedHashMap").init()>
<cfscript>
pets["Cat Name"] = "Leo";
pets["Dog Name"] = "Meatball";
pets["Fish Name"] = "Lil Fish";
pets["Bird Name"] = "PePe";
pets["Snake Name"] = "Sizzle";
</cfscript>
<cfloop collection="#pets#" item="key" >
<cfoutput>
#key#: #pets[key]#<br/>
</cfoutput>
</cfloop>结构编辑:的解决方案(数组而不是结构)可能要简单得多。
发布于 2011-09-28 00:32:54
您不能(轻松地)控制返回的JSON结构数据的顺序,除非您手动构建字符串来返回该数据。如果你必须依赖于一个订单,那么你需要在一个数组而不是一个结构中返回错误。您甚至可以返回错误结构的数组,CF将保持正确的数组顺序。
我会像这样返回你的数据:
<cfcomponent displayname="validation" hint="">
<cffunction name="validateForm" displayname="validateForm" hint="" access="remote" verifyClient="yes" returntype="struct">
<cfargument name="formVals" type="struct" required="yes">
<cfset var retVal = StructNew() />
<cfset var tempError = StructNew() />
<cfset retVal.errors = ArrayNew(1) />
<cfif formVals.project neq "project">
<cfset tempError["key"] = "project" />
<cfset tempError["message"] = "Invalid project name." />
<cfset ArrayAppend(retVal.errors, Duplicate(tempError)) />
</cfif>
<cfif Len(formVals.description) eq 0>
<cfset tempError["key"] = "description" />
<cfset tempError["message"] = "Please enter a description." />
<cfset ArrayAppend(retVal.errors, Duplicate(tempError)) />
</cfif>
<cfif ArrayIsEmpty(retVal.Errors)>
<cfset retVal["message"]["type"] = "success" />
<cfset retVal["message"]["text"] = "Client and server-side validation passed successfully.">
<cfset retVal["areErrors"] = false>
<cfelse>
<cfset retVal["message"]["type"] = "validation">
<cfset retVal["message"]["text"] = "Please fix the errors, and resubmit.">
<cfset retVal["areErrors"] = true>
</cfif>
<cfreturn retVal />
</cffunction>
</cfcomponent>这将为您提供一个单独的错误数组来循环,而不是在处理错误的同时处理基本的message和areErrors键。将它们完全拆分到一个单独的实体中,这样您就可以更轻松地在客户端遍历它们。
发布于 2011-09-28 00:34:55
struct在CFML中不是有序的(它只是一个类似于Hashmap的集合)。
如果需要有序结构,请使用
struct function orderedStructNew()
{
return createObject("java","java.util.LinkedHashMap").init();
}https://stackoverflow.com/questions/7572422
复制相似问题