我在ASPX方面有以下代码:
<%@ Page Language="C#" MasterPageFile="~/masterpages/standard.Master" .... %>
<%@ MasterType VirtualPath="~/masterpages/standard.Master" %>
我使用VirtualPath访问MasterPage中的属性。 到目前为止,非常好。
然而,现在我必须以编程方式更改主页。 我知道要更改母版页,我必须在page_init上执行:
Page.MasterPageFile = "~/masterpages/myNewMasterPage.Master";
但我不知道如何更改VirtualPath。
答案 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
看起来像一个相当合理的方法,只要你可以忍受做一些演员。
如果你想节省一些时间并避免在每次调用时都进行转换,你可以在你的基本MasterPage类型中定义一个名为'CurrentMaster'的字段或者那种效果,然后在当前的MasterPage文件上使用条件还将'CurrentMaster'设置为适当的类型。
MasterPage CurrentMaster;
if (Page.MasterPageFile == "Master1") {
CurrentMaster = (Master1Type)Page.MasterPage;
}
else {
CurrentMaster = (Master2Type)Page.MasterPage;
}