同一个主页面中的共享函数如何访问主页面中的访问控制?

3
我正在从内容页调用主页面的共享函数。在这个共享函数中,我希望访问主页面中的控件,但我不知道该怎么做。
主页面为main.master。
<asp:Literal ID="ltCurrency" runat="server" />

main.master.vb

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

Public Property CurrencyText() As String
    Get
        Return ltCurrency.Text
    End Get
    Set(ByVal value As String)
        If value <> "" Then
            ltCurrency.Text = value
        End If
    End Set
End Property

Public Shared Function DoSomething() As String  
    ltCurrency.Text="SOME TEXT" 'throws error: Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class.    

    CurrencyText="SOME TEXT" 'this property isn't found at all

'我也尝试实例化当前主页面的一个新类: Ctype(main,Masterpage)。CurrencyText

End Function


End Class

我从page1.aspx页面调用:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    main.DoSomething()
End Sub

我还能做什么?

2个回答

4

说句实在话(我不知道你为什么要将其共享),您可以使用 HttpContext 来获取对您的页面的引用,然后从那里获取到主控页:

Public Shared Function DoSomething() As String
    Dim myPage = TryCast(HttpContext.Current.Handler, Page)
    If myPage IsNot Nothing Then
        Dim myMaster As main = TryCast(myPage.Master, main)
        If myMaster IsNot Nothing Then
            myMaster.ltCurrency.Text = "SOME TEXT" 
            myMaster.CurrencyText = "SOME TEXT"
        End If
    End If
End Function

@Floran:如果你想从内容页调用该方法,你需要将页面的Master属性转换为你的MasterPage的实际类型。看一下我的代码,因为我已经这样做了。 - Tim Schmelter
啊,我明白了。但是当我将它声明为共享方法时,我可以直接通过主页面类名访问该方法,而无需先将其转换为主页面。这里有最佳实践吗? - Adam
@Floran:最佳实践是将其作为实例方法,因为“Shared”错误地暗示该方法也可以在没有 Http-Context 的情况下使用,实际上它访问的是仅在使用此主控制器的页面生命周期期间存在的控件。 - Tim Schmelter
@TimSchmelter 这个答案很好,但是如何使用它来访问主母版页?(myPage.Master.Master,main)? - DreamTeK
@Obsidian:VB.NET 还是 C#?你可以使用循环:If myPage IsNot Nothing Then Dim master = myPage.Master Dim myMaster = TryCast(master.Master, ERPMaster) While master.Master IsNot Nothing AndAlso myMaster Is Nothing master = master.Master myMaster = TryCast(master, ERPMaster) End While ' ... ' End If - Tim Schmelter
显示剩余3条评论

0

步骤1:在您的内容页面中创建一个事件。

Public Event DoSomething(sender as object, myString as String)

步骤2:在您的主页上为您刚刚在内容页面中创建的事件添加一个事件处理程序。

Addhandler contentPage.DoSomething, AddressOf ChangeCurrentText

步骤3:在处理程序中,您可以执行任何想要执行的操作。
Private Sub ChangeCurrentText(sender, text)
ltCurrency.Text = text
End Sub

步骤4:在内容页中触发事件

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    RaiseEvent DoSomething(ME, "BLAH BLAH")
End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接