Asp.net 如何动态更改母版页';s母版页?

Asp.net 如何动态更改母版页';s母版页?,asp.net,master-pages,Asp.net,Master Pages,我正在尝试动态更改母版页,虽然从内容页(覆盖OnPreInit)很容易做到,但是母版页没有这样的事件。有没有可能以某种方式介绍这一事件 更新:我通过阶梯底部页面的PreInit到达了一半,结果发现你可以做base.Master.MasterPageFile=“/Master.Master”,但由于某些原因,这不会加载最上面的母版页的标题中的内容,即样式表 如果您改写了MasterPageClass并添加了自己的onPreInit,您可能可以这样做,但我认为即使这样也行不通。根据Reflector

我正在尝试动态更改母版页,虽然从内容页(覆盖
OnPreInit
)很容易做到,但是母版页没有这样的事件。有没有可能以某种方式介绍这一事件


更新:我通过阶梯底部页面的
PreInit
到达了一半,结果发现你可以做
base.Master.MasterPageFile=“/Master.Master”,但由于某些原因,这不会加载最上面的母版页的标题中的内容,即样式表

如果您改写了MasterPageClass并添加了自己的onPreInit,您可能可以这样做,但我认为即使这样也行不通。根据Reflector,它肯定没有构造,甚至没有什么可以重写的,尽管因为它继承了UserControl,所以总是只有OnInit。。。或者,您可以尝试覆盖get_Master(),但这也可能不起作用…

引用:

刚刚测试了这个,它从使用嵌套母版页的页面的PreInit开始工作。 受保护的无效页面\u PreInit(对象发送方,事件参数e)
{
this.Master.MasterPageFile=“/Site2.Master”
}


显然,您需要确保要在不同页面之间交换的内容占位符ID是一致的。

使用母版页构造函数。

假设您要使用不同的母版页而不使用菜单,请传递查询字符串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); 
    }
} 

是的,就是这样,没有要覆盖的事件。OnInit()在生命周期中发生得太晚,因此没有任何用处。什么是get_Master()?这是一个由页面调用的内部方法,但是如果您使用RedGate Reflector,那么您将看到它。。。我强烈建议你开始使用Reflector如果你还没有,它会帮助你解释很多你正在使用的.NET代码…呵呵,有趣的是,我自己通过反复试验发现了这一点,但正如我所提到的,这并不能完全解决问题。母版页文件已加载,但标题中的样式表未加载。母版页是否与内容页位于不同的文件夹中?如果是,则问题与母版页运行时未正确解析路径有关。这里提到了一些解决方法:嗯,我看了论坛帖子,至少乍一看,他们似乎在使用相对路径,这就是问题所在。我总是尝试使用诸如“/assets/site/css…”等路径,这样无论哪个页面链接css,路径都能正确解析。我想现在我会硬连线一些css,并尝试在以后得到一个解决方案实际上这个解决方案是正确的。我完全忘记了css开始时的bog标准重置,即清除所有样式。你可以得到正确的答案,尽管我在那之前更新了我的帖子。另外,我认为另一个答案值得一提:)有道理,而且有效。我必须先删除嵌套母版页的MasterPageFile属性,然后它才能工作。还是干杯。@klingdigital我不知道为什么我的答案不正确。欢迎来到Stackoverflow!在回答中,建议解释为什么答案有效。