2012-09-20 32 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)。並從包含整個用戶控件名稱的部分開始,使用其餘部分。