2010-11-04 80 views
8

尝试从我的用户控件的父页面访问属性。访问来自用户控件的父页面属性

这里是我的Default.asp代码隐藏的开始:

Partial Class _Default 
    Inherits System.Web.UI.Page 

    Private _selectedID As String = "74251BK3232" 

    Public Property SelectedID() As String 
      Get 
       Return _selectedID 
      End Get 
      Set(ByVal value As String) 
       _selectedID = value 
      End Set 
    End Property 

这里是我的用户控件的代码隐藏的开始:

Partial Class ctrlAddAttribute 
    Inherits System.Web.UI.UserControl 
    Dim selectedID As String = Me.Parent.Page.selectedID() 

我得到错误“selectedID不是成员System.Web.UI.Page“

请adivse!

回答

9

当您将页面转换为名为_Default的实际实现时,您可以访问该属性。

Dim selectedID As String = DirectCast(Me.Page,_Default).selectedID() 

但这不是Usercontrol(可重用性)的目的。 通常情况下,您可以将Controller(页面)中的ID发送给UserControl。

因此,在UserControl中定义一个属性并在页面中设置它。 这样用户控件仍然可以在其他页面中工作。

+1

感谢蒂姆,我把你的建议。我添加了一个公共属性到我的控件中,并在我动态添加它时从页面中设置了该属性! – s15199d 2010-11-04 15:06:08

1

因为用户控件不属于该页面,所以不能直接访问它,除非您直接在包含页面的usercontrol中设置一个属性,或者创建一个循环遍历所有父对象的递归函数直到找到System.Web.UI.Page类型的对象。

对于第一个,你可以使用属性在用户控件(我使用了一个名为ParentForm物业这样做):

Private _parentForm as System.Web.UI.Page 
Public Property ParentForm() As System.Web.UI.Page ' or the type of your page baseclass 
    Get 
     Return _parentForm 
    End Get 
    Set 
     _parentForm = value 
    End Set 
End Property 

在“父母”页面,你会设置该属性的尽可能早的事件。我更喜欢使用PreLoad,因为它在加载之前(因此在大多数其他控件需要它时可用)和init之后。

Protected Sub Page_PreLoad(ByVal sender as Object, ByVal e as EventArgs) Handles Me.PreLoad 
    Me.myUserControlID.ParentForm = Me 
End Sub 

你也可以编写一个函数通过父控件来控制寻找页面。以下代码未经测试,因此可能需要调整,但这个想法很有道理。

Public Shared Function FindParentPage(ByRef ctrl As Object) As Page 
    If "System.Web.UI.Page".Equals(ctrl.GetType().FullName, StringComparison.OrdinalIgnoreCase) Then 
     Return ctrl 
    Else 
     Return FindParentPage(ctrl.Parent) 
    End If 
End Function 

编辑:您还因为它没有类型System.Web.UI.Page中存在不能直接访问该属性。正如@Tim Schmelter建议的那样,您可以尝试将页面转换为特定的页面类型_Default,或者如果这对于许多页面来说都是常见的,则可能需要创建基本页面类并将该属性包含在该类中。然后,你可以在页面继承这个类而不是System.Web.UI.Page

Public Class MyBasePage 
    Inherits System.Web.UI.Page 

    Public Property SelectedID() as Integer 
     ... 
    End Property 
End Class 

然后:

Partial Class _Default 
    Inherits MyBasePage 

    ... 

End Class