2013-02-18 26 views
6

tôi có mã này:Response.End() tạo ra một lỗi khi xuất khẩu GridView để file excel

protected void ibtGenerateReport_Click(object sender, ImageClickEventArgs e) 
{ 
    string filename = "report.xls";    

    StringWriter stringWriter = new StringWriter(); 
    HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWriter); 
    DataGrid DataGrd = new DataGrid();    
    DataGrd.DataSource = odsLSRAudit; 
    DataGrd.DataBind(); 

    DataGrd.RenderControl(htmlWrite);    

    System.IO.StreamWriter vw = new System.IO.StreamWriter(filename, true); 
    stringWriter.ToString().Normalize(); 
    vw.Write(stringWriter.ToString()); 
    vw.Flush(); 
    vw.Close(); 
    WriteAttachment(filename, "application/vnd.ms-excel", stringWriter.ToString());   
} 

public static void WriteAttachment(string FileName, string FileType, string content) 
{ 
    HttpResponse Response = System.Web.HttpContext.Current.Response; 
    Response.ClearHeaders(); 
    Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName); 
    Response.ContentType = FileType; 
    Response.Write(content);    
    Response.End(); 
} 

Nhưng Response.End() mang lại cho tôi những lỗi dưới đây:

Microsoft JScript runtime error: Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled. Details: Error parsing near '<table cellspacing="'.

Các Response.Write(content) có thông tin chính xác như tôi có thể thấy. Nhưng không có hộp thoại Save/Open xuất hiện, ngoài lỗi trên.

Tôi đang sử dụng UpdatePanels.

+0

bạn đang sử dụng bảng cập nhật hoặc ajax asp.net? hãy thử điều này http://stackoverflow.com/questions/11221033/sys-webforms-pagerequestmanagerparsererrorexception-the-message-received-from-t – feco

Trả lời

24

Thêm phần này vào phương pháp Page_Load của bạn()

Giả sử ibtGenerateReport là nút của bạn

protected void Page_Load(object sender, EventArgs e) { 
    ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page); 
    scriptManager.RegisterPostBackControl(this.ibtGenerateReport); 
    //Further code goes here.... 
} 

Giải thích:

Việc kiểm soát UpdatePanel sử dụng đăng lại không đồng bộ để kiểm soát các bộ phận của trang được hiển thị. Nó thực hiện điều này bằng cách sử dụng một bó toàn bộ JavaScript trên máy khách và một bó toàn bộ C# trên máy chủ. Điều này được hiển thị bằng cách sử dụng một định dạng đặc biệt mà JavaScript trên máy khách có thể hiểu được. Nếu bạn lộn xộn với định dạng bằng cách hiển thị mọi thứ bên ngoài giai đoạn hiển thị của trang, định dạng sẽ bị làm sai lệch.

Tại sao tôi tiếp tục nhận được PageRequestManagerParserErrorException?

Vâng, rất có thể bạn đang thực hiện một trong những điều được đề cập trong thông báo lỗi. Dưới đây là những lý do phổ biến nhất và tại sao họ không làm việc:

Các cuộc gọi đến Response.Write(): Bằng cách gọi Response.Write() trực tiếp bạn đang bỏ qua các cơ chế render bình thường của ASP.NET điều khiển. Các bit bạn viết sẽ đi thẳng ra cho khách hàng mà không cần xử lý thêm.

bộ lọc đáp ứng/HttpModules: Tương tự như Response.Write(), họ có thể thay đổi hiển thị theo cách như vậy mà UpdatePanel sẽ không biết.

Theo dõi máy chủ được bật: Dấu vết được viết hiệu quả bằng cách sử dụng Response.Write(), và như vậy sẽ làm rối loạn định dạng đặc biệt mà chúng tôi sử dụng cho UpdatePanel.

Cuộc gọi tới máy chủ.Transfer(): Thật không may, không có cách nào phát hiện ra Server.Transfer() được gọi. Điều này có nghĩa rằng UpdatePanel không thể làm bất cứ điều gì thông minh khi ai đó gọi Server.Transfer(). Phản hồi được gửi lại cho khách hàng là đánh dấu HTML từ trang bạn đã chuyển. Kể từ khi HTML của nó và không phải là định dạng đặc biệt, nó không thể được phân tích cú pháp, và bạn nhận được lỗi.

Giải pháp: Một cách để tránh những lỗi phân tích cú pháp là để làm một postback thường xuyên thay vì một postback không đồng bộ bằng cách gọi ScriptManager.RegisterPostBackControl()

Vui lòng tham khảo Giải thích đầy đủ và các giải pháp khác từ Blog của Ellon Lipton here

+0

Hãy thử xuất khung nhìn của bạn bằng cách sử dụng http://ramanisandeep.net/2009/04/07/export-gridview-to-excel/ – feco

0

Bạn đã thử một Response.Clear() trước khi viết bất cứ điều gì để phản ứng, sau đó một Response.Flush() trước khi kết thúc phản ứng?

Ngoài ra, nó không bao giờ đau để chuyển giá trị đúng trong Response.End(), để tránh lỗi ngoại lệ HTTP trên chuyển hướng. Chỉ cần đảm bảo phần còn lại của mã-đằng sau không thực hiện xử lý bổ sung mà bạn không muốn.

+0

Tôi không nhận thấy anh ấy đang sử dụng Update Panels - Clear() isn không cần thiết trong trường hợp đó. – Ripside

4

Thay đổi Response.End của thành viên này:

Response.Flush(); 
HttpContext.Current.ApplicationInstance.CompleteRequest(); 

Response.End là một thói quen xấu, nó hủy bỏ thread để bỏ qua phần còn lại của các hoạt động trong vòng đời yêu cầu http và nó ném một ngoại lệ.

0

Vì bạn đang cố gắng thực hiện điều đó thông qua UpdatePanels, bạn nên thử sử dụng jQuery Ajax và viết mã này vào một trang riêng biệt trong sự kiện tải trang để tải tệp khi bạn gọi hàm requ est vào trang này. Phản hồi mới thực sự loại bỏ thông tin cần thiết để được phân tích cú pháp như là một phản ứng với yêu cầu bảng cập nhật trước đó.

0

Mã này xung đột một số UpdatePanel/AJAX trong aspx của bạn.

Hãy thử viết điều này trong aspx của bạn:

Code - nên hoạt động! : ')

+0

Sao chép mã này dưới dạng ** TEXT ** trong câu trả lời, vui lòng. – Kiquenet

Các vấn đề liên quan