更新パネルがあり、PostBackTriggerイベントで進行状況を更新しています。しかし、ボタンをクリックしても更新の進行状況が表示されません。以下のサンプルコードを見つけてください
<asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="updatepanelDropDownTaskType" CssClass="Token-setup-popup" DynamicLayout="true">
<ProgressTemplate>
<div id="loading" class="loading">
<asp:Image runat="server" ID="imgBusyIndicator" ImageUrl="~/images/busy-indicator.gif" />
</div>
</ProgressTemplate>
</asp:UpdateProgress>
<asp:UpdatePanel ID="updatepanelDropDownTaskType" runat="server" UpdateMode="Conditional">
<Triggers>
<asp:PostBackTrigger ControlID="btnExport" />
</Triggers>
<ContentTemplate>
<asp:Button ID="btnExport" runat="server" Text="Export To CSV" CssClass="button" CausesValidation="true" onclick="btnExport_Click" ClientIDMode="Static"/></asp:Button>
</ContentTemplate>
</asp:UpdatePanel>
背後にある私のコード
HttpResponse Response = System.Web.HttpContext.Current.Response;
Response.ClearHeaders();
Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName);
Response.ContentType = FileType;
Response.Write(content);
HttpContext.Current.ApplicationInstance.CompleteRequest();
最後に、sys.webformsのiframeとendrequestHandlerを使用して、このタスクを実行しました。私は私のブログで明確に説明しました、リンクを見つけてください http://bhuvanram.wordpress.com/ 。 Completeメソッドは、同じページで呼び出すのではなく、Iframeで呼び出す必要があります
さてあなたのコードは大丈夫です。問題は、Triggers
で使用しているUpdatePanel
にあります。
マイクロソフトは言う
UpdateProgress
コントロールは、関連付けられたUpdatePanel
コントロールがasynchronous
postbackを引き起こしたかどうかに応じて、表示または非表示になる<div>
要素をレンダリングします。 初期ページレンダリングおよびsynchronous
ポストバックの場合、UpdateProgress
コントロールは表示されません。
[〜#〜] msdn [〜#〜]の詳細を参照してください
したがって、PostBackTrigger
でUpdatePanel
を使用しているため、synchronous
ポストバックが発生し、UpdateProgress
は表示されません。
<Triggers>
<asp:PostBackTrigger ControlID="btnExport" />
// Incorrect
</Triggers>
に変更します
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnExport" />
// Correct
</Triggers>
そして、これはあなたのUpdateProgress
を表示し、あなたが期待しているように機能します。
コメントで述べたように、Grid
でもダウンロードを実行しています。同じ方法で、Button
をScriptManager
に登録できます。これにより、ボタンが登録され、asynchronous
ポストバック中にダウンロードボタンが認識されます。
protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
Button btnExport = e.item.FindControl("btnExport") as Button;
if (btnExport != null)
{
((ScriptManager)this.Page.Master.FindControl("ID of your Script manager")).RegisterPostBackControl(downloadDocColumn);
// In Above line i assumed Script Manager is placed on Your master page.
}
}
}
お役に立てれば...
あなたのシナリオに役立つかもしれない「AjaxablePanel」(ブログ投稿で説明されている用語)を書きました。
http://leftyftw.wordpress.com/2011/10/01/an-ajaxable-panel/
これはSharePointを対象としていますが、ここでは完全に適用できます。
System.webの下のweb.configファイルに以下を追加してみてください
<xhtmlConformance mode="Transitional"/>
コードが完璧であれば、問題が解決する可能性があります。問題が解決した場合は、回答として投票してください。