2010-05-12 65 views
3

請看看下面的click事件...強制回發Asp.Net

 
Protected Sub btnDownloadEmpl_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDownloadEmpl.Click 
     Dim emplTable As DataTable = SiteAccess.DownloadEmployee_H() 
     Dim d As String = Format(Date.Now, "d") 
     Dim ad() As String = d.Split("/") 
     Dim fd As String = ad(0) & ad(1) 
     Dim fn As String = "E_" & fd & ".csv" 
     Response.ContentType = "text/csv" 
     Response.AddHeader("Content-Disposition", "attachment; filename=" & fn) 
     CreateCSVFile(emplTable, Response.Output) 
     Response.Flush() 
     Response.End() 
     lblEmpl.Visible = True 
    End Sub 

此代碼簡單地從數據表中導出數據到CSV文件。這裏的問題是lblEmpl.Visible = true永遠不會被擊中,因爲這段代碼不會導致回發到服務器。即使我將代碼行lblEmpl.Visible = true置於點擊事件的頂部,該行仍可正常執行,但頁面不會更新。我怎樣才能解決這個問題?

+0

您正在運行到同一個問題,因爲這個帖子:http://stackoverflow.com/questions/2731971/problem-clearing-text-fields-on-vb-net-project-vs2008/2732657#2732657 – 2010-05-12 17:13:19

回答

4

這條線:

lblEmpl.Visible = True 

從未被擊中,因爲這條線:

Response.End() 

拋出一個ThreadAbortException

我覺得處理這樣一個簡潔的方法是創建一個簡單的HttpHandler組件,並在彈出窗口中「打開」它。 (彈出窗口不應該實際打開,在大多數情況下,瀏覽器會意識到它實際上是一個下載,並且會壓制選項卡/窗口。)

研究IHttpHandler接口。他們實際上很簡單。

下面是一個示例處理程序。對不起它一段時間了,我被稱爲成一個會議:

public class CensusHandler : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     string fileName = String.Format(
      CultureInfo.CurrentUICulture, 
      "E_{0:00}{1:00}.csv", 
      DateTime.Today.Month, 
      DateTime.Today.Day 
      ); 

     context.Response.ContentType = "text/csv"; 
     context.Response.AddHeader(
      "Content-Disposition", String.Format(null, "attachment; filename={0}", fileName) 
      ); 

     //Dump the CSV content to context.Response 

     context.Response.Flush(); 
    } 

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

OK,嘗試添加一個JavaScript onclick事件觸發下載:

<asp:Button ID="Clickety" runat="server" Text="Click Me!" OnClick="Clickety_Click" 
    OnClientClick="window.open('Handler.ashx', 'Download');" /> 

常規OnClick事件將觸發回傳代碼。 javascript onclick(OnClientClick)事件將通過HttpHandler啓動下載。

+0

如果我不把Response.End行放在那裏會有什麼影響。有缺點嗎? – 2010-05-12 15:24:07

+0

即使我評論Response.End線,它仍然無法正常工作。 – 2010-05-12 15:25:49

+0

我正在尋找網絡,我不確定你的意思。我從來沒有使用過HttpHandler。你能指點我一個很好的例子嗎? – 2010-05-12 15:38:15

1

您正在向響應流發送CSV,然後結束它。因此,一旦所有代碼都運行完畢,頁面本身現在不再被髮送到響應流中,因此不會在瀏覽器中更新。

爲了在您需要創建第二個響應流之後實現您的目標。最簡單的方法是通過一個新的瀏覽器窗口/彈出窗口。然後,您的CSV可以在彈出窗口中下載,並且您的初始頁面響應可以保留在初始瀏覽器中。

+0

你有這樣的代碼示例嗎? – 2010-05-12 15:27:58

0

就與此代碼上的Page_Load

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 
    Dim emplTable As DataTable = SiteAccess.DownloadEmployee_H() 
    Dim d As String = Format(Date.Now, "d") 
    Dim ad() As String = d.Split("/") 
    Dim fd As String = ad(0) & ad(1) 
    Dim fn As String = "E_" & fd & ".csv" 
    Response.ContentType = "text/csv" 
    Response.AddHeader("Content-Disposition", "attachment; filename=" & fn) 
    CreateCSVFile(emplTable, Response.Output) 
    Response.Flush() 
    Response.End() 
End Sub 

創建一個新的頁面然後在原始網頁讓你lblEmpl無形和註冊腳本像下面打開一個新的窗口,您的CSV。

var csvPageJS = string.Format("window.open ('{0}','mywindow');", ResolveUrl("~/MyCSVPage.aspx")); 
    ClientScript.RegisterStartupScript(typeof(Page), "popup", csvPageJS, true); 
+0

我試過它不起作用,它會下載數據,但不會刷新頁面上的控件 – 2010-05-12 16:33:38

+0

我編輯我的答案,你是否用JS腳本試過 – alejandrobog 2010-05-12 16:36:42

+0

這段代碼有點不錯,唯一的問題是它會更新然後打開對話框eventhough我說在腳本運行後讓標籤可見 Dim csvPageJS As String = String.Format(「wi ClientScript.RegisterStartupScript(GetType(Page),「popup」,csvPageJS,True) lblRG.Visible('{0}','mywindow');「,ResolveUrl(」〜/ TESTLOAD.aspx「)) lblRG.Visible = True – 2010-05-12 16:52:19

1

您應該隨時彈出,以便您仍然可以在原始頁面上設置標籤。從我看到你可以做這樣的事情

  1. 創建彈出一個seprate形式創建CSV,將你的函數新page.cs的負載,並將其發送一個查詢字符串PARM爲其dataID要導出。

    Protected Sub onLoad() 
        Dim recordID As Integer = Request.Querystring("dID") 
        Dim emplTable As DataTable = Nothing 
        Select Case recordID 
         case 1: emplTable = SiteAccess.DownloadEmployee_H() 
         case 2: emplTable = SiteAccess.DownloadManagers() 
        End Select 
        Response.Clear() 
        Response.ContentType = "text/csv" 
        Response.AddHeader("Content-Disposition", "attachment; filename=" & fn) 
        CreateCSVFile(emplTable, Response.Output) 
        Response.Flush() 
        Response.End() 
        lblEmpl.Visible = True 
    End Sub 
    
  2. 從按鈕的OnClientClick屬性啓動彈出窗口,或在回發註冊的腳本。

    function fnPopUpCSV(expType) 
    {   
    window.open('/popUpPage.aspx?dID=' + expType,'CSVwindow', 
    'width=300,height=200,menubar=yes,status=yes, 
    location=yes,toolbar=yes,scrollbars=yes'); 
    } 
    
    <asp:Button ID="btnGenEmplCSV" runat="server" Text="Generate Employee CSV" 
    onClientClick="javascript:return fnPopUpCSV(1);" /> 
    
    <asp:Button ID="btnGenMgrCSV" runat="server" Text="Generate Manager CSV" 
    onClientClick="javascript:return fnPopUpCSV(2);" /> 
    
+0

感謝您的幫助。你能給我更多的細節嗎?我不是這方面的專業人員。我會這樣做以添加缺失的部分嗎? Dim emplTable As DataTable =Nothing Select Case recordID case 1: emplTable = SiteAccess.DownloadEmployee_H() case 2: emplTable = SiteAccess.DownloadManagers() End Select 2010-05-12 16:40:46

+0

如果你只有兩種獲取數據的方法,那麼你就不需要花哨了。我只是編輯示例將代碼放入2個按鈕,並將js函數更改爲通過參數。我也將你的選擇案例添加到了服務器代碼中。希望有所幫助。 – 2010-05-12 17:18:37

+0

在你的情況下,我不確定lblEmpl.Visible = True可以在主頁面看到。所以如果我正確地關注你,這就是我所得到的。在主頁上我有按鈕(7個不同的csvs,7個按鈕),例如名爲DownloadEmployee。我在那個點擊事件按鈕中運行fnPopUp,它會轉到另一個頁面並下載,但標籤位於主頁面而不是彈出頁面,所以它不會看到它。 – 2010-05-12 17:51:53