Asp.net 是否可以更改嵌套母版页';谁是主人?

Asp.net 是否可以更改嵌套母版页';谁是主人?,asp.net,master-pages,Asp.net,Master Pages,好的,我们都知道如何在页面的OnPreInit事件中动态更改母版页 但是嵌套母版页呢?我可以换主人的主人吗 母版页类中没有公开OnPreInit事件 有什么想法吗?刚刚测试过,它从使用嵌套母版页的页面的PreInit开始工作 protected void Page_PreInit(object sender, EventArgs e) { this.Master.MasterPageFile = "/Site2.Master"; } 显然,您需要确保在您要交换的页面之间ContentP

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

但是嵌套母版页呢?我可以换主人的主人吗

母版页类中没有公开OnPreInit事件


有什么想法吗?

刚刚测试过,它从使用嵌套母版页的页面的PreInit开始工作

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

显然,您需要确保在您要交换的页面之间ContentPlaceholder ID是一致的。

我们将Andy的方法与“BasePage”类相结合-我们创建了一个继承自System.Web.UI.Page的类,然后我们的所有页面都继承自该类

然后,在我们的基本页面类中,我们可以执行相关检查,以查看应该使用哪个根母版页-在我们的示例中,我们有一个“演示”母版和一个“创作”母版-演示版本具有所有导航和页面设备,以及大量的显示CSS,虽然authoring master为创作工具提供了一些额外的JS、更轻的CSS,并且没有导航(这是用户实际创作页面而不是修改站点布局时使用的)


然后,此基本页可以调用page.Master.MasterPageFile,并将其设置为创作母版(如果该页的状态正确)。

以防任何人无意中发现此问题,并用“内容控件必须是内容页中的顶级控件或引用母版页的嵌套母版页”将其撕成碎片尝试Andy的代码时出错,请清除
此.Master
。因此,代码变成:

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

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

以添加到Zhaph-Ben Duguid的答案上,(顺便说一下+1):

下面是设置嵌套母版页的母版页的示例代码。所有页面都继承自此基本页面,因此此代码只存在于一个位置

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

嗯,是的,这是一个解决办法。不幸的是,这意味着将代码放在使用母版页的每个页面中,而不是放在一个地方。我不确定哪一个是两个恶魔中比较少的。。。复制母版页以便有两个副本将大大减少工作!但这只会改变内部母版页,而不会改变外部母版页,这正是海恩西想要的。我想说的是,你对一个外部主控器有一个问题,它没有内部主控器所需的所有占位符。啊,明白了。对不起,这一次我搞错了。我有一个母版的标准页面,而不是嵌套的母版。这将教会我首先阅读和思考:-)