ASP.Net以编程方式更改MasterPage

时间:2010-02-26 15:56:28

标签: c# asp.net master-pages

我在ASPX方面有以下代码:

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

我使用VirtualPath访问MasterPage中的属性。 到目前为止,非常好。

然而,现在我必须以编程方式更改主页。 我知道要更改母版页,我必须在page_init上执行:

Page.MasterPageFile = "~/masterpages/myNewMasterPage.Master";

但我不知道如何更改VirtualPath。

3 个答案:

答案 0 :(得分:2)

我假设您正在使用MasterType,因为您需要一些属性(如果您更改为另一个主服务器也需要这些属性),假设您当前正在使用Master.MyButton,将其移动到基类并使用该属性输入您的@MasterType声明:

public class MasterBase : MasterPage
{
  public Button MyButton;
}

public class standard : MasterBase
{
}

现在,在您的页面中,您的MasterType声明如下所示:

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

现在,当您更改虚拟路径时,无关紧要,您正在访问基础中的属性,两个母版页都是相同的。

答案 1 :(得分:2)

简而言之,你不能这样做。

您会看到,“MasterType”目录提供 type 信息,编译器在编译时使用这些信息。

当您编写Page.MasterPage.btn1.Text = "abcd"之类的内容时,编译器需要知道如何处理“btn1”部分。它是什么?这是一个领域吗?一个属性?一个方法?嵌套类?或者它根本不存在?

要回答这些问题,编译器需要知道Page.MasterPage表达式的类型。这正是您提供的“MasterType”指令。

VirtualPath属性基本上表示“首先编译其他文件,其编译结果将是此页面的Master属性的类型”。这就是编译器所知道的。

从以上所述,我们可以得出一个结论:不仅在运行时不可能改变某些属性的类型,它也没有任何意义 - 代码已经编译,你不需要任何编译时信息!

所以出现的下一个问题是:你为什么要首先这样做?

如果您只想使用在不同母版页中声明的不同属性,您可以使用Nick Craver和Nathan Taylor的建议并声明一个基类,该基类具有所有这些字段/属性并且所有母版页都继承自该基类,然后让您的MasterType指令通过TypeName属性指定该基类。

但是,如果两个母版页的逻辑相似,只是设计上有所不同,我只会这样做。也就是说,一个页面不应该具有另一个页面不具有的任何属性。否则,当在任何时候只使用其中一个子集时,在一个类(将是基类)中具有两个属性/方法/字段子集是不正确的。当两个类没有真正的共同基础时,为两个类创建一个公共基础是不对的。阿卡“糟糕的设计”。在这种情况下,您可能应该重新考虑您的初始设计。

如果你的目的是其他的 - 请解释一下,我会尝试为你提出一些解决方案。

祝你好运。

答案 2 :(得分:0)

有些挖掘并在ASP.NET论坛上找到了这个:

  

要动态更改MasterType,   你应该创建一个基本母版页   类,让每个masterPage到   继承它。

     

然后您可以使用该基本MasterPage   输入您网页的MasterType。

     

请参阅“动态大师的强力打字”   页面“此link中的部分。

     

此致

     

Anas Ghanem

看起来像一个相当合理的方法,只要你可以忍受做一些演员。

Source


如果你想节省一些时间并避免在每次调用时都进行转换,你可以在你的基本MasterPage类型中定义一个名为'CurrentMaster'的字段或者那种效果,然后在当前的MasterPage文件上使用条件还将'CurrentMaster'设置为适当的类型。

MasterPage CurrentMaster;
if (Page.MasterPageFile == "Master1") {
  CurrentMaster = (Master1Type)Page.MasterPage;
} 
else {
  CurrentMaster = (Master2Type)Page.MasterPage;
}

Source