0

Webアプリケーションを介してdocxファイルを提供しています。これは、DropDownListインデックスが変更されたことに応じて行われます。私は、AutoPostBackをtrueに設定しています。チェックボックスで選択できるオプションがいくつかあります。ドロップダウンを変更すると、作成されるファイルはチェックされたオプションに基づいています。

つまり、私が行っているのは、イベントが発生したときに、ドキュメントを作成して提供するために魔法をかけることです。

Protected Sub myDropDown_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles myDropDown.SelectedIndexChanged

' a bunch of things happen here but the end result is the contents of a docx file in a MemoryStream with the
' name mainStream

'here is where I set up the response and serve the file:

Response.ClearContent()
Response.ClearHeaders()
Response.AddHeader("content-disposition", "attachment; filename=document.docx")
Response.ContentEncoding = System.Text.Encoding.UTF8
Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
mainStream.WriteTo(Response.OutputStream)
mainStream.Close()
mainStream.Dispose()
Response.End()

さて、私の質問は、この時点で何をすべきかということです。Response.End()を呼び出してバッファリングされたコンテンツを送信する必要があるようですが、チェックボックスがオンになっているページと、変更されたオプションのドロップダウンが表示されたままになります。ポストバックを引き起こすページ上の他のボタンを押すと、ドロップダウンの選択されたインデックス変更イベントが再び発生するようです。

私がやりたいのは、ファイルを送信した後にリダイレクトすることです。Response.End()がページの実行を停止するため、Response.redirectは機能しません。このような状況が通常どのように処理されるかを誰かに教えてもらえますか?ファイルが提供された後にページ上の別のコントロールがポストバックを実行した場合に、ドロップダウン用に選択されたインデックスイベントが再び発生する理由を誰かに教えてもらえますか?どんなアドバイスも大歓迎です。ありがとう!

4

1 に答える 1

1

アプリケーションの複雑さと選択後のページでの望ましい動作に応じて、これにアプローチする方法はいくつかあります。

この状況を処理する方法は、javascriptでファイルを生成するためのすべての詳細を収集し、それらをクエリ文字列でjavascriptから新しいウィンドウで開くashxページに渡すことです。次に、ashxページがファイルを生成し、応答をユーザーにストリーミングします。

このアプローチを採用しているのは、ファイルのリクエストによってユーザーのページとのやり取りについて何も変更されないためです。

もう1つの方法は、ポストバック中にファイルを生成し、一時的な場所に保存することです。次に、ユーザーを別のページに移動するか、現在のページを更新してから、ユーザーのファイルをフェッチするJavaScriptを実行します。ファイルが公開されたフォルダーに生成されている場合は、ファイルを直接開くことができます。そうでない場合は、上記のashxトリックを使用できます。いずれの場合も、コードビハインドでは、クライアント側がファイルを見つける方法を認識できるように、生成されたファイルへの参照を非表示フィールドまたはJavaScriptに含める必要があります。

于 2012-07-25T18:42:26.417 に答える