2015-06-09 62 views
1

母版页结构如何从嵌套页面访问顶级主页面子?

TOP MASTER 
    PAGE MASTER "TopMaster.ErrorMsg(ErrMsg) Here throws NO error" 
     PAGE "TopMaster.ErrorMsg(ErrMsg) Here throws error" 

我无法获得从基本页面访问顶层类。

TOP MASTER ASPX

<asp:Literal ID="litMsg" runat="Server"/> 

PAGE.VB

Partial Public Class BasePage 
    Inherits System.Web.UI.Page 

    Public Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load 
    TopMaster.ErrorMsg(ErrMsg) 
    "Error BC30451: TopMaster is not declared it may be inaccessible due to its protection level." 
    End Sub 

End Class 

MASTER.VB

Partial Public Class PageMaster 
    Inherits System.Web.UI.MasterPage 

End Class 

TOP MASTER.VB

Partial Public Class TopMaster 
    Inherits System.Web.UI.MasterPage 

    Public Shared Sub ErrorMsg(ErrMsg As String) 
    Dim myPage = TryCast(HttpContext.Current.Handler, Page) 

    If myPage IsNot Nothing Then 
     Dim master = myPage.Master 
     Dim myMaster = TryCast(master.Master, TopMaster) 
     While master.Master IsNot Nothing AndAlso myMaster Is Nothing 
     master = master.Master 
     myMaster = TryCast(master, TopMaster) 
     End While 

     myMaster.litMsg.Text = ErrMsg 
    End If 

    End Sub 

End Class 
+0

我不明白错误_“错误:顶级大师没有声明”_。只有当类型'TopMaster'没有被声明或不能从你使用这个类的地方访问时,才会发生这种情况。 –

+0

我同意。您的代码在Pages主控制器中工作良好,但现在无法在主控制器中找到它。 – Obsidian

回答

2

更新:现在很明显,使课堂Public,否则你不能访问它:

Partial Public Class TopMaster 

你应该告诉我们确切的错误信息包括堆栈跟踪。看起来类型 Top Master未被声明,因为您在类 TopMaster中,这是没有意义的。

所以我怀疑下面的问题解决了你的核心问题“错误:顶级大师没有声明”,但无论如何它可能是有用的。

如果您要访问的文字,你应该提供一个属性在TopMaster这样的:

Public Property ErrorMsg As String 
    Get 
     Return Me.litMsg.Text 
    End Get 
    Set(value As String) 
     Me.litMsg.Text = value 
    End Set 
End Property 

在这条路上,如果你想在不破坏代码,你甚至可以改变控制型。它比暴露控制本身要好得多。

我想你也必须将任务从循环内部移到外部。您还应该使用Dim myMaster = TryCast(master, TopMaster)在代替开始直接跳转到页面的主人的主人就如同使用TryCast(master.Master, TopMaster)

Public Shared Sub ErrorMsg(ErrMsg As String) 
    Dim myPage = TryCast(HttpContext.Current.Handler, Page) 

    If myPage IsNot Nothing Then 
     Dim master = myPage.Master 
     Dim myMaster = TryCast(master, TopMaster) 
     While master.Master IsNot Nothing AndAlso myMaster Is Nothing 
      master = master.Master 
      myMaster = TryCast(master, TopMaster) 
     End While 
     myMaster.ErrorMsg = ErrMsg 
    End If 

End Sub 

否则,你只能分配ErrorMsg如果主是网页的主人的主人的主人或者它更深深嵌套。

+0

然后在尝试编译时向我们显示输出窗口。它显示了确切的编译器错误,包括它的编号。 https://msdn.microsoft.com/en-us/library/3hk6fby3.aspx –

+0

我感谢你的帮助Tim。输出窗口的错误如上所述。 – Obsidian

+0

@Obsidian:现在还不清楚为什么你会得到这个错误。你在代码中的哪个位置使用了一个变量或类型“Top Master”(包括空格)。看看你的aspx代码。 –