代码之家  ›  专栏  ›  技术社区  ›  Matt Dawdy

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

  •  7
  • Matt Dawdy  · 技术社区  · 16 年前

    我有一个“母版”母版页,还有两个“子版”母版页。这2个子节点的masterpage属性设置为“master”masterpage。到目前为止一切都很好。

    嗯,今天有人告诉我也要让sub1和sub2从母版页上“继承”。我以为他们的语言不精确,但不,她要我把班级定义改为

    public partial class Sub2 : TheMaster 
    

    (那些不是名字)。

    所以,现在我有了Sub1和Sub2,它们是母版页,还有一个母版页,它们也是“TheMaster”类的。

    我对此很困惑,不知道这会产生什么样的影响。它现在似乎编译和运行得很好,但是我们今天刚开始这个6个月的项目,我不想进入第5个月,发现我们有一个主要的设计缺陷。

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

    我害怕……抱住我。

    编辑:澄清——她希望我也从母版页继承的原因是我们在该页中设置了一些内容,我们希望这些内容可用于子母版页。类似于站点地图中呈现页面的当前节点、一些用户帐户等。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Mitchel Sellers    16 年前

    基本上,您所做的就是设置页面,以便类从指定的基继承所有项。“masterpage”属性的连接,创建弱关联,并呈现特定结构内的内容。从基继承的类将逻辑向前移动,移动到一种方式,在这种方式下,您不仅可以执行它,还可以重写它。

    现在,在考虑之后,您很可能不希望设置masterpage属性……而只希望设置类继承。

        2
  •  5
  •   Adam Ralph    16 年前

    确实有可能有嵌套的母版页-请参见 http://msdn.microsoft.com/en-us/library/x2b3ktt7.aspx 作为参考。

    按注释编辑

    我不认为您的子母版页应该继承自代码隐藏的主版页。

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

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

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

        3
  •  2
  •   Kendrick    14 年前

    我刚刚遇到了这个问题,我想添加一些在从同样嵌套的母版页继承时会遇到的特定问题。例如,basemaster.master.cs中的以下代码:

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

    当从继承的页调用时,将引发 NullReferenceException . 傻瓜标签 BaseMaster.master 文件)在嵌套母版页中不存在( 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 ,它实际上指向一个不同的对象。充其量,这是一个黑客,在许多情况下,它将创造更多的工作和重复。

    另一种选择是创建一个具有所需应用程序功能的虚拟母版页基类,并让每个母版页从此类继承。与使用虚拟页面基类相比,我只能看到非常有限的优势和许多缺点。最好是使用母版页实现它们最擅长的功能,减少标记中的复制,并将所需的其余功能放在页面类中。