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)は正しい情報を持っています。ただし、上記のエラー以外に、[保存/開く]ダイアログボックスは表示されません。

UpdatePanelsを使用しています。

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が発生し続けるのはなぜですか?

エラーメッセージに記載されていることの1つを実行している可能性があります。最も一般的な理由と、それらが機能しない理由は次のとおりです。

Response.Write()の呼び出し: Response.Write()を直接呼び出すことにより、ASP.NETコントロールの通常のレンダリングメカニズムをバイパスします。あなたが書いたビットは、それ以上処理することなくクライアントに直接送られます。

応答フィルター/HttpModules:Response.Write ()と同様に、UpdatePanelが認識しないようにレンダリングを変更できます。

サーバートレースが有効になっている: トレースはResponse.Write()を使用して効果的に書き出されるため、UpdatePanelに使用する特別な形式を台無しにします。

Server.Transfer()の呼び出し: 残念ながら、Server.Transfer()が呼び出されたことを検出する方法はありません。これは、誰かがServer.Transfer()を呼び出したときに、UpdatePanelがインテリジェントなことを何もできないことを意味します。クライアントに返送される応答は、転送先のページからのHTMLマークアップです。HTMLであり、特別な形式ではないため、解析できず、エラーが発生します。

解決策:解析エラーを回避する1つの方法は、 ScriptManager.RegisterPostBackControl() を呼び出して、非同期のポストバックではなく通常のポストバックを実行することです。

EllonLiptonのブログから完全な説明と他の解決策を ここで参照してください

于 2013-02-18T17:45:07.310 に答える
4

応答を変更します。これで終了します。

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

Response.Endは悪い習慣です。スレッドを中止して、httpリクエストのライフサイクルの残りの操作をバイパスし、例外をスローします。

于 2013-02-18T17:40:41.943 に答える
0

応答に何かを書き込む前にResponse.Clear()を試し、次に応答を終了する前にResponse.Flush()を試しましたか?

また、リダイレクトでのHTTP例外エラーを回避するために、Response.End()でtrueの値を渡すことは決して害にはなりません。コードビハインドの残りの部分が、不要な追加の処理を行っていないことを確認してください。

于 2013-02-18T17:37:44.270 に答える
0

UpdatePanelsを介して実行しようとしているため、jQuery Ajaxを使用して、このページへのリクエストを呼び出したときにファイルを取得するために、ページ読み込みイベントの別のページにこのコードを記述してください。新しい応答は、実際には、以前の更新パネル要求への応答として解析する必要のある情報を削除しています。

于 2013-02-18T17:48:30.620 に答える
0

このコードは、aspxの一部のUpdatePanel/AJAXと競合しています。

あなたのaspxにこれを書いてみてください:

コード-これは機能するはずです!:')

于 2016-03-29T07:00:50.767 に答える