在后面的代码中将UpdatePanel转换为Panel

时间:2010-10-25 02:05:27

标签: c# asp.net user-controls updatepanel

CMS在编辑过程中使用了一些自定义控件和母版页中的UpdatePanels。我想将它们动态转换为Page_Load或Page_Init上的常规面板,或者根据页面是否正在被编辑。

我想将页面上的所有UpdatePanel动态转换为Panels。查找UpdatePanel不是问题,我的所有页面都从公共基类继承,并且我的所有控件都从公共基类继承 - 所以我可以覆盖Page_Init或其他任何内容。

我怀疑我无法将UpdatePanel转换为常规Panel。我想过可能找到UpdatePanel,将一个Panel添加到UpdatePanel的父级,然后遍历每个UpdatePanel的控件并将它们添加到新的Panel,然后删除UpdatePanel。

但是如果我添加一个新的面板,它会在最后,你可以在中间添加一个面板......也许是插入?这应该不难,但我是否太难了?有更简单的方法吗?有人做过这样的事吗?

谢谢, 埃里克

更新 我最终覆盖了我的MasterPage基类上的OnInit函数,在根据Philippe的评论移动后,将UpdatePanel读入ScriptManager http://msmvps.com/blogs/luisabreu/archive/2006/11/16/adding-removing-updatepanels-dynamicaly-from-a-page.aspx

protected override void OnInit(EventArgs e)
{
   if (Page is CMSPage && Page.IsDesignMode())
   {
      foreach (UpdatePanel up in this.FindControls<UpdatePanel>())
      {
         up.Load += UpdatePanel_Load;
      }
   }

   base.OnInit(e);
}

private void UpdatePanel_Load(object sender, EventArgs e)
{
   UpdatePanel panel = sender as UpdatePanel;

   MethodInfo m = (from methods in typeof(ScriptManager).GetMethods(BindingFlags.NonPublic | BindingFlags.Instance)
      where methods.Name.Equals("System.Web.UI.IScriptManagerInternal.RegisterUpdatePanel")
         select methods).First();

   if (panel == null || m == null)
      return;

   m.Invoke(ScriptManager.GetCurrent(Page), new object[] { panel });
}

1 个答案:

答案 0 :(得分:0)

我很确定没有办法将UpdatePanel转换为Panel - 至少没有简单的方法。当您向页面添加UpdatePanel时.Net将添加一个带有大量javascript的脚本引用,以使UpdatePanel正常工作。这可能/可能是您的CMS遇到问题的原因。通常这些软件包可能会与某些.Net Ajax javascript函数(如$ get或类似函数)发生名称冲突。

唯一的解决方案是,如果你坚持有时使用UpdatePanel的模型,有时不坚持 - 就是在页面上放置一个面板,并在每次你想要使用它时在代码后面动态构建UpdatePanel。

我倾向于同意劳尔的意见,你应该试着找出另一个原因。如果您的CMS不喜欢它们,请尝试使用其他一些ajax方法,然后使用UpdatePanels(PageMethods,jQuery .ajax调用或老式的javascript XMLHttprequest)。