web-dev-qa-db-ja.com

更新パネルのPostBackTrigger、更新の進行状況が表示されない

更新パネルがあり、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();
8
Bhuvan

最後に、sys.webformsのiframeとendrequestHandlerを使用して、このタスクを実行しました。私は私のブログで明確に説明しました、リンクを見つけてください http://bhuvanram.wordpress.com/ 。 Completeメソッドは、同じページで呼び出すのではなく、Iframeで呼び出す必要があります

1
Bhuvan

さてあなたのコードは大丈夫です。問題は、Triggersで使用しているUpdatePanelにあります。

マイクロソフトは言う

UpdateProgressコントロールは、関連付けられたUpdatePanelコントロールがasynchronous postbackを引き起こしたかどうかに応じて、表示または非表示になる<div>要素をレンダリングします。 初期ページレンダリングおよびsynchronousポストバックの場合、UpdateProgressコントロールは表示されません。

[〜#〜] msdn [〜#〜]の詳細を参照してください

したがって、PostBackTriggerUpdatePanelを使用しているため、synchronousポストバックが発生し、UpdateProgressは表示されません。

<Triggers>
    <asp:PostBackTrigger ControlID="btnExport" />
    // Incorrect
</Triggers>

に変更します

<Triggers>
    <asp:AsyncPostBackTrigger ControlID="btnExport" />
    // Correct
</Triggers>

そして、これはあなたのUpdateProgressを表示し、あなたが期待しているように機能します。

コメントで述べたように、Gridでもダウンロードを実行しています。同じ方法で、ButtonScriptManagerに登録できます。これにより、ボタンが登録され、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.
         }
     }
  }

お役に立てれば...

6
Mayank Pathak

あなたのシナリオに役立つかもしれない「AjaxablePanel」(ブログ投稿で説明されている用語)を書きました。

http://leftyftw.wordpress.com/2011/10/01/an-ajaxable-panel/

これはSharePointを対象としていますが、ここでは完全に適用できます。

1
Jaime Torres

System.webの下のweb.configファイルに以下を追加してみてください

<xhtmlConformance mode="Transitional"/>

コードが完璧であれば、問題が解決する可能性があります。問題が解決した場合は、回答として投票してください。