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 控件都非常有用,因为它使它异步发生。但是,有一个过程不适用!

我在用户控件中有一个 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

类似于埃里克的回答。我没有尝试过这个,但它可能会工作......

<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 回答
0

您可以将触发器添加到允许完整回发的 UpdatePanel。这是一个例子

<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 回答