我有三个主页,如Master-Green, Master-Bule, Master-Red
。在每个母版页中都有三个名为green, blue and red
的按钮
现在是我的default master is green
,
分配了一个页面Default.aspx
。此时三个按钮也显示在顶部。
如何点击“蓝色”按钮意味着Master-Blue shold是当前页面的母版页?
答案 0 :(得分:3)
< input
type =“submit
”name =“btnGreen
”value =“Green”/>
< input
type =“submit
”name =“btnBlue
”value =“Blue”/>
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";
}
}
}
答案 1 :(得分:2)
处理动态母版页可能看起来很容易,但有点棘手。
请考虑以下事项:
MasterPage实际上被视为页面的子控件,因此,其生命周期与页面上的任何其他控件一样
为了在runetime更改MasterPage,必须在页面的PreInit
事件中完成(请记住控件没有此事件,因此MasterPage也没有)
提醒一下,页面生命周期的PreInit
,Init
和Load
事件的工作方式如下:页面的PreInit
事件被触发,后面是页面的子控件(包括MasterPage)的所有Init
事件,当所有子Init
事件被引发时,页面的Init
事件被触发,最后页面的InitComplete
事件被触发1}}触发事件,指示已处理所有Init
个事件。 Load
事件以相反的方式工作,首先触发页面的Load
事件,然后触发所有子控件的Load
事件,最后触发页面的LoadComplete
事件
在所有子控件的Load
事件被触发后但在页面的LoadComplete
事件发生之前,引发了导致页面回发的回发事件 p>
在PreInit
事件中,您无权访问ViewState页面
来源:http://msdn.microsoft.com/en-us/library/ms178472.aspx
快速查看:
那么为什么这么重要呢?
在您的示例中,您有三个按钮,每次按下按钮,您需要更改MasterPage,但必须在页面的PreInit
事件中更改MasterPage,但您的按钮处理程序在之后处理那么,棘手的部分是调用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
,则在下次向该页面发帖之前,您将看不到页面主页的更改
所以这很棘手,在我看来,我们应该能够更轻松地做到这一点,再一次,ASP.Net页面的生命周期根本没有帮助。
您可以随时关注@AndreCalil关于仅为您的网站使用一个母版页和不同CSS布局的建议
我忘记提到的一件事是,您需要在所有页面中设置主页面,使用动态MasterPage,因此最好的方法是创建基页和继承自它,并在基页中编写PreInit
事件中的代码来设置MasterPage