我可以动态更改嵌套母版页的主页吗?

时间:2009-02-24 14:33:43

标签: asp.net master-pages

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

但是嵌套母版怎么样?我可以更换主人的主人吗?

MasterPage类中没有公开OnPreInit事件。

有什么想法吗?

4 个答案:

答案 0 :(得分:9)

刚刚对此进行了测试,它的工作原理是使用嵌套MasterPage的Page PreInit。

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

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

以防任何人偶然发现并用“内容控件必须是内容页面中的顶级控件或引用母版的嵌套母版”错误地撕掉他们的头发在尝试Andy的代码时,摆脱this.Master。所以,代码变成了:

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

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

答案 3 :(得分: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";
            }
        }
    }
}