使用母版页和继承的母版页

时间:2009-06-02 21:38:42

标签: asp.net master-pages

我有一个“Master”主页,我​​有2个“Sub”主页。这两个子站点的主页属性设置为“主站”主页。到目前为止一切都很好。

好吧,今天我被告知也要让Sub1和Sub2从Master Masterpage“继承”。我认为他们的语言不精确,但不,她希望我将班级定义更改为

public partial class Sub2 : TheMaster 

(那些不是名字)。

所以,现在我已经将Sub1和Sub2作为母版页,并且拥有TheMaster的母版页,而且他们也属于“TheMaster”类

我对此感到很困惑,并且不确定这会产生什么样的影响。它现在似乎编译并运行良好,但我们今天刚开始这个为期6个月的项目,我不想到第5个月,发现我们有一个重大的设计缺陷。

有谁能告诉我这完全没问题,或者我们完全搞砸了?

我很害怕......抱着我。

编辑:澄清 - 她希望我也从主母版页继承的原因是我们在该页面中设置了一些东西,我们希望它们可用于子母版页。类似于站点地图中当前节点,渲染页面,某些用户帐户等等。

3 个答案:

答案 0 :(得分:5)

确实可以使用嵌套母版页 - 请参阅http://msdn.microsoft.com/en-us/library/x2b3ktt7.aspx作为参考。

根据评论编辑

我不相信您的子母版页应该从后面代码中的主母版页继承。

每个母版页(包括子母版页)都应直接从MasterPage继承,即public partial class Sub1 : System.Web.UI.MasterPage

只有子母版页的ASP标记应该引用主母版页,即<%@ Master Language="C#" MasterPageFile="~/TheMaster.master" ... />

如果您通过VS UI将子母版页添加到项目中,选择TheMaster.master作为母版页,那么您将看到这是如何设置的。主页面使用仅设计为通过内容(标记),而不是通过类继承。

答案 1 :(得分:2)

我刚刚遇到这个问题,并希望添加从您正在嵌套的母版页继承时遇到的特定问题。例如,BaseMaster.master.cs中的以下代码:

//BaseMaster.master.cs
public String FooLabelText
{
    get { return FooLabel.Text; }
    set { FooLabel.Text = value; }
}

从您继承的页面调用时将抛出NullReferenceException。嵌套母版页(BaseMaster.master)中不存在FooLabel(SubMaster.master文件中的标签),因此如果您访问该属性,它将会中断。

您可以通过覆盖子类中的属性并将其重定向到您嵌套的母版页来解决这个问题,但这确实打破了.NET母版页的设计理念:

//SubMaster.master.cs inherits from BaseMaster
new public String FooLabelText
{
    get { return (Master as BaseMaster).FooLabel.Text; }
    set { (Master as BaseMaster).FooLabel.Text = value; }
}

请注意,我没有使用base.FooLabel,而是Master.FooLabel,它实际上指的是另一个对象。充其量,这是一个黑客,在许多情况下,它会创造更多的工作和重复。

一种替代方法是创建具有所需应用程序功能的虚拟母版页基类,并使每个母版页继承自此类。在使用虚拟页面基类时,我只能看到使用它的非常有限的优点,以及许多缺点。最好将母版页用于他们最擅长的领域,减少标记中的复制,并将其余所需功能放在页面类中。

答案 2 :(得分:1)

基本上你所做的就是设置页面,以便类继承指定基础中的所有项目。 “Masterpage”属性的连接,创建弱关联,并在特定结构内呈现内容。从基类继承的类将逻辑向前移动,而不是仅仅执行它,您可以覆盖它。

现在,在考虑之后,你很可能不希望MasterPage属性设置....但只是类继承