9

好的,所以我们都知道在页面的 OnPreInit 事件中动态更改母版页。

但是嵌套母版页呢?可以换master的master吗?

MasterPage 类中没有公开 OnPreInit 事件。

有任何想法吗?

4

4 回答 4

9

刚刚对此进行了测试,它可以从使用嵌套 MasterPage 的页面的 PreInit 中工作。

protected void Page_PreInit(object sender, EventArgs e)
{
    this.Master.MasterPageFile = "/Site2.Master";
}

显然,您需要确保 ContentPlaceholderId 在您正在交换的页面之间保持一致。

于 2009-02-24T14:52:38.270 回答
3

我们将 Andy 的方法与“BasePage”类结合起来——我们创建一个继承自 System.Web.UI.Page 的类,然后我们所有的页面都继承自这个类。

然后,在我们的基页类中,我们可以执行相关检查以查看应该使用哪个根母版页——在我们的例子中,我们有一个“演示”母版和一个“创作”母版——演示版具有所有导航和页面家具,以及繁重的显示 CSS,而创作大师有一些额外的 JS 用于创作工具,更轻的 CSS,并且没有导航(这是我们在用户实际创作页面时使用的,而不是修改站点布局)。

然后,此基本页面可以调用 Page.Master.MasterPageFile 并将其设置为 Authoring master(如果这是页面的正确状态)。

于 2009-03-02T00:20:58.190 回答
2

以防万一有人在尝试 Andy 的代码时遇到“内容控件必须是内容页面中的顶级控件或引用母版页的嵌套母版页”错误而将头发扯掉的情况,请摆脱this.Master. 因此,代码变为:

protected void Page_PreInit(object sender, EventArgs e)
{
    MasterPageFile = "/Site2.Master";
}

编辑正如 Zhaph 在下面指出的那样,我拥有的代码 ^^ 只会更改当前页面的主人,而不是主人的主人。这是 Hainesy 在提到“我们都知道动态更改母版页”时所说的代码(我没有,d'oh)。如果您碰巧通过谷歌搜索“ stackoverflow 更改母版页”(这是我所做的)到达此页面,那么这可能是您正在寻找的代码:-)

于 2009-05-14T08:13:39.633 回答
0

要补充 Zhaph - Ben Duguid 的答案,(顺便说一下 +1):

这是设置嵌套母版页的母版页的示例代码。所有页面都继承自此 BasePage,因此此代码仅存在于一处。

public class BasePage : System.Web.UI.Page
{
    private void Page_PreInit(object sender, System.EventArgs e)
    {
        if (Request.Browser.IsMobileDevice)
        {
            if (Page.MasterPageFile == "~/master/nested.master")) 
            {
                Page.Master.MasterPageFile = "~/master/mobile.master";
            } 
            else 
            {
                MasterPageFile = "~/master/mobile.master";
            }
        }
    }
}
于 2010-11-16T17:31:29.007 回答