2013-09-26 144 views
1

我有一個帶有圖像按鈕的頁面。當用戶單擊圖像按鈕時,服務器將創建該頁面的PDF,並將帶有下載的響應發送回客戶端。問題是這可能需要一些時間。我該怎麼處理等待客戶?檢測客戶端上的Response.BinaryWrite

我最初的想法是在顯示加載器GIF的按鈕上執行onClientClick事件。但是我無法檢測到響應何時完成,因此我可以再次隱藏它。我試過使用RegisterStartupScript以及Response.Write([script]),但它似乎都被PDF的覆蓋Response.BinaryWrite(buffer) - 文件被下載但沒有其他事情發生。

這裏是我的代碼,只需下載邏輯:

protected void imgPrint_Click(object sender, ImageClickEventArgs e) 
     { 
      PDF pdf = new PDF(); 

      byte[] buffer = pdf.ExportToPDF(Request.QueryString["id"].ToString(), Request.QueryString["mode"].ToString()); 

      string att = "attachment; filename=" + Request.QueryString["mode"].ToString() + ".pdf"; 
      Response.ClearContent(); 
      Response.AddHeader("content-disposition", att); 
      Response.ContentType = "application/pdf"; 
      Response.ContentEncoding = Encoding.Default; 
      Response.BinaryWrite(buffer); 
     } 

而且具有的OnClientClick事件的圖像按鈕,目前只顯示一個警告:

<asp:ImageButton ID="imgPrint" runat="server" 
           ImageUrl="~/bilder/skriv_ut.png" Width="45" Height="36" 
           onclick="imgPrint_Click" OnClientClick="loader(true);" /> 

回答

0

一般情況下,我用Generic HandlerHyperlink爲可下載的文件或圖片。

通用處理器:

public class DocumentsHandler : IHttpHandler 
    { 
     public void ProcessRequest(HttpContext context) 
     { 
      Document doc; // any type 

      if (doc!= null) 
      { 
       context.Response.ContentType = MimeMapping.GetMimeMapping(doc.FileName); 
       context.Response.AddHeader("Content-Disposition", string.Format("filename={0}", doc.FileName)); 
       context.Response.OutputStream.Write(doc.Data, 0, doc.Data.Length); 
      } 
     } 

     public bool IsReusable 
     { 
      get 
      { 
       return false; 
      } 
     } 
    } 

的.cs頁:

lnkDocument.NavigateUrl = String.Format("~/Handlers/DocumentsHandler.ashx?{0}",documentId); 

當用戶想要觀看/下載文件,他們點擊鏈接。在您的情況下,網頁將立即加載,並且在點擊超鏈接後耗時的過程將繼續。

+0

酷,學到新的東西!但是,我的問題仍然存在 - 我如何檢測響應何時發佈以便隱藏加載器?耗時是在點擊之間到文件準備好下載之間。 – Skalis

1

在網頁表單,您可以使用jQuery & Webservice的

function loader(show) { 
    if(show) 
    { 
    //show loading here 
    } 

     $.ajax({ 
      type: "POST", 
      url: "MyService.asmx/myMethod", 
      data: "{}", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (data) { 
       //do some thing & hide loading 
      }, 
      error: function (data) { 
       //do some thing & hide loading 
      } 
     }); 
    } 
}); 

[WebService, ScriptService] 
public class MyService : WebService 
{ 

    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public static string myMethod() 
    { 
     PDF pdf = new PDF(); 

      byte[] buffer = pdf.ExportToPDF(Request.QueryString["id"].ToString(), Request.QueryString["mode"].ToString()); 

      string att = "attachment; filename=" + Request.QueryString["mode"].ToString() + ".pdf"; 
      Response.ClearContent(); 
      Response.AddHeader("content-disposition", att); 
      Response.ContentType = "application/pdf"; 
      Response.ContentEncoding = Encoding.Default; 
      Response.BinaryWrite(buffer); 
      return "ok"; 
    } 
} 
+0

謝謝。我嘗試了一種類似於PageMethod的方法。但是,我收到了與Json不兼容的數據異常。我猜你會犯同樣的錯誤,但會嘗試一下,以確保。 – Skalis