web-dev-qa-db-ja.com

Response.WriteとUpdatePanel

次のコードスニペットを使用して、クライアントに送信するvcardを生成します。

Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", fileNameOnly));
Response.ContentType = "text/x-vcard";
Response.ContentEncoding = Encoding.GetEncoding("ISO-8859-1");
Response.Write(vCard.ToString());
Response.End();

ただし、内部にコントロールがあり、UpdatePanelがあるページでvCardを使用する必要があります。残念ながら、 更新パネルと応答書き込み によると、これは機能せず、エラーが発生します。 vcard /ファイルの内容をクライアントのブラウザに送信し、Response.Writeを含まない「開く/保存」ダイアログを表示させる別の方法は何ですか?

13
laconicdev

非同期ポストバック中にResponse.Writeを使用することはできません。そのコードを実行するコントロールはすべて、更新パネルにPostBackTriggerとして追加する必要があります。

<Triggers>        
    <asp:PostBackTrigger ControlID="Button1" />
</Triggers>

必要に応じて、コードビハインドで実行することもできます。

ScriptManager.GetCurrent().RegisterPostBackControl(Button1);
38
James Johnson

Vcardを提供するために別のハンドラー/ページを使用することを検討してみませんか?

これはおそらくそれを行うための最も簡単でクリーンな方法であり、updatepanelに関連する他の(非同期かどうかに関係なく)ポストバックを妨害しません。

1
Alex Pollan

Response.Writeでも同様の問題が発生しました。私はこの問題の回避策またはおそらく解決策を見つけました。サーバーコントロールのTextWriterに与えられたRenderBeginTagをキャプチャし、それに書き込みます。

ここに例を挙げてブログを書きました: http://timscyclingblog.wordpress.com/2013/03/07/asp-net-web-forms-response-write-in-an-updatepanel-dev-web/

1
user2000095-tim

Response.Writeは非同期イベントでは機能しません。私の提案は、更新パネルがVCardの観点からのみ使用されている場合は、更新パネルを削除することです。

または-更新パネル内にコントロールを配置し、非同期イベントでその値を初期化します。今それは動作します。

1
Pankaj