2012-09-20 30 views
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中放置一个二进制文件。

我该如何解决这个问题?

回答

11

注册此按钮,用户控件的Page_Load方法同步回传控制:ScriptManager.GetCurrent(Page).RegisterPostBackControl(CreateReportButton);

+0

谢谢。不久前,我得到了类似的答案。但它们本质上是一样的 - 用ScriptManager注册控件。在我的情况下,它涉及到在用户控件上找到控件,然后用ScriptManager注册它。 – Jagd

0

利用更新面板中的触发器来引用自定义控件和控件中报告按钮上注册的事件,例如,

<Triggers> 
    <asp:PostBackTrigger ControlID="customCtrl" EventName="ReportButtonClicked" /> 
</Triggers> 
+0

已经尝试过。该按钮位于自定义控件的内部,并且试图将该按钮的名称用作触发器将不会编译。 – Jagd

+0

正确的,将不得不在自定义控件中注册一个事件,然后以这种方式引用它,将进行编辑。 – Turnkey

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> 
+0

已经尝试过。该按钮位于自定义控件的内部,并且试图将该按钮的名称用作触发器将不会编译。 – Jagd

+0

那么是否有可能将该特定用户控件从更新面板中取出? –

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)。并从包含整个用户控件名称的部分开始,使用其余部分。