我能否动态更改嵌套主母版的主母版?

9

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

但是嵌套主页呢?我能改变主页的主页吗?

MasterPage类没有公开OnPreInit事件。

有什么想法吗?

4个回答

9

刚刚测试了一下,从使用嵌套主页面的页面的PreInit可以正常工作。

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

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

嗯,那是一个解决方案。不幸的是,这意味着在每个使用主页面的页面中都要放置代码,而不是在一个地方。我不确定哪个是两害中较小的...复制主页面,这样就有两个副本,会少得多的工作! - Chris Haines

3
我们将Andy的方法与“BasePage”类结合起来 - 我们创建一个继承自System.Web.UI.Page的类,然后所有页面都继承自此类。
然后,在我们的基础页面类中,我们可以执行相关检查以查看应该使用哪个根主页 - 在我们的情况下,我们有一个“Presentation”主页和一个“Authoring”主页 - 演示版本具有所有导航和页面家具,以及重型显示CSS,而作者主页具有一些额外的JS,用于作者工具,较轻的CSS和无导航(当用户实际上正在编写页面而不是修改站点布局时使用它)。
这个基础页面可以调用Page.Master.MasterPageFile并将其设置为Authoring主页,如果这是页面的正确状态。

2

万一有人在尝试Andy的代码时遇到“内容控件必须是内容页或引用主控件页的嵌套主控件页中的顶级控件”错误而感到困惑,请删除this.Master。 因此,代码变为:

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

编辑 如下方的Zhaph所指出的那样,我^^那里的代码只会改变当前页面的母版,而不是母版的母版。这就是Hainesy提到“我们都知道如何动态更改母版页”时所说的代码(我没有意识到)。如果你正好通过谷歌搜索“stackoverflow更改母版页”来到这个页面(这就是我所做的),那么可能这就是你在寻找的代码:-)


但这只会改变内部主页面,而不是Hainesy想要的外部主页面。我想你可能有一个问题,即外部主页面没有所有内部主页面所需的占位符。 - Zhaph - Ben Duguid
啊,我明白了。这个问题我理解错了,抱歉。我使用的是标准页面和一个主控制器,而不是嵌套的主控制器。这教会了我先读再思考的道理 :-) - Dan F

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接