2011-02-14 38 views
0

此處的主要目的是將處理程序定位到下載正在預覽的文件。從按鈕定位HTTP Handler的方法單擊

有該文件的兩個不同的條件下,一個在那裏已經通過查詢字符串

COIHandler.axd?行動= preview_saved & letterId = XXXX

保存在數據庫中,那麼下面的參數處理程序

一個有尚未保存,在我把它存儲在會話和目標函數按照如下方式

COIHandler.axd?行動= preview_未保存

然後處理程序將處理完成後清除會話。 關於如何使這發生的任何想法。對於http處理程序來說還是新的。

澄清

我在我的子歸類Button類的版本OnClientClick屬性,讓我追加JavaScript的它,將被執行的客戶端。這就是我想要進行定位的地方。

我希望用戶在單擊下載按鈕時仍留在同一頁面上。

我不想簡單地做一個JavaScript重定向,將目標處理程序,我想盡可能避免彈出窗口。不太確定是否會留下任何選項

+0

如何使用Button.PostBackURL而不是我的自定義javascript屬性?只需將它指向處理程序,它不應該重定向或任何內容,只是爲請求提供服務。 – 2011-02-14 18:53:58

回答

0

首先,非常感謝您提供所有可能的解決方案,幫助您脫離盒子。

我想出了一個我認爲會分享的獨特解決方案。

  1. 我在我的頁面的html標記中放置了一個不可見的iframe。

  2. 然後我設置了一個名爲OnClientClick屬性在我的服務器控件下載按鈕(這讓我呈現的參數字符串到HTML的onclick屬性)

    我的屬性設置爲體現一個JavaScript方法遞歸算法導航到頁面的頂層父框架,一旦達到那個點,我就使用一個簡單的JQuery選擇器來查找我在第1步中提到的iframe。(遞歸的原因是爲了保持對Master Pages的支持你將在幀中有幀)。

  3. 將iframe的src屬性設置爲目標HTTP處理程序。應用的行爲會導致iframe加載請求的源代碼......但在這種情況下,它是一個處理程序,並且由於它原本是通過直接用戶輸入(通過下載按鈕單擊)創建的,所以您甚至不會遇到問題獲得黃色酒吧與IE7 +

  4. 的處理程序處理請求和文件提供給瀏覽器

耶!

0

您的處理程序實際上是.ashx。除此之外,你的方法似乎很好。您可以檢查傳入PrcoessRequest方法的上下文。

public void ProcessRequest(HttpContext context) 
{ 
    switch(context.Request.QueryString["Action"].ToLower()) 
    { 
     case "preview_saved": 
      //do stuff for saved 
     case "preview_unsaved": 
      //do stuff for unsaved 
    } 
} 

UPDATE如果你想有一箇中央處理程序,那麼你要麼要重定向在這種情況下,你還需要在通話結束用戶傳遞一個returnUrl參數的查詢字符串。然後你可以做一個context.Response.Redirect(context.Request.QueryString["returnUrl"])。或者,如果您希望頁面保持其狀態,則必須對您的處理程序進行Ajax調用。

+0

我寫了一個warpper來處理上下文,但或多或​​少都是我正在採用的方法。我將澄清這個問題,因爲我覺得它不夠清楚。 – 2011-02-14 17:51:51

+1

@Matthew,那麼爲什麼不只是讓你的頁面在服務器點擊處理器中處理。爲什麼你需要一個不同的處理程序呢? – Vadim 2011-02-14 18:03:58

0

爲了響應Yads評論,您可以使用頁面上的按鈕點擊處理程序來下載文件,而不需要彈出窗口或單獨的HTTP處理程序。

protected void btnDownload_OnClick(object sender, EventArgs args) 
{  
    PDFContentData data = GeneratePDFData(); //parses strings from some source (as mentioned in comments) 
    WebFileUtil.InvokePDFDownload(Page.Context, data); 
} 

public static class WebFileUtil 
{ 
    public static void InvokePDFDownload(HttpContext context, PDFContentData data) 
    { 
     context.Response.Clear(); 
     context.Response.ClearContent(); 
     context.Response.ClearHeaders(); 

     FileStore.generateDocument(data, context.Response.OutputStream); 

     context.Response.ContentType = "application/pdf"; 
     context.Response.ContentEncoding = System.Text.Encoding.UTF8; 
     context.Response.AddHeader("Content-Disposition", String.Format("attachment;filename={0}_Documenth.pdf", DateTime.Now.ToShortDateString())); 
     context.Response.End(); 
    } 
}