2011-02-07 71 views
6

在我的應用程序中,我正在構建一個zip文件供用戶下載一些導出的數據庫信息。當用戶點擊「生成數據」按鈕並在數據庫中記錄請求時,就會創建zip文件。在回傳後啓動文件下載

在我的頁面上,我有一個Gridview,它顯示用戶的下載歷史記錄,還可以讓他們在一段時間內下載最新生成的文件。

我遇到的問題是,當他們點擊按鈕,我想刷新頁面(從而刷新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(); 
    } 

的方法是所謂的Page_Load事件作爲最後一個項目,如果隱藏字段設置爲true(當他們點擊這是我設置該按鈕來建立文件)。

我也嘗試通過jQuery/AJAX調用來刷新頁面並開始下載,但很少成功。我曾想過打開一個模式對話框,讓他們點擊一個鏈接開始下載,然後在模式關閉時刷新頁面,但如果我找不到其他解決方案,這是最後的手段。

任何幫助,非常感謝!

回答

2

事情是你不發送回給用戶。用戶點擊按鈕,它發送一個HTTP請求,爲此你生成一個包含要下載的文件的HTTP響應,如果你想刷新頁面,並且只有在這之後發送文件爲dow nloaded,你需要發送一個正常的回髮結果(不要調用BeginDownload方法),然後以某種方式強制他做另一個請求,在該請求上您使用該文件進行響應。

有多種選擇這裏:

  • 包括頁面
  • meta refresh標記使用的onload的JavaScript
  • 使用iframe
  • ...或者讓用戶點擊一個鏈接,正如你所說的。

所有方法都有各自的缺點(請尤其注意IE的「不需要下載」的保護,其中,在某些情況下,可惱人的),你應該至少包括與「如果下載還沒有下載鏈接開始自動,點擊這裏「)。

+0

我確實在gridview中建立了一個下載鏈接,所以如果它不是自己啓動的,或者它們被錯誤取消,他們仍然可以下載該文件,因爲它存儲在服務器上。感謝您的建議,我一定會考慮一下,看看哪個效果最好。 – Delebrin 2011-02-07 21:03:08

1

聽起來好像你正試圖做得太多。我建議發佈回來更新gridview,然後使用重定向到新的專用頁面(或ashx處理程序)來下載文件。在下載頁面/ ashx處理程序中使用content-disposition標題時,gridview頁面應保持可見。

+0

我同意我可能一次做太多。感謝您的建議,我會看看我能做些什麼,然後在這裏選擇最適合您的解決方案! – Delebrin 2011-02-07 21:04:57

3

以下是我對類似較早前做了一些:

  1. 在回發(生成數據),發回更新頁面在GridView的最新數據。
  2. 添加一個小型的JavaScript函數執行時的頁面加載完成並請求生成的文件(像window.location='fileurl';。當然,只發送回發這個javascript函數。

顯示的頁面的內容不當請求一個文件時,它會彈出你的瀏覽器的保存對話框。

+0

我曾經用一個定時器調查過javascript方法,但是我沒有試過只在需要時直接發送函數。我會檢查這個選項。感謝您的建議! – Delebrin 2011-02-07 21:09:14