2011-02-07 20 views
6

私のアプリケーションでは、一部のエクスポートされたデータベース情報をダウンロードするために、ユーザーにzipファイルを作成しています。 zipファイルは、ユーザーが「データを生成」ボタンをクリックしてデータベースにリクエストを記録するときに作成されます。ポストバック後にファイルをダウンロードする

私のページには、ユーザーのダウンロード履歴を表示し、一定の期間、最新の生成ファイルをダウンロードする機能を提供するGridviewがあります。

問題は、ボタンをクリックしたときにページをリフレッシュして(グリッドビューを最新表示して最新のリクエストを表示したい)、次にファイルのダウンロードを開始することです(IE、プロンプトを開き、それを開く/保存する/キャンセルするかどうかを決定させます)。

私はポストバックでダウンロードを開始できますが、Gridviewが開始する前に更新されていないため、リストに最新のリクエストが表示されません。ダウンロードのプロンプトが始まる前に、gridviewを更新するにはどうすればよいですか?

私は、ダウンロードを開始するには、以下の使用しています:

public void BeginDownload() 
    { 
     FileDownload download = InventoryService.GetLastThreeFileDownloads(this.EmployeeId).First(); 
     FileInfo fi = new FileInfo(Server.MapPath(SERVER_DOWNLOAD_PATH) + download.DownloadFileName); 

     Response.Clear(); 
     Response.ContentType = "application/zip"; 
     Response.AppendHeader("Content-Disposition", "attachment; filename=" + fi.Name); 
     Response.TransmitFile(fi.FullName); 
     Response.Flush(); 
    } 

隠しフィールドは、彼らがクリックしたときに、私が設定している(trueに設定されている場合の方法は、最後の項目として、Page_Loadイベントに呼ばれていますボタンをクリックしてファイルをビルドします)。

私はjQuery/AJAXの呼び出しでこれをやって、ページを更新してダウンロードを少しでも成功させようとしました。私はモーダルダイアログを開いて、リンクをクリックしてダウンロードを開始させ、モーダルが閉じたときにページを更新させることを考えましたが、別の解決策が見つからない場合、それは最後の手段です。

ご協力いただきありがとうございます。

答えて

2

ユーザーはページを送信しないでください。ダウンロードするファイルを含むHTTPレスポンスを生成します。ページをリフレッシュしたい場合は、その後にダウnloaded、通常のポストバック結果を送信する必要があります(BeginDownloadメソッドを呼び出さないでください)。そして何とか彼は何かをして別のリクエストを実行するように強制します。

さまざまなオプションがここにあります

  • は、ページ上のmeta refreshタグ
  • はiframe
  • を使用して...またはユーザーを持っているのonload JavaScriptの
  • を使用することを含む、あなたが言ったように、リンクをクリックしてください。

すべての方法には、いくつかの状況下では迷惑になる可能性があるIEの「不要なダウンロード」保護については特に注意してください)、ダウンロードリンクには少なくとも「ダウンロードできません自動的に起動します、ここをクリックしてください)

+0

私はgridviewへのダウンロードリンクを作成しました。それが単独で始まらない場合や、間違ってキャンセルした場合でも、サーバーに保存されているので、ファイルをダウンロードできます。提案してくれてありがとう、私は確かにそれらを見て、どの作品が最適かを見ていきます。 – Delebrin

1

あなたは一度にあまりにも多くをやっているように思えます。私は、新しい、専用のページ(またはashxハンドラ)にファイルをダウンロードするためにリダイレクトを使用してgridviewを更新するためにポストバックすることをお勧めします。 download page/ashxハンドラでcontent-dispositionヘッダーを使用すると、gridviewページが表示されたままになります。

+0

私はおそらく一度に多すぎると思います。提案してくれてありがとう、私は何をすることができるかを見て、何が最善のものであればここで解決策を選ぶだろう! – Delebrin

3

は、ここで私は似たいつか前に何かをした方法は次のとおりです。ポストバックで

  1. (データを生成する)、GridViewの中に最新のデータに更新されたページを送り返します。
  2. ページの読み込みが完了している生成されたファイル(window.location='fileurl';のようなものを要求したときに実行される小さなjavascript関数を追加します。もちろんのみポストバックでこのjavascript関数を送る。

表示されたページの内容にはありませんファイルを要求するときに変更すると、ブラウザの保存ダイアログがポップアップするだけです。

+0

以前はタイマーでjavascriptの手法を検討していましたが、必要なときにのみ直接関数を送信しようとはしていませんでした。このオプションをチェックします。提案していただきありがとうございます! – Delebrin

関連する問題