2010-12-07 1 views
0

私はTapestry 5フレームワーク/ javascriptを使ってWebアプリケーションプロジェクトを進めています。このアプリケーションはほとんど入力がなく、pdfファイルを返します。Tapestry5でページとストリームの両方を返すにはどうすればよいですか?

ユーザーがクリックしたときにフォーム送信ボタンを無効にするという新しい要件がありました。レポートが生成されるまで、ボタンは無効のままにしておいてください。私は送信ボタンを無効にするためのjavascriptを書くつもりです。しかし、どのようにpdfファイルを返す間にボタンを再び有効にすることができますか?

私はTapestryのドキュメントを読みました。ドキュメントごとに、有効な戻り値の型は "Nothing、String、Class、Page、Link、Stream"です。ページを返すと、送信ボタンを再び有効にすることができます。ストリームを返すと、ユーザーはpdfをダウンロードできます。しかし、私は両方をしたい。私は複数のオブジェクトを返すことができる方法はありますか(別のオブジェクトの中に1つのオブジェクトがあるかもしれません)。 (または)誰かがこの問題の解決策を提案することができますか?私はあなたのワークフローを推測している

おかげ

答えて

2

フォームがハンドラがOnActivateイベントメソッドでストリーム(pdf)を返しページに向け提出するということです。私はまた、ブラウザが開くのではなく、ファイルがダウンロードされるように、レスポンスヘッダーの設定を推測しています。

この場合、ブラウザは通常「ファイルを保存」ダイアログを作成し、現在のページは決して離れて移動されません(リフレッシュしません)。ファイルがダウンロードされたことを伝えるコールバックを受け取ることはありません。

上記のワークフローでは、ダウンロードの開始または完了に対する応答としてボタンを再度有効にすることはできません。これは、ストリームのレスポンスが任意のバイナリデータであり、ブラウザで実行可能なhtml/javascriptではないためです。 html/javascript +バイナリファイルデータの混合応答を返すことはできません。

ボタンを一定期間使用しないようにしてから、ダブルクリックしないようにしてください。あまりにも複雑すぎるアプリケーションを追加したくない場合は、この方法をお勧めします。

ただし、フォームの提出とダウンロードの間に余分なリクエスト - レスポンスを挿入するワークフローを変更することができます。

  1. フォームの提出がセッションにあなたのPDF生成パラメータを保存し、応答を返します:

    すなわち代わりにストリームを返すページにまっすぐに向ける、あなたは順番にダウンロードを要求し、あなたの現在のページをリロードすることができ

  2. 新しいページが、ダウンロードURLにリダイレクトするメタリフレッシュまたはスクリプト指示とともにロードされます。
  3. ダウンロードURLが呼び出されると、正しいヘッダーが設定されたストリーム応答が返されます。 '名前を付けてファイルを保存'ダイアログ

あなたの希望する機能を達成する他の方法もありますが、フォームの提出とファイルのダウンロードの間に追加の要求 - 応答が必要になるという点で同じパターンになります。

ps。これは本当にタペストリーの問題ではありませんが、フレームワークに関係なく(フレームワークがこのケースを処理するために特別なことをしない限り)、同じ問題に遭遇します。これは、http /ブラウザ技術がどのように機能するかです。

+0

ご連絡ありがとうございます。2番目のアプローチ(メタリフレッシュタグ付き)を試してみましょう。しかし、私はダブルクリックの問題を非常に簡単に解決する最初のアプローチが好きでした。 – Rajesh

+0

喜んで助けてください。それがうまくいくならば、ダニを与える。それはあなたがstackoverflowを使う方法です。 – pstanton

関連する問題