Asp.net

嵌套的 UpdatePanel 導致父級回發?

  • July 6, 2016

我的印像是嵌套 UpdatePanel 中的控制項將導致頂級 UpdatePanel 刷新(從而刷新兩個 UpdatePanel),因為該控制項上的任何事件都充當“隱式”觸發器。那是對的嗎?

我一直在嘗試連接這樣的東西-

UserControl

  Parent UpdatePanel

  "Show" button

     ASP:Panel

        Dynamically added UserControls, each with UpdatePanels

點擊 Show 按鈕時,ASP:Panel 變為可見並開始根據某些後端邏輯動態地將 UserControls 添加到自身。

每個動態添加的控制項(以下稱為 UserControls)都有自己的支持 Atlas 的按鈕和連結,因此它們也有 UpdatePanel。目前,當我點擊其中一個 UserControls 中的連結時,ASP:Panel 的全部內容都會消失,就好像它正在重新渲染一樣。我所有動態添加的控制項都消失了,並且它們的點擊事件都沒有被調試器擷取。

我假設這裡發生的事情是駐留在嵌套更新面板中的控制項導致父 UpdatePanel 回發,因為它們正在觸發“隱式”觸發器。有沒有辦法讓我的 UserControls 自主操作而不弄亂包含它們的 ASP:Panel?

如果不是,我應該在這裡採取什麼策略?如果每次在一個(可能很多)UserControls 上發生事件時我都必須重新渲染整個 ASP:Panel,這意味著我將不得不重新創建 UserControls,這需要花費一些精力來創建。我還必須保留某種視圖狀態來重新創建它們。我對 ASP.NET 有點陌生,這聽起來很嚇人。如果可以避免的話,我寧願永遠不要刷新頂層 UserControl 和 ASP:Panel,並讓每個動態添加的 UserControl 觸發並非同步處理它們自己的事件。

編輯:我沒有動態添加控制項,而是將它們添加到標記中(不是一個糟糕的解決方案)。所以擺脫了控制項消失的問題,因為現在控制項不是動態添加而是存在於標記中。但仍然是父 UpdatePanel 發布對性能造成很大影響,因為所有 UserControls 都被發布而不是一個。如何只進行一次 UserControl 回發?另外,我想知道如何擺脫動態添加控制項消失的問題?

首先,請記住:UpdatePanel不會改變頁面的生命週期。

所有的控制樹(包括更新面板)都必須像正常的回發生命週期一樣重建。1 2 UpdatePanel 確保只返回一部分呈現的 (HTML) 視圖。刪除所有 UpdatePanel應該會導致相同的行為,但完整的回發除外。例如,只有表示嵌套 UpdatePanel 的 HTML(可能是因為數據已更改)可能會在 XHR 響應中發回。

要獲得“真正的”AJAX,請考慮頁面方法。或者,DevExpress(也許還有 Telerik 和其他人?)提供他們自己的“回調面板”形式,類似於 UpdatePanel,但可以繞過部分生命週期(因此通常不完全支持 ViewState 模型或者可能會介紹他們自己的怪癖)。


雖然不理解上述內容是控制項“消失”的最可能原因,但這是我的規則:不要讓$$ Nested $$UpdatePanels“自動”工作。

遇到具有動態控制項和嵌套 UpdatePanel 的邊緣情況。可能有一種很好的方法來處理這個問題,但我在多次不同的嘗試中都失敗了。

相反,對於每個更新面板,執行:

UpdateMode="Conditional"
ChildrenAsTriggers="False"

使用“條件”更新模式,請確保根據需要手動指定觸發控制項或呼叫panel.Update()(儘管這會硬連線控制項)。根據需要ChildrenAsTriggers="True"也可以工作。最重要的是 UpdateMode不是預設的“始終”。

切換到這種方法後,我對嵌套的 UpdatePanel沒有任何問題——嗯,幾乎沒有問題。

快樂編碼!


1如果頁面在部分渲染(在 ScriptManager 中)被禁用(例如所有請求都是完整的回發)的情況下不能正確渲染,那麼沒有理由期望/相信它會與 UpdatePanels 一起正常工作。

2有時,必須“欺騙”控制樹中昂貴的重新計算,以獲得不會重新渲染的控制項。但是,我會考慮這些僅在性能分析表明存在特定需求時才應執行的高級案例。

引用自:https://stackoverflow.com/questions/11166779