【问题标题】:Nested Master Pages and Inheritance嵌套母版页和继承
【发布时间】:2014-01-17 10:38:19
【问题描述】:

我创建了一个嵌套母版页。父母版页 A 继承自 System.Web.UI.MasterPage。子母版页 B 继承自 A。

然后我创建了一个使用母版页 B 并继承自 System.Web.UI.Page 的网页内容页 C。

从网页内容页面 C 我可以访问两个母版页中的变量和方法。然而问题在于访问父母版页变量和方法。

问题是引发了 NullReferenceException。变量和方法没有被初始化。

什么是可能的解决方案?

public partial class ParentMasterPage : System.Web.UI.MasterPage
{
    internal Button btn_Parent
    {
    get { return btn; }
    }
}

public partial class ChildMasterPage : ParentMasterPage
{
    internal Button btn_Child
    {
        get { return btn; }
    }
}

public partial class WebContentPage : System.Web.UI.Page
{
    protected override void OnInit(EventArgs e)
    {
        Button tempA = Master.btn_Child; //WORKS
        Button tempB = Master.btn_Parent; //NULL REFERENCE EXCEPTION
    }
}

【问题讨论】:

  • 尝试用源代码提供一个更完整的问题,在哪里抛出错误,...

标签: c# asp.net inheritance master-pages


【解决方案1】:

嵌套母版页不继承它是父母版页的类型。相反,它组合 自身,使得NestedMasterType.Master 属性是父母版页的一个实例。 NestedMasterType 类型仍然继承自 System.Web.UI.MasterPage

所以这是对的:

public partial class ChildMasterPage : System.Web.UI.MasterPage

这是错误的:

public partial class ChildMasterPage : ParentMasterPage

然后您可以像这样访问页面(使用子母版)的(子)母版的(父)母版:

Button tempA = ((ChildMasterPage)this.Master).btn_Child; 
Button tempB = ((ParentMasterPage)this.Master.Master).btn_Parent;

注意:此答案假定您的意思是 ChildMasterPage 是一个嵌套母版页,它使用类似于以下的 Master 指令:

<%@ Master MasterPageFile="~/ParentMasterPage.Master" Inherits="ChildMasterPage"...

【讨论】:

    【解决方案2】:

    Page 仅引用它的 立即 主控和变量,您必须将对象图向上遍历到主母版页,即

    var parentMaster = (ParentMasterPage)Page.Master.Master;
    parentMaster.SomeProperty = ...;
    

    或者,您可以通过在 ChildMasterPage 中实现相同的属性来弥补两者之间的差距,即

    internal Button btn_Parent
    {
        get { return ((ParentMasterPage)Master).btn_Parent; }
    }
    

    这意味着您当前拥有的代码可以工作,但是,它有点违背了拥有主页的目的。

    【讨论】:

    • 感谢您的回答,似乎成功了。但是我打算使代码更具可扩展性。难道没有办法为两个母版页的所有必需方法和变量访问相同的属性吗?
    • 我可以访问属性,但是它们没有被初始化。有没有办法初始化它们?
    • @JEPAAB 我不知道,这种代码也不应该对性能产生任何负面影响。 我可以访问属性,但是它们没有被初始化 - 您显示的示例返回一个 btn 字段,请确保您在您的主服务器中初始化该 某处页面。
    猜你喜欢
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多