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

更奇怪的是,如果我不中断执行流程,即使那里没有任何必需的值,它也会从处理程序进入模型并通过查询返回并返回成功。如果我将参数范围转储到模型中,则也没有任何内容。这听起来像是Coldbox错误或配置错误之类的东西,但在这一点上,我希望这是我做错的事情。

因此,首先,这是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。

值得一提的另一件事是...我在该项目的其他调用中也遇到了同样的问题,只是有所不同...虽然我看不到传入的任何值(它们也为空),它通过模型“ IT WORKS FINE”运行。我仍然也无法将它们转储到模型中。这简直是​​不可思议……请注意,尽管我对进入模型的值进行了参数设置,但是当我将参数范围转储到模型中却什么也没有出现的事实是很奇怪的。

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

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

最佳答案

默认情况下,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版本(CommandBox install box install coldbox@be)。

07-25 20:46