【问题标题】:Access Parent Page Property from User Control从用户控件访问父页面属性
【发布时间】:2010-11-04 14:28:31
【问题描述】:

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

这是我的 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 的成员”

请原谅!

【问题讨论】:

    标签: asp.net vb.net


    【解决方案1】:

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

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

    但这不是用户控件(可重用性)的目的。 通常,您会将 Controller(page) 中的 ID 提供给 UserControl。

    所以在 UserControl 中定义一个属性并从页面中设置它。 这样,UserControl 仍然可以在其他页面中工作。

    【讨论】:

    • 谢谢蒂姆,我接受了你的建议。我在控件中添加了一个公共属性,并在动态添加时从页面中设置它!
    【解决方案2】:

    因为用户控件不属于该页面,所以您无法直接访问它,除非您从包含页面显式设置用户控件中的属性,或者创建一个循环遍历所有父对象的递归函数,直到它找到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
    

    【讨论】:

      猜你喜欢
      • 2011-06-29
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-09
      • 2013-11-29
      • 2011-01-16
      相关资源
      最近更新 更多