2011-09-25 50 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上不可用,所以在那里使用会话来决定应该加载哪个主页面。您可能希望通过在会话之前的母版页中存储来扩展此代码。