6

我有这个代码:

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();
}

但是这Response.End()给了我以下错误:

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="'.

Response.Write(content)正如我所见,它具有正确的信息。但是除了上述错误之外,没有出现保存/打开对话框。

我正在使用更新面板。

4

5 回答 5

28

将此添加到您的 Page_Load() 方法中

假设 ibtGenerateReport 是您的按钮

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

解释:

UpdatePanel 控件使用异步回发来控制呈现页面的哪些部分。它使用客户端上的一大堆 JavaScript 和服务器上的一大堆 C# 来做到这一点。这是使用客户端上的 JavaScript 可以理解的特殊格式呈现出来的。如果您通过在页面的渲染阶段之外渲染内容来弄乱格式,那么格式就会被弄乱。

为什么我不断收到 PageRequestManagerParserErrorException?

好吧,您可能正在做错误消息中提到的事情之一。以下是最常见的原因以及它们不起作用的原因:

调用 Response.Write(): 通过直接调用 Response.Write(),您绕过了 ASP.NET 控件的正常呈现机制。您编写的位将直接发送给客户端,无需进一步处理。

响应过滤器 /HttpModules : 与 Response.Write() 类似,它们可以以 UpdatePanel 不知道的方式更改渲染。

启用服务器跟踪: 使用 Response.Write() 有效地写出跟踪,因此弄乱了我们用于 UpdatePanel 的特殊格式。

调用 Server.Transfer(): 不幸的是,无法检测到调用了 Server.Transfer()。这意味着当有人调用 Server.Transfer() 时,UpdatePanel 无法执行任何智能操作。发送回客户端的响应是来自您传输到的页面的 HTML 标记。由于它的 HTML 而不是特殊格式,因此无法解析,并且您会收到错误消息。

解决方案: 避免解析错误的一种方法是通过调用ScriptManager.RegisterPostBackControl()进行常规回发而不是异步回发

在此处参考 Ellon Lipton 博客中的完整说明和其他解决方案

于 2013-02-18T17:45:07.310 回答
4

通过以下方式更改 Response.End:

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

Response.End 是一种不好的做法,它会中止线程以绕过 http 请求生命周期中的其余操作并引发异常。

于 2013-02-18T17:40:41.943 回答
0

由于您尝试通过 UpdatePanels 执行此操作,因此您应该尝试使用 jQuery Ajax 并在页面加载事件的单独页面中编写此代码,以便在调用此页面的请求时获取文件。新的响应实际上是删除需要解析为对先前更新面板请求的响应的信息。

于 2013-02-18T17:48:30.620 回答
0

您是否在向响应写入任何内容之前尝试了 Response.Clear() ,然后在结束响应之前尝试了 Response.Flush() ?

此外,在 Response.End() 中传递 true 值也无妨,以避免重定向时出现 HTTP 异常错误。只要确保其余的代码隐藏没有做你不想要的额外处理。

于 2013-02-18T17:37:44.270 回答
0

此代码与您的 aspx 中的某些UpdatePanel/AJAX冲突。

尝试在您的 aspx 中编写此代码:

代码- 这应该工作!:')

于 2016-03-29T07:00:50.767 回答