在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按钮(Create Report),它向服务器发出异步请求。然后,服务器创建一个Excel电子表格,然后将电子表格放入HttpResponse以发送回客户端的浏览器,以便他们可以打开/保存它。但是,它在这一点上爆炸,因为对服务器的请求是异步的,显然你不能在异步请求期间在HttpResponse中放入二进制文件。
我该如何解决这个问题?
答案 0 :(得分:11)
在用户控件的Page_Load
方法中将此按钮注册为同步回发控件:ScriptManager.GetCurrent(Page).RegisterPostBackControl(CreateReportButton);
答案 1 :(得分:0)
利用更新面板中的触发器来引用自定义控件以及在控件内的报表按钮上注册的事件,例如
<Triggers>
<asp:PostBackTrigger ControlID="customCtrl" EventName="ReportButtonClicked" />
</Triggers>
答案 2 :(得分: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>
答案 3 :(得分:0)
与Eric的答案相似。我没试过这个,但它可能有用......
<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)。从包含整个用户控件名称的部分开始,使用其余部分。