2012-06-27 36 views
47

我在我的网页上有一个网格视图,我想将它导出到Excel工作表, 下面是我写的代码来完成此任务,我在这里已经传递数据集的方法,以网格结合和btnExcelExport是将导出网格内容到Excel工作表的按钮: -Sys.WebForms.PageRequestManagerParserErrorException:从服务器收到的消息无法解析

private void BindGridView(DataSet ds) 
{ 
    if (ds.Tables.Count > 0) 
    { 
     if (ds.Tables[0].Rows.Count > 0) 
     { 
      GVUserReport.DataSource = ds; 
      GVUserReport.DataBind(); 
      btnExcelExport.Visible = true; 
     } 
    } 
} 

protected void btnExcelExport_Click(object sender, EventArgs e) 
{ 
    Response.Clear(); 
    Response.AddHeader("content-disposition","attachment;filename=FileName.xls"); 
    Response.Charset = ""; 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.ContentType = "application/vnd.xls"; 
    System.IO.StringWriter stringWrite = new System.IO.StringWriter(); 
    System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); 
    GVUserReport.RenderControl(htmlWrite); 
    Response.Write(stringWrite.ToString()); 
    Response.End(); 
} 

public override void VerifyRenderingInServerForm(Control control) 
{ 
    return; 
} 

现在,当我调试我发现,网格绑定成功,但试图将其导出到Excel时,我得到此错误:

"Microsoft JScript runtime error: Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed."

回答

110

我修复了这个问题。由于我使用UpdatePanel,我添加了下面的代码在Page_Load活动页面和它的工作对我来说:

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

什么,如果脚本管理器是在母版页? –

+0

@ShivaPareek它应该以任何方式工作,但如果它不放置一个ScriptManagerProxy并使用它! – Peter

+0

我已经使用了这种方法,整个页面都被重新加载。 IsPostBackProperty = false会导致不导出事件导出?可能是什么问题? –

2

一下添加到您pageLoad的,它会解决你的问题:

ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page); 
scriptManager.RegisterPostBackControl(this.lblbtndoc1); 
14

在我的情况下,该问题是由网站(后面的代码)的一些Response.Write命令造成的。他们在那里只是为了调试的目的(这是不是最好的方法,我知道)...

+0

也有同样的问题..一些调试响应写入国家选定后停止更新城市下拉菜单。 – Shaakir

2

我有同样的错误,那么我想的<asp:PostBackTrigger ControlID="xyz"/>代替AsyncPostBackTrigger。这为我工作。这是因为我们不想要部分回传。

3

1- 从不使用Response.Write。

2 - 我把下面的代码创建后(未在Page_Load中)一个LinkBut​​ton(动态),解决了我的问题:

ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page); 
scriptManager.RegisterPostBackControl(lblbtndoc1); 
+0

我认为特别响应写入更好的方法是在你想调试的页面上启用跟踪并使用Trace.Write。 –

0

This为我工作过,但有加(下图)。

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

我在我的按钮上注册了一个脚本,在其事件完成处理后点击另一个按钮。为了使它工作,我必须从更新面板中删除另一个按钮(以防有人面临同样的问题)。

2

我加控制在更新面板中的Triggers标签:

</ContentTemplate> 
    <Triggers> 
     <asp:PostBackTrigger ControlID="exportLinkButton" /> 
    </Triggers> 
</asp:UpdatePanel> 

这样的exportLinkBut​​ton将触发UpdatePanel的更新。
更多信息here

3

对于我VB.Net好友 -

Dim scriptManager As ScriptManager = scriptManager.GetCurrent(Me.Page) 
scriptManager.RegisterPostBackControl(Me.YourButtonNameHere) 
相关问题