数据无法通过AJAX调用

时间:2017-09-22 16:08:34

标签: javascript jquery ajax coldfusion coldbox

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

更奇怪的是,如果我不中断执行流程,它将从处理程序进入模型并通过查询返回并返回SUCCESS,即使没有所需的值。如果我在模型中转储参数范围,那么也没有。这听起来像是冷箱错误或配置错误或其他什么,但此时我希望这是我做错了。

所以,首先,这是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);

}

我已经转储了我的数据结构,以确保值在那里。

这是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,除了在预处理程序中添加的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>

就像我之前说过的,如果我让一切都运行,它将通过模型传递并返回ret,这是success = true。没有错误抛出。很奇怪。如果我抛弃争论,那就没有了。

我已经转储了event.getHTTPContent()和getHttpRequestData(),当涉及到我发送的数据时,它们也是空的。

我在Mac上运行CF2016,但是我在运行Lucee的Windows服务器上运行相同的代码并且出现同样的问题。我的Coldbox版本是v4.3.0。

另一件值得一提的事情......我在这个项目中遇到了与其他调用相同的问题,但有一点不同......虽然我看不到任何传入的值(它们也是空白的),如果我让它通过模型,它工作很精细。我仍然无法将它们转储到模型中。这是奇怪的...请注意,虽然我确实参与了模型中的值,但是当我将参数范围转储到模型中并且没有任何内容出现时这一事实很奇怪。

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

所以...也许另一组眼睛会有所帮助。难道我做错了什么?我必须。谢谢。 :)

2 个答案:

答案 0 :(得分:1)

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

if( isJSON( event.getHTTPContent() ) ){
    structAppend( rc, event.getHTTPContent( json=true ), true );
}

或者,您可以更改ajax请求的内容类型以使用multipart/form-data,这些值将填充请求集合,正如您所期望的那样或开发Coldbox 5的BE版本({{3}安装box install coldbox@be

答案 1 :(得分:0)

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

  1. 添加一个jsonPayloadToRC = true的Coldbox配置设置
  2. 确保发送标头:Content-Type = application / json

在挖掘isJSON()的核心Coldbox代码时,我发现了该设置。新站点的CommandBox设置不会添加设置。

完成上述两项操作后,就可以将所有Postman设置更改为application / json和“ raw”的内容类型,并且RC转储看起来就像以前一样。请记住,如果您忘记了在变量前加上“ rc。”前缀,那么它将在非JSON模式下工作,因为旧的方法将在URL中包含您的值。 / FORM也是如此。使用这种方法,您将无法获得。 (无论如何,您应该确定变量的范围。)