单击master中的按钮时更改母版页

时间:2012-07-02 05:38:56

标签: c# asp.net c#-4.0 master-pages

我有三个主页,如Master-Green, Master-Bule, Master-Red。在每个母版页中都有三个名为green, blue and red的按钮 现在是我的default master is green

分配了一个页面Default.aspx。此时三个按钮也显示在顶部。

如何点击“蓝色”按钮意味着Master-Blue shold是当前页面的母版页?

2 个答案:

答案 0 :(得分:3)

  1. 在母版页中使用输入类型提交按钮
  2. < 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也没有)

  • 提醒一下,页面生命周期的PreInitInitLoad事件的工作方式如下:页面的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

快速查看:

enter image description here

那么为什么这么重要呢?

在您的示例中,您有三个按钮,每次按下按钮,您需要更改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布局的建议

编辑1

我忘记提到的一件事是,您需要在所有页面中设置主页面,使用动态MasterPage,因此最好的方法是创建基页和继承自它,并在基页中编写PreInit事件中的代码来设置MasterPage