2012-02-06 53 views
1

我有一個最初從MastePage.master繼承的頁面。我想在我的項目的其他地方使用相同的頁面,但使用不同的主頁(MasterPage2.master)。爲此,我使用下面的代碼。動態更改asp內容標籤的MasterPage和ContentPlaceHolderID?

private void Page_PreInit(object sender, EventArgs e) 
    { 
     if (Request.QueryString["Update"].ToString() == "New") 
     { 
      this.MasterPageFile = "MasterPage2.master"; 
      Content con = new Content(); 
      con = (Content)this.FindControl("Content1"); 
      this.Content1.ContentPlaceHolderID = "ContentPlaceHolder2"; 
     } 
    } 

我也試圖將ASP內容標籤的ContentPlaceHolderID設置爲ContentPlaceHolder2這是從MasterPage2.master。最初它是ContentPlaceHolder1。

但我在con =(內容)this.FindControl(「Content1」);

感謝

+0

順便提一下,頁面不會從主頁面「繼承」。他們有一個基本類型,他們已經從中繼承。他們只需引用母版頁並在其中進行渲染。 – 2012-02-06 16:50:32

+0

那麼如何引用相同的頁面以使用不同的母版頁來獲取像這樣的錯誤---在母版頁「MasterPage2」中找不到ContentPlaceHolder'ContentPlaceHolder1'。master「,請在內容頁面中驗證內容控件的ContentPlaceHolderID屬性。 – Tiger 2012-02-06 16:56:12

回答

0

您可以動態地改變母版頁在運行時,但你需要使用相同的ContentPlaceHolder的ID。這樣,您的頁面就可以與主頁面一起工作,而無需在運行時添加額外的代碼來更改ID。

private void Page_PreInit(object sender, EventArgs e) 
{ 
    if (Request.QueryString["Update"].ToString() == "New") 
    { 
     this.MasterPageFile = "MasterPage2.master"; 
    } 
} 

你甚至可以測試你的頁面將與任一母版頁在Visual Studio的設計/標記鑑於在.aspx標記在<% Page %>指令改變MasterPageFile工作。

2

頁面內部存儲在私人'_contentTemplateCollection'哈希表。它使用ContentPlaceHolderID屬性作爲關鍵字並將特殊類(將用於構建/初始化內容標記)作爲值 - 因此,要更改ContentPlaceHolderID值(在標記內定義),需要修改此哈希表,刪除與舊鏈接的舊條目並添加其他條目與新的ID - 您需要更改ContentPlaceHolderId創建母版頁之前,否則將在運行時拋出一個異常 - 最好的地方來改變Ids是Page'preinit'事件,如果更好之前更改Ids母版頁(如果你在運行時更改母版頁)

要更改內容標籤的ContentPlaceHolderID,你可以在頁面PreInit事件中使用下面的函數

public static void AssignContentToNewPlaceHoldersWithinPage(Page pPage, string pOldId, string pNewId) 
{ 
    if (pPage == null || string.IsNullOrEmpty(pOldId) || string.IsNullOrEmpty(pNewId)) 
    { 
     return; 
    } 
    // Try to get a reference to private hashtable using fasterflect free reflection library in codeplex (http://fasterflect.codeplex.com/) 
    // you can replace following line with standard reflection APIs 
    var lTmpObj = pPage.TryGetFieldValue("_contentTemplateCollection"); 
    if (lTmpObj != null && lTmpObj is Hashtable) 
    { 
     var _contentTemplateCollection = lTmpObj as Hashtable; 

     if (_contentTemplateCollection.ContainsKey(pOldId) && !_contentTemplateCollection.ContainsKey(pNewId)) 
     { 
      var lTemplate = _contentTemplateCollection[pOldId]; 
      _contentTemplateCollection.Add(pNewId, lTemplate); 
      _contentTemplateCollection.Remove(pOldId); 
     } 

    } 
} 
  • 函數參數是
  • PPAGE是參照頁面實例包含內容的標籤
  • pOldId是標記ContentPlaceHolderID屬性與價值 - 標識要更改
  • pNewId是要使用新的ID

我希望我的回答將是有益的,我很抱歉,如果我的英語不是很好

0

通過覆蓋OnPreInit可以更改主頁面。

protected override void OnPreInit(EventArgs e) 
{ 
    base.OnPreInit(e); 
    MasterPageFile = "~/MasterPages/MyOther.Master"; 
} 

但是對於ContentPlaceHolders我會建議在這兩個你MasterPages同名創建新ContentPlaceHolders。