2010-05-24 57 views
4

我已經創建了自定義服務器端WebControl。該控件調用一個初始化腳本,該腳本使用jQuery將加載頁面時調用的事件與鏈接進行綁定。使用jQuery的自定義WebControl,需要在UpdatePanel中工作

此控件現在在UpdatePanel中使用,顯然客戶端事件不再存在於UpdatePanel之後。所以,如果控件作爲局部頁面刷新的一部分被重新渲染,我需要重新運行我的初始化腳本,但我沒有看到這樣做的好方法。

我知道ScriptManager.IsInAsyncPostBack和UpdatePanel.IsInPartialRendering,但他們似乎並沒有提供我所需要的。它似乎正確實現了這一點,我將不得不檢查ScriptManager.IsInAsyncPostBack == true,然後在控件樹中搜索具有IsInPartialRendering == true的UpdatePanel。如果我找到這樣的UpdatePanel,那麼我重新運行我的初始化腳本。

聽起來很可怕。我錯過了一些簡單的東西嗎我不能成爲唯一一個以這種方式生活的人。

感謝您的閱讀!

+0

現在更糟,UpdatePanel.IsInPartialRendering從未返回true,所以即使是討厭的解決辦法是行不通的。 – 2010-05-26 17:16:03

回答

2

您是否嘗試過使用下面SO帖子中描述的方法? jQuery $(document).ready and UpdatePanels?

這是我在更新面板中使用jQuery時所做的工作,它始終適用於我。

+0

我的情況比這更復雜。我處於自定義WebControl中,需要在所有情況下都能正常工作,並且可能會在單個頁面上多次出現。我想要在pageRequestManager中像那樣處理它,我必須分離所有現有的處理程序,然後重新連接它們。我想這是可行的,但我希望有更清潔的東西。 – 2010-05-26 13:46:26

0

必須做我害怕的事情...同樣,Update.IsInPartialRendering不起作用,所以你必須使用反射來確定updatePanel是否得到更新。所以,如果IsControlBeingRendered是真的,那麼運行你的腳本。

 public static bool IsControlBeingRendered(ScriptManager scriptManager, Control control) 
     { 

      if (scriptManager.SupportsPartialRendering && scriptManager.IsInAsyncPostBack) 
      { 
      UpdatePanel updatePanel = ControlHelper.FindParentByType<UpdatePanel>(control); 

      while (updatePanel != null) 
      { 
       if (IsBeingUpdated(updatePanel)) 
       { 
       return true; 
       } 
       else 
       { 
       updatePanel = ControlHelper.FindParentByType<UpdatePanel>(updatePanel); 
       } 
      } 
return false; 
      } 

      return true; 
     } 


    public static bool IsBeingUpdated(UpdatePanel updatePanel) 
    { 
     // unfortunately, updatePanel.IsInPartialRendering does not work. So, we must use reflection 
     // to check the protected property that actually does work.. 

     if (updatePanel == null) 
     return false; 

     Type type = updatePanel.GetType(); 
     BindingFlags bindingFlags = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetProperty; 

     return (bool)type.InvokeMember("RequiresUpdate", bindingFlags, null, updatePanel, null); 
    } 
+0

這並不總是奏效!在updatemode = conditional的情況下使用updatePanel時會出現問題。 自定義控件開發人員如何處理這種情況?!?! – 2010-07-21 14:11:30

+0

當UpdateMode = Conditional時,似乎RequiresUpdate屬性不正確,除非明確調用Update(),否則它應該是。 – 2010-07-21 17:46:31

相關問題