2013-09-27 29 views
0

我有一個網頁,它返回一組結果,然後您可以以.csv格式請求這些結果。將文件下載到客戶端PC併發回

由於文件的創建時間相當長(有時長達30分鐘),我添加了一些JavaScript,它將一個類添加到div中,以便它覆蓋屏幕,告訴用戶報告正在創建並保持耐心。

創建並下載文件後,我希望div可以返回到原來的狀態(可以這麼說)。

這是我目前有。

的JavaScript

function skm_LockScreen() { 
    var lock = document.getElementById('ctl00_ContentPlaceHolder1_skm_LockPane'); 
    var lock2 = document.getElementById('ctl00_ContentPlaceHolder1_pleaseWait'); 
    if (lock) 
     lock.className = 'LockOn'; 
    if (lock2) 
     lock2.className = 'WaitingOn'; 
} 
function skm_UnLockScreen() { 
    var lock = document.getElementById('ctl00_ContentPlaceHolder1_skm_LockPane'); 
    var lock2 = document.getElementById('ctl00_ContentPlaceHolder1_pleaseWait'); 
    if (lock) 
     lock.className = 'LockOff'; 
    if (lock2) 
     lock2.className = 'WaitingOff'; 
} 

按鈕

<asp:Button ID="LatestReportButton" runat="server" CssClass="standardButton" Text="Latest Quote Report" Width="140px" 
OnClick="ReportButton_Click" CommandArgument="2" OnClientClick="skm_LockScreen()" /> 

代碼背後

protected void ReportButton_Click(object sender, EventArgs e) 
    { 
     Page.ClientScript.RegisterStartupScript(base.GetType(), "unlock", "<script type=\"text/javascript\">skm_UnLockScreen();</script>"); 
     try 
     { 
      //Start creating the file 
      using (StreamWriter sw = new StreamWriter(tempDest + "\\" + csvGuid + ".csv", true)) 
      { 
       //Code to create the file goes 
      } 
     } 
     catch 
     { 
     } 
     Response.AddHeader("Content-disposition", "attachment; filename=report.csv"); 
     Response.ContentType = "application/octet-stream"; 
     Response.WriteFile("CreatedReport.csv"); 
     Response.End(); 
    } 

我遇到的問題是,JavaScript是從來沒有寫回頁面,因爲響應。結束();

我已經做了兩個按鈕,一個用來創建報告,另一個用來下載它,但是我的公司會更喜歡它是一體化的。

有什麼建議嗎?

回答

0

鑑於生成報表所需的時間長度,你提出的方法中包含了一些固有的風險,其中的每一個都會導致報表創建失敗:

  • 用戶可能會意外關閉瀏覽器/選項卡;
  • 瀏覽器/選項卡可能會崩潰;
  • 超時可能發生在Web服務器上。

我會以不同的方式解決這個問題。首先,我會看看是否可以優化報告生成 - 「30分鐘」立即響起警鐘。假設數據庫涉及到某個點,我會至少調查以下內容:

  • 是否正在使用或正確使用數據庫索引?
  • 報告生成查詢是否包含低效操作(例如CURSOR)?
  • 執行計劃是否顯示報告生成過程中的其他缺陷?

如果這不是一個選項(假設你不能修改的DB無論何種原因),我還是會考慮一個完全不同的方法來生成報告,從而使報告創建邏輯之外的移動將網絡應用程序放入控制檯應用程序中。

對於這一點,你需要定義:

  • 的方式來報告的參數傳遞給報表生成的應用程序;
  • 一種標識請求報告的用戶(理想情況下是登錄憑據或Windows標識)的方式;
  • 報告準備就緒時通知用戶的方式(電子郵件,屏幕消息);
  • 服務器上將保存和下載報告的目錄;
  • 用戶可以從中下載報告的單獨頁面。

一對數據庫表應該足以記錄此信息。

+0

感謝羅布。我最終在一個新窗口中創建了報告,向用戶表明報告正在創建並耐心等待。該窗口完成後下載文件。 –