Javascript 数据不会从AJAX调用进入Coldbox处理程序

Javascript 数据不会从AJAX调用进入Coldbox处理程序,javascript,jquery,ajax,coldfusion,coldbox,Javascript,Jquery,Ajax,Coldfusion,Coldbox,我有一个页面正在对Coldbox中的处理程序方法进行$.ajax调用。我已经做过很多次了,但是在当前的项目中,不止一次,如果我在处理程序的开头转储rc范围,那么除了我在每个请求的其他地方添加的常规内容之外,没有其他内容 更奇怪的是,如果我不中断执行流,它将从处理程序进入模型并通过查询返回并返回成功,即使不存在任何必需的值。如果我在模型中转储arguments作用域,则也不存在任何内容。这听起来像是一个coldbox bug或是一个错误配置或是别的什么,但在这一点上,我希望这是我做错了什么 首先,

我有一个页面正在对Coldbox中的处理程序方法进行$.ajax调用。我已经做过很多次了,但是在当前的项目中,不止一次,如果我在处理程序的开头转储rc范围,那么除了我在每个请求的其他地方添加的常规内容之外,没有其他内容

更奇怪的是,如果我不中断执行流,它将从处理程序进入模型并通过查询返回并返回成功,即使不存在任何必需的值。如果我在模型中转储arguments作用域,则也不存在任何内容。这听起来像是一个coldbox bug或是一个错误配置或是别的什么,但在这一点上,我希望这是我做错了什么

首先,这里是AJAX调用:

function deleteAgendaItem(agendaid, eventid) {

var data = {},
    url = "<cfoutput>#event.buildLink('agenda.delete')#</cfoutput>";

data.eventid = eventid;
data.agendaid = agendaid;

var xhr = $.ajax({type: "post", data: data, url: url, async: false, dataType : "json", contentType: "application/json; charset=utf-8"});

return JSON.parse(xhr.responseText);

}
函数deleteAgendaItem(agendaid,eventid){
变量数据={},
url=“#event.buildLink('agenda.delete')#”;
data.eventid=eventid;
data.agendaid=agendaid;
var xhr=$.ajax({type:“post”,data:data,url:url,async:false,dataType:“json”,contentType:“application/json;charset=utf-8”});
返回JSON.parse(xhr.responseText);
}
我已经转储了数据结构,以确保值在其中

以下是coldbox中的处理程序:

<cffunction name="delete">
    <cfargument name="event">
    <cfargument name="rc">
    <cfargument name="prc">

    <cfscript>
    param rc.agendaid = 0;
    param rc.eventid = 0;
    var modelObj = getModel('agenda');
    var data = modelObj.delete(agendaid=rc.agendaid, eventid=rc.eventid, clientid=rc.userInfo.currentClientID);

    event.renderData(format="json", data=SerializeJSON(data));
    </cfscript>

</cffunction>

参数rc.agendaid=0;
参数rc.eventid=0;
var modelObj=getModel(“议程”);
var data=modelObj.delete(agendaid=rc.agendaid,eventid=rc.eventid,clientid=rc.userInfo.currentClientID);
renderData(format=“json”,data=SerializeJSON(data));
这就是事情变得奇怪的地方。如果我转储rc,除了添加到prehandler中的rc.userInfo.*内容(它是用户cookie的内容)之外,它没有任何内容

为完整起见,以下是模型:

<cffunction name="delete" output="false" access="public" returntype="struct">
    <cfargument name="agendaid" type="numeric" required="yes">
    <cfargument name="eventid" type="numeric" required="yes">
    <cfargument name="clientid" type="numeric" required="yes">

    <cfset var ret = StructNew()>
    <cfset ret.success = true>

    <cfquery datasource="#variables.dsn#">
        update agenda
        set active = 0
        where agendaid = <cfqueryparam value="#arguments.agendaid#" cfsqltype="cf_sql_integer">
        and eventid = <cfqueryparam value="#arguments.eventid#" cfsqltype="cf_sql_integer">
        and clientid = <cfqueryparam value="#arguments.clientid#" cfsqltype="cf_sql_integer">
    </cfquery>

    <cfreturn ret>

</cffunction>

更新议程
设置为活动=0
其中agendaid=
和eventid=
和clientid=
正如我前面所说的,如果我让一切运行,它将通过模型传递并返回ret,这就是success=true。没有抛出错误。很奇怪。如果我抛弃论点,那里面就什么都没有了

我已经转储了event.getHTTPContent()和getHttpRequestData(),它们在我发送的数据中也是空的

我在Mac上运行CF2016,但我在运行Lucee的Windows服务器上运行了相同的代码,同样的问题也发生了。我的Coldbox版本是v4.3.0

另一件值得一提的事。。。我在这个项目的其他调用中也遇到了同样的问题,但有一个不同。。。虽然我看不到传入的任何值(它们也是空的),但如果让它在模型中运行,它就可以正常工作。我仍然无法将它们转储到模型中。这太离奇了……请注意,虽然我对进入模型的值进行了参数化处理,但当我在模型中转储参数范围时,没有任何东西出现,这一事实是奇怪的

21年的ColdFusion和8年的Coldbox这是我见过的最奇怪的事情


所以。。。也许另一双眼睛会有帮助。我做错什么了吗?我一定是。谢谢。:)

默认情况下,Coldbox 4.x不会对请求中的JSON有效负载正文进行反序列化,这是您的
$.ajax
调用正在发送的。这将在即将发布的5.0版本中进行更改。不过,与此同时,您将需要反序列化入站JSON有效负载——最好使用


或者,您可以将ajax请求的内容类型更改为使用
multipart/form data
,这些值将填充请求集合,正如您所期望的那样,或者根据Coldbox 5(install
box install)的发行版进行开发coldbox@be
)默认情况下,Coldbox 4.x不会对请求中的JSON有效负载正文进行反序列化,这是您的
$.ajax
调用正在发送的。这将在即将发布的5.0版本中进行更改。不过,与此同时,您将需要反序列化入站JSON有效负载——最好使用

或者,您可以将ajax请求的内容类型更改为使用
multipart/form data
,这些值将填充请求集合,正如您所期望的那样,或者根据Coldbox 5(install
box install)的发行版进行开发coldbox@be

使用(至少)Coldbox 5.2,您必须做两件事:

  • 添加一个Coldbox配置设置jsonPayloadToRC=true
  • 确保发送标题:Content Type=application/json
  • 在深入研究isJSON()的核心Coldbox代码时,我发现了这个设置。新站点的CommandBox设置未添加该设置

    一旦我完成了上述两项工作,我就能够将我所有的邮递员设置更改为application/json和内容类型的“raw”,我的RC转储看起来就像以前一样。请记住,如果您忘记在变量前面加上“rc”,它将在非JSON模式下工作,因为老式方法也会在URL/表单中包含您的值。用这种方法,你不会明白。(无论如何,您应该确定变量的范围。)

    使用(至少)Coldbox 5.2,您必须做两件事:

  • 添加一个Coldbox配置设置jsonPayloadToRC=true
  • 确保发送标题:Content Type=application/json
  • 在深入研究isJSON()的核心Coldbox代码时,我发现了这个设置。新站点的CommandBox设置未添加该设置


    一旦我完成了上述两项工作,我就能够将我所有的邮递员设置更改为application/json和内容类型的“raw”,我的RC转储看起来就像以前一样。请记住,如果您忘记在变量前面加上“rc”,它将在非JSON模式下工作,因为老式方法也会在URL/表单中包含您的值。用这种方法,你不会明白。(无论如何,您应该确定变量的范围。)

    浏览器的F12工具显示了什么?什么数据被发布到服务器?这个问题已经变得非常深刻;
    if( isJSON( event.getHTTPContent() ) ){
        structAppend( rc, event.getHTTPContent( json=true ), true );
    }