如何动态更改母版页的母版页?

4
我正在尝试动态更改主控页,虽然从内容页(覆盖OnPreInit)很容易做到,但是对于主控页没有这样的事件。是否可能以某种方式引入此事件?
更新:通过经过层次结构底部页面的PreInit,我完成了一半,事实证明您可以执行类似于base.Master.MasterPageFile =“/ master.Master”;的操作,但出于某种原因,这不会加载最顶层主控页中标题中的内容,即样式表。
4个回答

3

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

我刚测试了一下,它可以在使用嵌套主母版页的页面的PreInit中工作。 protected void Page_PreInit(object sender, EventArgs e)
{
this.Master.MasterPageFile = "/Site2.Master";
}

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


哈哈,有趣,我通过试错自己发现了这个问题,但正如我所提到的,这并没有完全解决问题。主页面文件已加载,但在头部中的样式表却没有加载。 - Shagglez
你的母版页是否与内容页存放在不同的文件夹中? - Kamyar
如果是这样,你的问题与在主页面运行时未正确解析路径有关。一些解决方法在此处提到:http://forums.asp.net/t/1401917.aspx - Kamyar
嗯,我看了一下论坛帖子,至少乍一看,他们似乎在使用相对路径,这就是问题出现的地方。我总是尝试使用像“/assets/site/css…”等路径,这样无论哪个页面链接css,路径都能正确解析。我想暂时我会硬编码一些css,并在以后尝试找到解决方案。 - Shagglez
实际上,这个解决方案是正确的。我完全忘记了在 CSS 开始时进行标准重置,这会清除所有样式。你可以得到正确的答案,尽管在那之前我更新了我的帖子。另外,我认为其他答案也值得一分 :) - Shagglez

1
如果你重写了MasterPageClass并添加了自己的onPreInit,你可能可以做到这一点,但我认为即使那样也不会起作用。根据反射器的说法,没有任何构造函数可以实现这一点,甚至没有任何可重写的内容,尽管它继承了UserControl,所以始终可以使用OnInit...或者你可以尝试重写get_Master(),但那可能也行不通...

是的,问题就在这里,没有可以重写的事件。OnInit()发生得太晚了,所以没用。get_Master()是什么? - Shagglez
1
这是页面调用的内部方法,但如果您使用RedGate Reflector,则会看到它...我强烈建议您开始使用Reflector(如果您还没有),它将有助于解释您正在使用的.NET代码的许多内容... - jcolebrand

0
使用母版页构造函数。

1
没问题,而且成功了。不过在它能够正常工作之前,我必须删除嵌套的母版页的MasterPageFile属性。还是谢谢大家。 - kallotec
@klingdigital 我不知道为什么我的答案不正确。 - regisbsb

0

假设您想使用没有菜单的不同主页面,请传递查询字符串NoMenu。

protected void Page_PreInit(object sender, EventArgs e)
 {
   //You'll go through infinite loop if you do not check if we already have the new master page, this will switch to different master page if requested without a menu for example
   if (Request.QueryString["NoMenu"] != null && this.MasterPageFile != "/MasterPageNoMenu.master")
    {
        this.MasterPageFile = "/MasterPageNoMenu.master";

        base.OnPreInit(e); 
    }
} 

欢迎来到Stackoverflow!在回答中,建议解释为什么该答案有效。 - Stephen Rauch

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