2012-06-27 23 views
47

Mam widok siatki na mojej stronie i chcę go wyeksportować do arkusza Excela, Poniżej znajduje się kod, który napisałem, aby wykonać to zadanie , ja tu już przekazując zbiór danych do metody wiążą się z siatki i btnExcelExport znajduje się przycisk, który będzie eksportować siatki zawartość do arkusza Excel: -Sys.WebForms.PageRequestManagerParserErrorException: Wiadomość odebrana z serwera nie mogła zostać przeanalizowana

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

teraz kiedy jestem debugowania okazało się, że siatka jest powiodło się, ale przy próbie eksportu do programu Excel pojawia się następujący błąd:

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

Odpowiedz

110

Rozwiązałem ten problem. Ponieważ używam UpdatePanel dodałem poniżej kodu w przypadku Page_Load strony i pracował dla mnie:

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

co jeśli menedżer skrypt jest w stronę wzorcową? –

+0

@ShivaPareek powinno działać w dowolny sposób, ale jeśli nie umieszcza ScriptManagerProxy i używa tego! – Peter

+0

Użyłem tego podejścia, a cała strona jest przeładowana. IsPostBackProperty = false, które skutkuje niepodpalaniem zdarzenia dla eksportu? Jaki może być problem? –

2

Dodaj ci tego pageload i będzie rozwiązać problem:

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

W moim przypadku problem został spowodowany przez niektóre komendy na stronie internetowej (kod z tyłu). Byli tam tylko do celów debugowania (to nie jest najlepszy sposób, wiem) ...

+0

miał ten sam problem .. niektóre odpowiedzi na pytanie dotyczące debugowania zatrzymały aktualizację listy rozwijanej miast po wybranym kraju. – Shaakir

2

Miałem ten sam błąd, a następnie próbowałem <asp:PostBackTrigger ControlID="xyz"/> zamiast AsyncPostBackTrigger .To pracował dla mnie. Dzieje się tak dlatego, że nie chcemy częściowego oddzwonienia.

3

1- Nigdy nie używaj Response.Write.

2- umieścić poniższy kod po tworzyć (nie w Page_Load) do LinkButton (dynamicznie) i rozwiązać mój problem:

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

Przypuszczam, że lepszym podejściem do zapisu odpowiedzi ad-hoc byłoby włączenie śledzenia na stronie, którą chcesz debugować i użycie Trace.Write. –

0

This pracował dla mnie też, ale z dodatkiem (poniżej).

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

Rejestruję skrypt na moim przycisku, aby kliknąć inny przycisk po zakończeniu jego przetwarzania. Aby to zadziałało, musiałem usunąć drugi przycisk z panelu aktualizacji (na wypadek, gdyby ktoś miał ten sam problem).

2

dodałem kontrolę do znacznika w panelu aktualizacji Triggers:

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

ten sposób exportLinkButton wywoła UpdatePanel zaktualizować.
Więcej informacji here.

3

Dla moich VB.Net Friends -

Dim scriptManager As ScriptManager = scriptManager.GetCurrent(Me.Page) 
scriptManager.RegisterPostBackControl(Me.YourButtonNameHere) 
Powiązane problemy