5

ASP.NET 4.0 Webアプリケーションには、UpdatePanelでラップされたユーザーコントロールがあります(以下のコードを参照)。

<asp:UpdatePanel ID="UpdatePanel5" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <UC:MyCustomCtrl ID="customCtrl" runat="server" />
    </ContentTemplate>
</asp:UpdatePanel>

明らかに、これは非同期で発生するため、ユーザーコントロールでポストバックを引き起こすすべてのASP.NETコントロールに最適です。ただし、これが機能しないプロセスが1つあります。

サーバーに非同期要求を行うユーザーコントロールにASP.NETボタン(レポートの作成)があります。次に、サーバーはExcelスプレッドシートを作成し、そのスプレッドシートをHttpResponseに配置して、クライアントのブラウザーに送り返し、クライアントが開いたり保存したりできるようにします。ただし、サーバーへの要求は非同期であり、非同期要求中にHttpResponseにバイナリを配置できないため、この時点で爆発します。

これを回避するにはどうすればよいですか?

4

4 に答える 4

12

このボタンをユーザーコントロールのPage_Load方法で同期ポストバックコントロールとして登録します。ScriptManager.GetCurrent(Page).RegisterPostBackControl(CreateReportButton);

于 2012-09-20T16:47:49.340 に答える
0

更新パネル内のトリガーを使用して、カスタムコントロールと、コントロール内のレポートボタンに登録されているイベントを参照します。

<Triggers>
     <asp:PostBackTrigger ControlID="customCtrl" EventName="ReportButtonClicked" />
</Triggers>
于 2012-09-20T16:20:17.553 に答える
0

完全なポストバックを可能にするトリガーをUpdatePanelsに追加できます。これが例です

<asp:UpdatePanel ID="UpdatePanel5" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <UC:MyCustomCtrl ID="customCtrl" runat="server" />
    </ContentTemplate>
    <Triggers>
        <asp:PostBackTrigger ControlID="btnID" />
    </Triggers>
</asp:UpdatePanel>
于 2012-09-20T16:20:37.413 に答える
0

エリックの答えに似ています。私はこれを試していませんが、うまくいくかもしれません...

<asp:UpdatePanel ID="UpdatePanel5" runat="server">
    <ContentTemplate>
        <UC:MyCustomCtrl ID="customCtrl" runat="server" />
    </ContentTemplate>
    <Triggers>
        <asp:PostBackTrigger ControlID="customCtrl$btnID" />
    </Triggers>
</asp:UpdatePanel>

しばらく前に検証コントロールのためにこれに似たようなことをしたので、ここでも機能するのは当然のようです。

DOMビューア(私はChromeの要素インスペクターを使用)を使用して、ボタンの「名前」(IDではない)を確認します。そして、全体的なユーザーコントロールの名前を含む部分から始めて、残りを使用します。

于 2014-01-23T13:57:15.953 に答える