ASP.Net如何在程序中更改母版页?

9

我在ASPX页面中有以下代码:

<%@ Page Language="C#" MasterPageFile="~/masterpages/standard.Master" .... %>
<%@ MasterType VirtualPath="~/masterpages/standard.Master" %>

我使用VirtualPath来访问我的MasterPage中的属性,目前为止一切顺利。
然而,现在我需要以编程方式更改MasterPage。 我知道要更改主页,我必须在page_init中进行:
Page.MasterPageFile = "~/masterpages/myNewMasterPage.Master";

但是我不知道如何更改虚拟路径。

4个回答

2

我假设您正在使用MasterType,因为您需要某个属性(如果您更改为另一个主控时也需要该属性),假设您目前正在使用Master.MyButton,请将其移入基类并在@MasterType声明中使用该类型:

public class MasterBase : MasterPage
{
  public Button MyButton;
}

public class standard : MasterBase
{
}

现在,在您的页面中,MasterType声明看起来像这样:

<%@ MasterType TypeName="MyNameSpace.MasterBase" %>

现在,当您更改虚拟路径时,访问基础属性不会受到影响,对于两个主页面来说都是相同的。

2
简而言之,你做不到。
“MasterType”目录提供了类型信息,编译器在编译时使用它。当你写类似于Page.MasterPage.btn1.Text =“abcd”这样的语句时,编译器需要知道如何处理“btn1”部分。它是一个字段吗?属性?方法?嵌套类?还是根本不存在?
为了回答这些问题,编译器需要知道Page.MasterPage表达式的类型,这正是你使用“MasterType”指令所提供的内容。
VirtualPath属性基本上意味着“先编译那个文件,然后该页面的Master属性的类型将由其编译结果决定”。这就是编译器所知道的。
由此可见:不仅无法在运行时更改某个属性的类型,而且这样做也毫无意义 - 代码已经编译完成,不再需要任何编译时信息!因此,接下来出现的问题是:你最初为什么要这样做?
如果你只想使用在不同主控页中声明的不同属性,那么你可以采用Nick Craver和Nathan Taylor的建议,声明一个基类,该基类将拥有所有这些字段/属性,并使所有主控页继承自该基类,然后通过TypeName属性指定你的MasterType指令指定该基类即可。
然而,我只会在两个主控页逻辑相似但设计不同的情况下采用这种方法。也就是说,一个页面不应该有另一个页面没有的任何属性。否则,在一个类(将成为基类)中拥有两个属性/方法/字段的子集时是不正确的,因为这些子集仅在任一时间使用一个。如果没有真正的共同基础,则创建两个类的公共基础是不正确的。即所谓的“糟糕的设计”。在这种情况下,你应该重新考虑你最初的设计。
如果你的目的是其他 - 请解释一下,我将尝试为你提供一些解决方案。
祝你好运。
-Fyodor

虽然你给出了一个不错的答案,但它并不是解决方案。但由于它对于后续的访问者非常有用,我将标记它为有用。 :) - Marco
这不是一个解决方案,因为并没有解决方案。 :-) 在我的答案中,我尝试仔细解释为什么。 - Fyodor Soikin

0

我有一个BaseMasterPage类,它继承自MasterPage。它具有我各种页面可能使用的所有属性和方法。如果需要在我的应用程序中使用多个MasterPages,只要每个MasterPage都继承自BaseMasterPage即可。

为了访问BaseMasterPage中的功能,在aspx页面中添加以下语句:

<%@ MasterType TypeName="MyNameSpace.UI.BaseMasterPage" %>

为了避免这样做,我还创建了一个继承自Page的BasePage类。在BasePage中,我创建了以下属性:
    public new MyNameSpace.UI.BaseMasterPage Master
    {
        get
        {
            return (MyNameSpace.UI.BaseMasterPage)(base.Master);
        }
    }

只要我的页面继承自BasePage,我就不必添加MasterType虚拟路径。

0

在 ASP.NET 论坛上找到了一些信息:

要动态更改 MasterType,您应该创建一个基础 masterpage 类,并让每个 masterPage 继承它。

然后,您可以将该基础 MasterPage 类型用作页面的 MasterType。

请参见此 链接 中的“动态主页的强类型”部分。

问候,

Anas Ghanem

只要您能接受进行一些转换,这似乎是一个相当合理的方法。

来源


如果您想节省时间并避免在每次调用时进行转换,可以在基础MasterPage类型中定义一个名为“CurrentMaster”或类似名称的字段,然后在当前的MasterPage文件上使用条件语句,以设置相应类型的“CurrentMaster”。
MasterPage CurrentMaster;
if (Page.MasterPageFile == "Master1") {
  CurrentMaster = (Master1Type)Page.MasterPage;
} 
else {
  CurrentMaster = (Master2Type)Page.MasterPage;
}

源代码


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