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 });
}
答案 0 :(得分:0)
我很确定没有办法将UpdatePanel转换为Panel - 至少没有简单的方法。当您向页面添加UpdatePanel时.Net将添加一个带有大量javascript的脚本引用,以使UpdatePanel正常工作。这可能/可能是您的CMS遇到问题的原因。通常这些软件包可能会与某些.Net Ajax javascript函数(如$ get或类似函数)发生名称冲突。
唯一的解决方案是,如果你坚持有时使用UpdatePanel的模型,有时不坚持 - 就是在页面上放置一个面板,并在每次你想要使用它时在代码后面动态构建UpdatePanel。
我倾向于同意劳尔的意见,你应该试着找出另一个原因。如果您的CMS不喜欢它们,请尝试使用其他一些ajax方法,然后使用UpdatePanels(PageMethods,jQuery .ajax调用或老式的javascript XMLHttprequest)。