2011-07-15 10 views
0

現在、ColdFusionで非同期送信を確認しようとしています。私はいつもこれに問題があります。私は、リモートのCFCに提出して何らかの応答を返すためのフォームを持っています。 (最終的には、このフォームは、ドラフトのようなドラフトを持っています...)私はフォームとCFCの各パートを設定する方法を知っています。私の問題はそれらを接続している!これについての同様のポストがありましたが、私は少なくとも十分な情報を提供していません。すべてのフォームスコープをCFCに非同期に送信

フォーム:

<cfform action = "/cfc/request.cfc?method=updateRequest" method = "post" name = "requestForm" id = "requestForm" enctype="multipart/form-data"> 
    ........<!-- Fields redacted --> 

</cfform> 

CFCメソッド(これは単なるテストだった):

<cffunction name="updateRequest" access="remote" returntype="numeric"> 
     <cfargument name="form" type="struct" required="yes"> 
     <cfset var status = 0> 

     <cfreturn status> 
</cffunction> 

注:私のCFC関数がなどなどなど、リモートに設定されている...

私はcfcに投稿するべき私のフォームを持っていますが、実際にはになります。私はこれを望んでいない。 ColdFusionでajaxを使用しようとすると、私はとても不満を感じています。私はjQueryを使用して提出するだけです。私はそれをjQueryできます...しかし、私は構造体にフィールドを取得する方法を知らない。 (このフォームは大きくなるでしょう...)フォーム情報をColdFusionまたはjQueryで構造体として送信する方法を見たいと思います。私は、フォームフィールド名を保持できるようにしたい。

誰かが正しい方向に私を向けることができたとしても、それは素晴らしいことでしょう。私はいつかこれについてGOODチュートリアルを見つけようとしましたが、それもできませんでした。

+0

jQueryのserialize()メソッドをフォーム自体に使用して、まっすぐなjQueryで行うことはできません。 http://api.jquery.com/serialize/ – charliegriefer

+0

フォーム情報が構造体として送信されるのはなぜですか? serialize()を使用する場合は、キーと値のペア文字列を渡します。 updateRequest()メソッドを変更して文字列を受け入れ、内部的に文字列を操作することはできませんか?ちょっと、キー/値のペアから構造体を作成するプライベートメソッドに渡してください。そして、これで動作するCF構造体が得られました。 – charliegriefer

+0

さて、私はファイルのアップロードを処理できるようにしたい...私はあなたがフォームフィールド名が必要だったという印象を受けていました...私はどこかでそれを行う方法がありました...私はあなたの提案を試してみます。 – Bri

答えて

1

あなたが構造としてフォームコントロールを渡したい場合は、私が最初にJSONとしてフォーム要素を直列化しようと、間違っている可能性が、これはあなたがしようとしているものだと思いますその文字列をWebサービスに渡します。 Webサービスから、DeserializeJSON()を使用して構造体に戻すことができます。

<script> 
/* function prototype code modified from here: http://api.jquery.com/serializeArray/#comment-130159436 */ 
(function($){ 
$.fn.serializeJSON=function() { 
var json = []; 
jQuery.map($(this).serializeArray(), function(n, i){ 
json.push('"' + escape(n['name']) + '":"' + escape(n['value']) + '"'); 
}); 
return '{' + json.join(',') + '}'; 
}; 
})(jQuery); 

// make the request to your webservice 
$.post('myComponent.cfc?method=updateRequest', { formJSON: $("#requestForm").serializeJSON()}, function() { /* handle response here. */ }) 
</script> 

あなたのCFCに続いて、そのように引数を変更します:ここでは、これに近づく必要がありますいくつかのコードです

<cffunction name="updateRequest" access="remote" returntype="numeric"> 
    <cfargument name="formJSON" type="string" required="yes"> 
    <cfset var formStruct = DeserializeJSON(arguments.formJSON)> 
    <cfset var status = 0> 

    <cfreturn status> 
</cffunction> 
+1

答えに感謝します!私の問題は、アップロードの処理方法と非同期フォームを提出する方法のケースにエスカレートしました。 – Bri

0

は私が何を探していることは、このようなタグや何かだと思う:あなたが実際にあなたがやったとしてURLでアクションを指定しない

<cfajaxproxy bind="cfc:mycfc.myfunction(arg1={myform:myfield1},arg2={myform:myfield2})" /> 

、あなたは、Ajaxを通してそれを呼び出しますプロキシ

私は私が知っている:)

+0

私はそれをやってみましょう:) – Bri

+0

私はちょうどこれを終了すると思います。私は正直なところ、このタグ私は、アクションを設定するだけで、cfcに非同期で提出する方法を見たことがあると誓っていましたが、今どこにいてもそれを見つけることができません... – Bri

1

使用ColdFusion.Ajax.submitForm機能

<html> 
<head> 
<!--- The cfajaximport tag is required for the submitForm function to work 
      because the page does not have any Ajax-based tags. ---> 
<cfajaximport> 

<script> 
    function submitForm() { 
     ColdFusion.Ajax.submitForm('myform', 'asyncFormHandler.cfm', callback, 
      errorHandler); 
    } 

    function callback(text) 
    { 
     alert("Callback: " + text); 
    } 

    function errorHandler(code, msg) 
    { 
     alert("Error!!! " + code + ": " + msg); 
    } 
</script> 

</head> 
<body> 

<cfform name="myform"> 
    <cfinput name="mytext1"><br /> 
    <cfinput name="mytext2"> 
</cfform> 

<a href="javascript:submitForm()">Submit form</a> 

http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec22c24-7a01.html#WS71B55A73-D08F-47c7-B062-0543793B83A5

+0

良い考えですが、ドキュメントフィールドにはファイルフィールドを送信しません。 ://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WS0ef8c004658c1089-6262c847120f1a3b244-7ffe.html – Leigh

+0

@Leighそのためには、HTML5のXmlHttpRequest 2が必要です。http://css.dzone.com/news/file-upload -and-progress – Henry

+0

@Henry jQueryフォームプラグインを使用することに決めました...しかし、私はhoを理解しようとしています各フィールドの個別の引数を取るのではなく、一度にすべてのフォームフィールドを取得します。 – Bri

1

あなたがしたい場合は、すべてをアップロードする際に問題が発生する可能性があると思いますファイルフィールドとその内容を削除します。ブラウザのセキュリティでは、ファイルを読み取ることはできません(これは、Ajaxリクエストを通じてコン​​テンツをアップロードするために必要です)。前述したように、serializeを使用するとフォームの他のコンテンツが取得され、サーバーでデコードできます。 あなたが本当にファイルの内容が必要な場合は、ページをリロードすることはありません非表示のiframeにフォームの送信を見てする必要がありますが、ファイルを介して送信するべきことがあります。

<form action="saveCode.cfc?method=safeDraft" method="post" enctype="multipart/form-data" target="upframe"> 
Say Something: <input type="text" name="foo"><br> 
Add a File: <input type="file" name="myfile"><br> 
<input type="submit"> 

<iframe src="initial.html" id="upframe" name="upframe"></iframe>

私も強くアップロードばかりだとあなたが正しくアップロードされているもの

編集デコードしている作るために何を見てフィドラー(fiddler2.com)を使用してお勧めします:スタックオーバーフローは、上記の例では、私のiframeタグを隠したし。私はまた、MacでChromeとFireFoxの例をテストしましたが、うまくいくようです。

+0

私はちょうど古いファッションの方法に固執するかもしれません。ファイルのアップロードは私を殺す。私はいつもファイルアップロードを持っているフォームのような "下書き"を要求します。私は時間があればもっと実験しなければならない。 – Bri

関連する問題