2009-02-24 126 views

回答

9

剛剛經過測試,它使用嵌套MasterPage的頁面的PreInit工作。

protected void Page_PreInit(object sender, EventArgs e) 
{ 
    this.Master.MasterPageFile = "/Site2.Master"; 
} 

很明顯,您需要確保ContentPlaceholderIds在您要交換的頁面之間保持一致。

+0

嗯是的,這是一個解決方案。不幸的是,這意味着將代碼放入每個使用Master頁面的頁面中,而不是放在一個地方。 我不確定哪個是兩個邪惡少的人...複製Master Page以便有兩個副本會少得多! – 2009-02-24 14:55:54

3

我們將Andy的方法與「BasePage」類相結合 - 我們創建一個繼承自System.Web.UI.Page的類,然後我們所有的頁面都從這個類繼承。

然後,在我們的基礎頁面類中,我們可以執行相關的檢查來查看應該使用哪個根主控頁面 - 在我們的例子中,我們有一個「演示」主控和一個「創作」主控 - 所有的導航和頁面傢俱,以及沉重的顯示CSS,而創作大師還有一些額外的JS用於創作工具,更輕的CSS,並且沒有導航(這是我們在用戶實際創作頁面時使用的,而不是修改現場佈局)。

然後,此基頁可以調用Page.Master.MasterPageFile並將其設置爲創作主,如果這是頁面的正確狀態。

2

萬一有人碰到這個蹣跚而流淚了頭髮用「內容控件必須是頂級的控制在內容頁或引用母版頁嵌套母版頁」的錯誤嘗試安迪的代碼時,擺脫this.Master。所以,代碼變爲:

protected void Page_PreInit(object sender, EventArgs e) 
{ 
    MasterPageFile = "/Site2.Master"; 
} 

編輯作爲Zhaph指出的下方,我的代碼^^只會改變當前頁面的主人,而不是主人的主人。這是Hainesy在他提到「」時所談論的代碼,我們都知道動態更改主頁面「」(我沒有這麼做)。如果你碰巧通過谷歌搜索「計算器變化母版頁」(這是我做的)來訪問此頁面那麼這可能是你要找的:-)

+0

但是這隻會改變內部主頁面,而不會改變Hainesy想要的外部頁面。我會說你和一個沒有內部主人所需佔位符的外部主人有關係。 – 2009-05-14 21:48:52

0

要添加到的答案代碼Zhaph - Ben Duguid,(順便提一句):

以下是設置嵌套母版頁母版頁的示例代碼。所有頁面都從這個BasePage繼承,所以這個代碼只存在於一個地方。

public class BasePage : System.Web.UI.Page 
{ 
    private void Page_PreInit(object sender, System.EventArgs e) 
    { 
     if (Request.Browser.IsMobileDevice) 
     { 
      if (Page.MasterPageFile == "~/master/nested.master")) 
      { 
       Page.Master.MasterPageFile = "~/master/mobile.master"; 
      } 
      else 
      { 
       MasterPageFile = "~/master/mobile.master"; 
      } 
     } 
    } 
}