簡體   English   中英

在后面的代碼中將UpdatePanel轉換為Panel

[英]Convert UpdatePanel to Panel in code behind

在編輯過程中,我在某些自定義控件和母版頁中使用的CMS與UpdatePanels發生沖突。 我想將它們動態地轉換為Page_Load或Page_Init上的常規面板,或者基於是否正在編輯頁面而將其轉換為常規面板。

我想將頁面上的所有UpdatePanels動態轉換為Panels。 找到UpdatePanels沒問題,我的所有頁面都繼承自一個公共基類,我的所有控件都繼承自一個公共基類-因此我可以覆蓋Page_Init或其他任何東西。

我懷疑我無法將UpdatePanel隱藏到常規面板中。 我考慮過可能要找到UpdatePanel,將面板添加到UpdatePanel的父級,然后遍歷每個UpdatePanel的控件,然后將它們添加到新的Panel中,然后刪除UpdatePanel。

但是,如果我添加一個新的面板,它將在末尾,您可以在中間添加一個面板嗎……也許使用插入? 這應該不難,但是我使它太難了嗎? 有沒有更簡單的方法? 有人做過這樣的事情嗎?

謝謝,埃里克

更新最后,我根據Philippe在http://msmvps.com/blogs/luisabreu/archive/2006/11/16/adding-removing上的注釋將其移動后,在MasterPage基類上覆蓋了OnInit函數以將UpdatePanel讀取到ScriptManager -updatepanels-dynamicaly-from-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 });
}

我很確定不會有將UpdatePanel轉換為Panel的方法-至少沒有簡單的方法。 當您將UpdatePanel添加到頁面時,.Net將添加帶有大量JavaScript的腳本引用,以使UpdatePanel正常工作。 這可能/可能是您的CMS遇到的問題。 通常,這些包可能會與某些.Net Ajax javascript函數(例如$ get或類似的東西)發生名稱沖突。

如果堅持使用有時使用UpdatePanel而有時不使用UpdatePanel的模型,則唯一的解決方案是在頁面上放置一個面板,並在每次使用它時在代碼后動態構建UpdatePanel。

我傾向於同意勞爾的看法,您可能應該嘗試找出另一個原因。 如果您的CMS不喜歡,請嘗試使用UpdatePanels之外的其他ajax方法(PageMethods,jQuery .ajax調用或老式的JavaScript XMLHttprequest)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM