2009-08-28 78 views
0

我有一個ASP.NET頁面,我在這裏生成一個Excel電子表格,並在響應(content-disposition header)中發送它。該部分效果很好,但我有一個永遠不會重新啓用的按鈕,因爲原始頁面不是響應的一部分。如何在HTTP響應中發送文件和頁面?

下面是我使用的功能:

Public Shared Sub WriteToResponse(ByVal theWorkBook As Workbook, ByVal FileName As String, ByVal resp As HttpResponse) 
    Dim theStream As New System.IO.MemoryStream() 
    theWorkBook.Save(theStream) 

    Dim byteArr As Byte() = DirectCast(Array.CreateInstance(GetType(Byte), theStream.Length), Byte()) 

    theStream.Position = 0 
    theStream.Read(byteArr, 0, CInt(theStream.Length)) 
    theStream.Close() 

    resp.Clear() 
    resp.AddHeader("content-disposition", "attachment; filename=" & FileName) 
    resp.BinaryWrite(byteArr) 
    resp.End() 
End Sub 

我試着不清除響應並使用替代的AddHeader AppendHeader,但反應仍然只包含文件。

我錯過了什麼?我需要使用不同的標題嗎?我發現這個unanswered question on the ASP.NET forums;聽起來像我的問題。

回答

2

你不能。您可以通過點擊按鈕打開一個彈出框來僞造該行爲,並讓彈出窗口提供該文件並從javascript回發頁面。但通過這種方式,您可以有效地創建2個請求並提供2個響應。

更新:如果你想,當他們開始下載禁用按鈕,並儘快使其作爲下載開始,你不能真正做到這一點,但你可以使用一些弄虛作假,使其看起來像。當他們點擊下載按鈕時,使用一些JavaScript來禁用按鈕並創建啓動文件流的彈出窗口。當文件流功能(WriteToResponse)返回在用戶會話中設置某個值時。同時,原始頁面使用AJAX輪詢服務器以查看是否設置了會話值。如果它的設置重新啓用按鈕,並重新設置爲空值或假(所以這個工作的第二次)。但這似乎是一大堆技巧。

,但我認爲在這種情況下,治癒是再厲害的問題。我想,你希望這是因爲生成的文件需要一段時間,你不希望用戶同時正在編寫的文件不耐煩地按下按鈕,復位流量。要做到這一點,我只想顯示按下按鈕的頁面彈出一個消息,說什麼「正在準備您的下載。這可能需要一分鐘。感謝您的耐心等待。(點擊關閉此消息)」

2

您不能在相同的響應中發回文件和新頁面。

我不知道該解決方案是如何滿足您的特定需求,但要記住,你可以使用JavaScript來啓用或禁用按鈕右側之前發送的文件創建請求服務器(這樣,在用戶開始下載電子表格時,該按鈕已處於您希望的狀態)。

相關問題