2011-12-30 165 views
2

我有一段代碼可以動態生成csv文件。用戶點擊一個按鈕,我準備的字符串,然後我這樣做是這樣的:Response.End()後刷新頁面內容

MemoryStream stream = new MemoryStream(ASCIIEncoding.Default.GetBytes(sb.ToString())); 
Response.Clear(); 
Response.ContentType = "Application/csv"; 
Response.AppendHeader("content-disposition", String.Format("attachment; filename={0}.csv", fileName.ToString())); 
Response.BinaryWrite(stream.ToArray()); 
Response.End(); 

然後,用戶提示下載或保存新生成的文件。 問題是,在這之後,我不得不刷新頁面中的一些數據。在Response.End之後,這是不可能的了。

有關如何解決問題的任何想法?

+0

通過相對鏈接自我重定向'.DestinationPageUrl =「〜/ User/Default.aspx」;' – Rafee 2011-12-30 11:45:58

+0

在生成文件後主頁面是否需要刷新?即它可以同時下載文件嗎? – Chris 2011-12-30 12:05:45

+0

可以同時發生,是的。 – Dante 2011-12-30 12:12:53

回答

4

這是一個常見的問題,並且有很多方法可以解決這個問題,所有這些都需要創建兩個單獨的請求到您的服務器。第一個會要求您的CSV,第二個會要求您刷新。

考慮到這一點很明顯,您可以:

  • 獲取用戶同時創建請求(通過分別點擊兩個鏈接)
  • 使用JavaScript來創建既當用戶只點擊一次

因此,例如,引發您的CSV下載的鏈接也可能會調用JavaScript函數,導致您的數據刷新。通常的做法是使用OnClientClick調用一些JavaScript來刷新數據。

但是,您可以根據您的應用程序決定最佳前進方向。

+0

我有點懶得調查,但你確定OnClientClick被轉換爲ClientClick而不是OnClick? JavaScript事件是OnClick。 – 2011-12-30 11:53:17

+0

@MichaelKjörling - 道歉,你是正確的,只是有點打字錯誤。 – 2011-12-30 11:55:01

+0

兩個按鈕不可行,感覺像一個糟糕的解決方法。客戶端我也認爲是行不通的,因爲當用戶點擊按鈕時,服務器端事件將更新一些數據並生成文件,刷新取決於服務器端更新的數據。我可以生成一個客戶端函數調用或其他東西,但我不認爲它會起作用。 – Dante 2011-12-30 12:19:10

3

也許點擊按鈕會在一個新窗口中將用戶重定向到一個處理程序(ashx),它將返回流/提示用戶保存文件?

- 或 -

先更新內容,然後發送文件給用戶。