使用jQuery的自定义WebControl,需要在UpdatePanel中工作

问题描述:

我已经创建了自定义服务器端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

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

这是我在更新面板中使用jQuery时所做的工作,它始终适用于我。

+0

我的情况比这更复杂。我处于自定义WebControl中,需要在所有情况下都能正常工作,并且可能会在单个页面上多次出现。我想要在pageRequestManager中像那样处理它,我必须分离所有现有的处理程序,然后重新连接它们。我想这是可行的,但我希望有更清洁的东西。 – 2010-05-26 13:46:26

必须做我害怕的事情...同样,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