Конвертировать UpdatePanel в Panel в коде позади - PullRequest
2 голосов
/ 25 октября 2010

CMS, которую я использую, борется с UpdatePanels в некоторых моих пользовательских элементах управления и главных страницах во время редактирования.Я хотел бы динамически преобразовать их в обычные панели на Page_Load или Page_Init или что-то в зависимости от того, редактируется ли страница.

Я бы хотел динамически преобразовать все панели обновления на странице в Панели.Поиск UpdatePanels не проблема, все мои страницы наследуются от общего базового класса, а все мои элементы управления наследуются от общего базового класса - так что я могу переопределить Page_Init или любой другой.

Я подозреваю, что могускрыть панель обновления в обычную панель.Я подумал о том, чтобы найти UpdatePanel, добавить Panel к родительскому элементу UpdatePanel, затем просмотреть все элементы управления UpdatePanel и добавить их в новую Panel, а затем удалить UpdatePanel.

Но если я добавлю новую Panel, это будет в конце, вы можете добавить панель в середине ... может быть, с помощью вставки?Это не должно быть сложно, но я делаю это слишком сложно?Есть ли более простой способ?Кто-нибудь когда-нибудь делал подобные вещи?

Спасибо, Эрик

Обновление В итоге я переопределил функцию OnInit в своем базовом классе MasterPage, чтобы после этого считывать 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 голосов
/ 25 октября 2010

Я почти уверен, что не будет способа конвертировать UpdatePanel в Panel - по крайней мере, нет простого способа. Когда вы добавляете UpdatePanel на свою страницу, .Net добавит ссылку на скрипт со множеством javascript, чтобы заставить UpdatePanel работать. Возможно / вероятно, это то, с чем у вашей CMS возникают проблемы. Зачастую эти пакеты могут столкнуться с именами некоторых Javascript-функций .Net Ajax, таких как $ get или что-то в этом роде.

Единственное решение, если вы настаиваете на том, чтобы иногда использовать UpdatePanel, а иногда нет, - это разместить панель на странице и динамически создавать UpdatePanel в коде каждый раз, когда вы хотите его использовать.

Я склонен согласиться с Раулем, что вам, вероятно, следует попытаться выяснить другое, почему. Попробуйте использовать другие методы ajax, отличные от UpdatePanels (PageMethods, вызовы jQuery .ajax или старый добрый javascript XMLHttprequest), если ваша CMS не любит их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...