3

我有三个母版页,例如Master-Green, Master-Bule, Master-Red. 在每个母版页中都有三个名为green, blue and red.
现在我default master is green

它被分配了一个页面Default.aspx。这时三个按钮也显示在上面。

如何使单击“蓝色”按钮意味着 Master-Blue 成为当前页面的母版页?

4

2 回答 2

3
  1. 在母版页中使用输入类型提交按钮

< inputtype=" submit" name=" btnGreen" value="绿色" />

< inputtype=" 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";
        }
    }

}
于 2012-07-02T07:00:46.227 回答
2

处理动态母版页乍一看似乎很容易,但有点棘手。

考虑以下:

  • MasterPage 实际上被视为页面的子控件,因此,它的生命周期与页面上的任何其他控件一样

  • 为了在运行时更改 MasterPage,必须在PreInit页面事件中完成(请记住,控件没有此事件,因此 MasterPage 也没有)

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

编辑 1

我忘了提到的一件事是,您需要在所有使用动态 MasterPage 的页面中设置母版页,因此最好的方法是创建一个基页并从中继承,然后在基页中写入PreInit事件中设置 MasterPage的代码

于 2012-07-02T07:32:43.497 回答