2014-01-17 101 views
1

我创建了一个嵌套母版页。父母母版页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 
    } 
} 
+1

尝试提供一个更完整的问题与源代码,其中抛出的错误,... – cubitouch

回答

0

一个Page只有一个参考,以它的立即主人和它的变量,你将不得不对象图遍历到主母版页即

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

或者,你可以弥合通过在您的ChildMasterPage中执行相同的属性2之间的差距,即

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

这意味着您目前拥有的代码可以正常工作,但是这种做法有失主要的主页面的作用。

+0

谢谢您的回答,似乎摸出。不过,我打算让代码更具可扩展性。没有一种方法可以访问两个母版页所需的所有方法和变量的相同索引。 – JEPAAB

+0

我能够访问属性,但是它们没有被初始化。有没有办法初始化它们? – JEPAAB

+0

@JEPAAB并不是说我知道这样的代码是否应该不会对性能产生任何负面影响。 *我可以访问这些属性,但是它们没有被初始化* - 您显示的示例返回一个'btn'字段,请确保您在主页中的某处*初始化该字段。 – James

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"...