2012-06-27 70 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) 
相關問題