2011-09-25 67 views
0

我想從我的網站每次回發動態更改其母版頁面。我如何在運行時更改主頁面

我寫了這個代碼

protected void Page_PreInit(object sender, EventArgs e) 
    { 
     if (IsPostBack) 
      MasterPageFile = (MapPath(this.MasterPageFile) == MapPath("MasterPage1.master"))?"MasterPage2.master":"MasterPage1.master"; 
    } 

但當形式調回第一次,母版頁更改,但第二次沒有! 。我認爲這是因爲當頁面重新加載時,主要(第一個)主頁面返回! 我該如何解決這個問題?

+0

所以這應該是交替在: 戰後初期:MP1 帖子:MP2 帖子:MP1 帖子:MP2 帖子:MP1 –

+0

嘗試刪除,如果(的IsPostBack)條件,看它是否有效,你期待 – sll

+0

@Brian是的,正好...... – dotfreelancer

回答

1

問題是,ASP.NET每次(從每一個請求)解析頁面,並將主頁設置爲.aspx標記中聲明的頁面。頁面的前一個狀態在之後被加載初始化階段,當主頁面已經被設置時。這意味着,如果頁面聲明包含類似

<%@ Page ... MasterPageFile="MasterPage1.master" ... %> 

然後在PreInit事件MasterPageFile屬性將始終被設置爲"MasterPage1.master",不管是以前的母版頁。

隨着你現在的代碼,一切工作就像那樣。首次加載頁面主文件時爲MasterPage1.master,因此將其更改爲MasterPage2.master,所有內容均按預期工作。但是在第二個加載主數據庫上仍然是MasterPage1.master(因爲它是在.aspx中聲明的),因此它將再次更改爲MasterPage2.master,並且它看起來沒有任何更改。

要解決這個問題,請查看this answer。由於ViewStatePreInit上不可用,所以在那裏使用會話來決定應該加載哪個主頁面。您可能希望通過在會話之前的母版頁中存儲來擴展此代碼。