我有三个母版页,例如Master-Green, Master-Bule, Master-Red
. 在每个母版页中都有三个名为green, blue and red
.
现在我default master is green
的
它被分配了一个页面Default.aspx
。这时三个按钮也显示在上面。
如何使单击“蓝色”按钮意味着 Master-Blue 成为当前页面的母版页?
我有三个母版页,例如Master-Green, Master-Bule, Master-Red
. 在每个母版页中都有三个名为green, blue and red
.
现在我default master is green
的
它被分配了一个页面Default.aspx
。这时三个按钮也显示在上面。
如何使单击“蓝色”按钮意味着 Master-Blue 成为当前页面的母版页?
< input
type=" submit
" name=" btnGreen
" value="绿色" />
< input
type=" submit
" name=" btnBlue
" value="蓝色" />
2.然后从后面的代码中可以查看被点击的按钮的名称,在Page_PreInit事件的Request对象中
public partial class Default : System.Web.UI.Page
{
protected void Page_PreInit(object sender, EventArgs e)
{
if (Request["btnGreen"] != null)
{
Page.MasterPageFile = "/Green.Master";
}
else if (Request["btnBlue"] != null)
{
Page.MasterPageFile = "/Blue.Master";
}
}
}
处理动态母版页乍一看似乎很容易,但有点棘手。
考虑以下:
MasterPage 实际上被视为页面的子控件,因此,它的生命周期与页面上的任何其他控件一样
为了在运行时更改 MasterPage,必须在PreInit
页面事件中完成(请记住,控件没有此事件,因此 MasterPage 也没有)
提醒一下,页面生命周期的PreInit
、Init
和Load
事件的工作方式如下:页面的PreInit
事件被触发,然后是Init
页面的子控件(包括 MasterPage)的所有事件,当所有子Init
事件都被引发时,页面的Init
事件被触发,最后页面的InitComplete
事件被触发,表明所有Init
事件都已被处理。Load
事件反过来工作,首先触发页面事件Load
,然后触发所有子控件的Load
事件,最后触发页面LoadComplete
事件。
引发页面回发的回发事件在所有子控件的事件被Load
触发之后但在页面LoadComplete
事件之前引发
如果PreInit
您无权访问页面 ViewState
来源:http: //msdn.microsoft.com/en-us/library/ms178472.aspx
快速浏览:
那么为什么这如此重要呢?
在您的示例中,您有三个按钮,每次按下按钮时,您都需要更改 MasterPage,但 MasterPage 必须在PreInit
页面事件中更改,但您的按钮处理程序在此之后处理,所以棘手的部分是调用Server.Transfer
以重新处理页面。
笔记。由于您允许用户对 MasterPage 进行个性化设置,因此您需要一种存储其偏好的方式,通常您会使用 cookie 或数据库。在此示例中,为了简单起见,我将使用该Session
对象,但您可以更改它以满足您的需要。
所以这看起来像:
protected void blueMasterPage_Click(object sender, EventArgs e)
{
this.Session["master"] = "BlueMasterPage";
this.Server.Transfer(this.Request.RawUrl);
}
protected void Page_PreInit(object sender, EventArgs e)
{
if (this.Session["master"] != null)
{
this.MasterPageFile = string.Format("~/{0}.master", (string)this.Session["master"]);
}
}
注意:如果您不使用Server.Transfer
,您将不会看到对页面 MasterPage 的更改,直到您下次在页面上发布帖子
所以这很棘手,在我看来,我们应该能够更轻松地做同样的事情,再一次 ASP.Net 页面的生命周期根本没有帮助。
您始终可以遵循@AndreCalil 的建议,即为您的站点仅使用一个母版页和不同的 CSS 布局
我忘了提到的一件事是,您需要在所有使用动态 MasterPage 的页面中设置母版页,因此最好的方法是创建一个基页并从中继承,然后在基页中写入PreInit
事件中设置 MasterPage的代码