2017-09-22 15 views
0

Coldboxのハンドラメソッドへの$ .ajax呼び出しを行っているページがあります。私はこれを何度もやったことがありますが、この現在のプロジェクトでは、ハンドラの開始時にrcスコープをダンプすると、リクエストごとに他の場所に追加する通常のもの以外に何もありません。データはAJAXコールの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); 

} 

私は値が存在していることを確認するために私のデータ構造をダンプしました。

はここでコールドボックス内のハンドラです:ものは奇妙な取得する場所

<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。* stuff以外のものはありません(これはユーザーのクッキーの内容です)。真の成功である私が以前言ったように私はすべてが実行してみましょう場合

<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、=:

は完全を期すため、こちらのモデルです。スローされたエラーはありません。非常に奇妙です。私が議論をダンプすると、そこには何もありません。

私はevent.getHTTPContent()とgetHttpRequestData()の両方をダンプしましたが、送信するデータに関しては空です。

私はMacでCF2016を実行していますが、Luceeを実行しているWindowsサーバで同じコードを実行しましたが、同じ問題が発生します。私のColdboxのバージョンはv4.3.0です。

言及する価値のある別のもの...私は、このプロジェクトで他の呼び出しと同じ問題を抱えていましたが、1つの違いがあります...渡された値のいずれも見えない間に(空白もあります) 、私はそれがモデルを介して実行させると、それは細かい作業。私はまだモデルにそれらをダンプすることはできません。それは奇妙なことを超えています...私はモデルに入る値をparamしますが、実際には引数のスコープをモデルにダンプすると何も表示されないというのは変です。 ColdFusionをやって

21年とコールドボックスをやって8年、これは私が見た奇妙なものです...

ので...多分目の別のセットが役立ちます。私は何か間違っているのですか?私はしなければならない。ありがとう。 :)

+2

ブラウザのF12ツールにはどのような機能がありますか?どのデータがサーバーにPOSTされますか? –

+0

この問題は非常に深刻です。スタックオーバーフローの範囲を超えています。私が解決策を見つけたら、私はそれを投稿します。 – RobG

+0

@BernhardDöblerが尋ねたことをエコー:「POST」されたデータとは何ですか?同僚がこの問題を抱えていたので私は尋ねます。基本的に、彼は 'data.eventid = $( '#eventid')。val()'を持っていましたが、何も投稿されていませんでした。彼のHTMLには、 'id =" eventid "ではなく、' name = "eventid"があるので、 'data'オブジェクトは未定義で、何も提出されていません。 –

答えて

0

Coldbox 4.xは、デフォルトでは、$.ajax呼び出しが送信しているリクエストでJSONペイロード本体をデシリアライズしません。これは今後のリリースで変更されます。一方、インバウンドJSONペイロードを逆シリアル化する必要があります。preHandler or aroundHandler methodを使用することをお勧めします。

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

代わりに(CommandBoxbox install [email protected]をインストールする)、あなたはmultipart/form-dataを使用するために、AJAXリクエストのコンテンツタイプを変更するか、これらの値は、あなたが期待するよう、要求コレクションを移入またはコールドボックス5のBEリリースをオフに開発します

関連する問題