【问题标题】:How to access a top level master page sub from within a nested page?如何从嵌套页面中访问顶级母版页子?
【发布时间】:2016-04-25 17:07:42
【问题描述】:

母版页结构

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

我无法从基本页面访问顶级类。

顶级大师 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

【问题讨论】:

  • 我不明白错误“错误:未声明顶级大师”。仅当类型 TopMaster 未声明或无法从您使用此类的任何位置访问时,才会发生这种情况。
  • 我同意。您的代码在 Pages master 中运行良好,但现在在 master master 中找不到它。

标签: c# asp.net vb.net nested master-pages


【解决方案1】:

更新:现在清楚了,把类设为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

【讨论】:

  • 然后在您尝试编译时向我们显示输出窗口。它显示了确切的编译器错误,包括它的编号。 msdn.microsoft.com/en-us/library/3hk6fby3.aspx
  • 感谢蒂姆的帮助。输出窗口的错误如上。
  • @Obsidian:仍然不清楚为什么会出现错误。您在代码中的哪个位置使用变量或类型 Top Master(包括空格)。看看你的 aspx 代码。
  • 请参阅上面的编辑。现在这是我正在使用的确切代码,并显示了 TopMaster 的每个实例。该错误仅在尝试读取第二个母版页时引发。
  • @Obsidian:总是修改你的问题,你会让我的答案过时。添加新信息但不要应用所有建议,否则人们会怀疑我在写这篇文章时是否有点喝醉了;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
相关资源
最近更新 更多