У меня есть общий элемент управления пользователя, скажем, TextBoxUserControl.ascx, который используется на трех разных страницах, например, A.aspx, B.aspx и C.aspx.
У A.aspx есть скрытый контроль, скажем, hiddenA
B.aspx имеет скрытый контроль, скажем, hiddenB
C.aspx имеет скрытый контроль, скажем, hiddenCxyz
Я хочу прочитать скрытое значение родительской страницы из TextBoxUserControl.ascx, когда TextBoxUserControl.ascx загружается с разных страниц.
Но проблема, с которой я столкнулась, заключается в том, как явно не указывать имя скрытых полей в Page_Load из TextBoxUserControl.ascx? Как разделить между ними?
Ниже приведен метод Page_Load для TextBoxUserControl.ascx
Private Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
' below hiddenA of A.aspx is explicitly being checked, but it wont work if this user control
' is used in B.aspx and C.aspx as they have different names of hidden fields
Control ctr = Me.Parent.FindControl(hiddenA)
labelTotal = ctr.Text
End Sub
Способ, которым я буду реализовывать это, - создать интерфейс для страниц хостинга, который возвращает соответствующее значение (даже не беспокойтесь о контроле).
Например:
Public Interface IPageHost
ReadOnly Property PageNameGuid As String
End Interface
Затем реализуйте этот интерфейс в a.aspx:
Public Class APage
Inherits System.Web.UI.Page
Implements IPageGuidHost
Public ReadOnly Property PageNameGuid As String Implements IPageGuidHost.PageNameGuid
Get
Return hiddenA.Text
End Get
End Property
и, наконец, в пользовательском элементе управления, если родительская страница реализует интерфейс, просто получите значение напрямую:
Private Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
Dim parentPage As IPageGuidHost
parentPage = TryCast(Me.Page, IPageGuidHost)
If parentPage IsNot Nothing Then
labelTotal.Text = parentPage.PageNameGuid
Else
lableTotal.Text = String.Empty
End If
End Sub