2012-07-25 12 views
0

我正在通過我的web應用程序提供docx文件。這是爲了響應正在更改的DropDownList索引而完成的,我將AutoPostBack設置爲true。我有許多選項可以通過複選框進行選擇,並且在更改下拉列表時,創建的文件基於選中的選項。Asp.net - 通過Response.OutputStream服務文件後會發生什麼

所以我在做什麼是事件觸發時我做了一些魔法來創建一個文檔,然後爲它服務:

Protected Sub myDropDown_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles myDropDown.SelectedIndexChanged 

' a bunch of things happen here but the end result is the contents of a docx file in a MemoryStream with the 
' name mainStream 

'here is where I set up the response and serve the file: 

Response.ClearContent() 
Response.ClearHeaders() 
Response.AddHeader("content-disposition", "attachment; filename=document.docx") 
Response.ContentEncoding = System.Text.Encoding.UTF8 
Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document" 
mainStream.WriteTo(Response.OutputStream) 
mainStream.Close() 
mainStream.Dispose() 
Response.End() 

現在的問題是,我應該在這一點上做什麼?看起來我必須調用Response.End()發送緩衝的內容,但這讓我坐在一個頁面上,複選框已勾選,而我的下拉列表已更改選項。如果我點擊頁面上的任何其他按鈕導致回發,似乎選定的索引更改了我的下拉菜單事件。

我想要做的是發送文件後重定向。由於Response.End()停止頁面執行,因此Response.redirect不起作用。誰能告訴我這種情況通常如何處理?任何人都可以告訴我,爲什麼我的下拉列表中選定的索引事件會再次觸發,如果頁面上的另一個控件在文件傳遞完成後進行回發?任何建議真的很感激。謝謝!

+0

看看這個鏈接:http://stackoverflow.com/questions/3676734/redirecting-to-another-page-after-response-end-has-been-called-in-c-sharp – w0051977 2012-07-25 18:14:18

+0

嗨,感謝您的迴應,但該主題中的答案對我無效。設置刷新似乎沒有做任何事情。我仍然得到了這個文件,但是之後它不會改變 – TheMethod 2012-07-26 11:19:33

回答

1

根據應用程序的複雜程度以及選擇後頁面中的所需行爲,有幾種不同的方法來處理此問題。

我們處理這種情況的方式是收集所有關於在javascript中生成文件的細節,並將它們以查詢字符串的形式傳遞給我們在javascript中的新窗口中打開的ashx頁面。然後ashx頁面將生成文件並將響應傳回給用戶。

我們採用這種方法是因爲對文件的請求不會改變用戶與頁面之間的交互。

另一種方法是在回發期間生成文件並將其保存在臨時位置。然後,您可以將用戶移到其他頁面或更新當前頁面,然後執行一些可以爲用戶提取文件的JavaScript。如果文件是在暴露的文件夾中生成的,則可以直接打開該文件,否則可以使用上面的ashx技巧。無論哪種情況,您的代碼都必須在隱藏字段或javascript中包含對生成文件的引用,以便客戶端知道如何找到它。

相關問題