我如何在运行时更改母版页

时间:2011-09-25 21:42:04

标签: asp.net

我希望从我的网站每次回发动态更改其母版页。

我写了这段代码

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

但是当表单第一次发回时,主页面发生了变化,但第二次没有! 。我认为这是因为当页面重新加载时,主(第一个)主页面返回!! 我怎么能解决这个问题?

1 个答案:

答案 0 :(得分:1)

问题是ASP.NET每次从头开始解析页面(即每个请求),并将主页面设置为.aspx标记中声明的页面。页面的先前状态在初始化阶段后加载,此时已经设置了母版页。这意味着如果页面声明包含类似

的内容
<%@ Page ... MasterPageFile="MasterPage1.master" ... %>

然后PreInit事件MasterPageFile属性将始终设置为"MasterPage1.master",无论之前的母版页是什么。

使用您当前的代码,一切都是这样的。首次加载页面主文件时MasterPage1.master,因此更改为MasterPage2.master,一切都按预期工作。但是,第二个加载主文件仍然 MasterPage1.master(因为它在.aspx中声明),因此它再次更改MasterPage2.master,并且看起来没什么变化。

要解决这个问题,请查看this answer。由于ViewState上没有PreInit,因此会在此处使用会话来决定应加载哪个母版页。您可能希望通过存储在会话之前的母版页中来扩展此代码。