2010-09-09 21 views
5

Tôi đang xuất một GridView thành excel, sử dụng .NET 4.0 trong một ứng dụng web, tải trang và cần tệp được tạo và sau đó là trang được chuyển hướng đến trang gọi điện. Tôi đang chạy vào các vấn đề bởi vì mã của tôi để xuất khẩu vượt trội như sau:Chuyển hướng đến trang khác sau khi phản hồi.End() đã được gọi trong C#

gvSummary.Style.Add("font-size", ".6em"); 
    Response.Clear(); 
    string attachment = "attachment; filename=filename.xls"; 
    Response.ClearContent(); 
    Response.AddHeader("content-disposition", attachment); 
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
    StringWriter sw = new StringWriter(); 
    HtmlTextWriter htw = new HtmlTextWriter(sw); 
    gvSummary.GridLines = GridLines.Horizontal; 
    gvSummary.RenderControl(htw); 
    Response.Write(sw.ToString()); 
    Response.End(); 

Tôi biết rằng nếu tôi đặt Response.Redirect() trước khi END(), tôi sẽ được chuyển nhưng file là không bao giờ tạo ra, và nếu tôi đặt Response.Redirect() sau .End() Tôi nhận được tệp nhưng không có chuyển hướng.

Mã được viết ở trên chỉ hoạt động tốt khi tạo tệp, tuy nhiên khi sau khi tệp được tạo, tôi vẫn bị kẹt khi xem Hoạt ảnh đang tải vì tôi không thể thoát ra khỏi trang. Ý tưởng nào?

Trả lời

8

Tôi đề xuất thêm tiêu đề chuyển hướng. Một cái gì đó như thế này:

Response.AddHeader("Refresh", "3; url=index.html"); 

đâu 3 là thời gian của sự chậm trễ và index.html là url bạn cần phải chuyển hướng đến

+0

Vì kết quả của yêu cầu là tệp xls chứ không phải html, điều đó có thực sự hoạt động không? –

+0

Tôi nghĩ là có. vì trước hết HTTP được sử dụng để phân phối phản hồi. Trong trường hợp này, gói HTTP trông giống như một tập các tiêu đề theo sau là dữ liệu nhị phân (tệp xls). Trong một số trường hợp adiitionaly nó sẽ là cần thiết để thiết lập loại contnt để ứng dụng/octet-stream nhưng nó phụ thuộc vào loại kết quả nào chúng ta cần – ILya

+0

Nó không hoạt động, nó sẽ tải tệp nhưng không chuyển hướng ... – EvanGWatkins

1

Vấn đề là Response.End() gửi các bit cuối cùng của trang để các khách hàng để hoàn thành yêu cầu. Trong trường hợp của bạn, yêu cầu có chứa tệp.

Một giải pháp khả thi là mở một trang mới để tải xuống và giữ chuyển hướng trong trang hiện tại.

0

Bạn không thể làm cả hai mở để bạn có thể muốn thử thiết lập các liên kết đến tập tin xls tạo ra trong một cửa sổ mới hoặc là nguồn để một iframe

0

Trong JavaScript:

function refresh() { document.location.reload(true); } 

nút :

<td valign="top" style=" width:100px "> 
<asp:Button runat="server" ID="btnX" Text="X" CssClass="ui-button ui-widget ui-state-default ui-corner-all ui-button-text ui-state-hover" OnClientClick="refresh();" Width="180px" /> 
</td> 
0

Tôi đã thử mở một trang riêng thông qua ScriptManager để tải xuống tệp của tôi khi thực hiện chuyển hướng trong trang gốc của tôi.

Vì vậy, tôi thêm vào bên dưới mã trong trang chính của tôi:

string strScript = "<script language='javascript'> window.open('CommonDownload.aspx','Report');</script>"; 
ScriptManager.RegisterStartupScript(Page, this.GetType(), "clientScript", strScript, false); 
Response.Redirect("Page.aspx"); 

Và sau đó thêm mã tải về trong phương thức Page_Load của trang CommonDownload tôi. Tôi đã thông qua một số thông tin tôi cần trong trang CommonDownload thông qua phiên.