2010-11-04 32 views
8

Cố gắng truy cập thuộc tính từ trang cha mẹ trên điều khiển người dùng của tôi.Truy cập thuộc tính trang cha mẹ từ điều khiển người dùng

Đây là sự khởi đầu của codebehind default.asp tôi:

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 

Đây là sự khởi đầu của codebehind điều khiển người dùng của tôi:

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

Tôi nhận được thông báo lỗi "selectedID chưa là thành viên của System.Web.UI.Page "

Vui lòng kích thích!

Trả lời

9

Bạn có thể truy cập thuộc tính khi bạn truyền Trang tới trang web thực hiện được gọi là _Default.

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

Nhưng đó không phải là mục đích của Usercontrol (khả năng sử dụng lại). Thông thường bạn sẽ cung cấp ID từ Controller (trang) cho UserControl.

Vì vậy hãy xác định thuộc tính trong UserControl và đặt nó từ trang. Bằng cách này, UserControl sẽ vẫn hoạt động ở các trang khác.

+1

Cảm ơn Tim, tôi nghe theo lời khuyên của bạn. Tôi đã thêm thuộc tính công khai vào kiểm soát của mình và đặt thuộc tính đó từ trang khi tôi tự động thêm nó! – s15199d

1

Vì điều khiển người dùng không thuộc trang, bạn không thể truy cập trực tiếp trừ khi bạn đặt rõ ràng thuộc tính trong điều khiển người dùng từ trang bao gồm hoặc tạo hàm đệ quy đi qua tất cả đối tượng cha cho đến khi nó tìm thấy một đối tượng thuộc loại System.Web.UI.Page.

Đối với người đầu tiên, bạn có thể sử dụng một tài sản (Tôi đã làm điều này bằng cách sử dụng tài sản được gọi ParentForm) trong việc kiểm soát sử dụng:

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 

Trong trang "Cha mẹ", bạn sẽ thiết lập thuộc tính này trong một sự kiện càng sớm càng tốt. Tôi thích sử dụng PreLoad vì nó đến trước khi tải (do đó có sẵn khi hầu hết các điều khiển khác sẽ cần nó) và sau init.

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

Bạn cũng có thể viết một chức năng troll thông qua điều khiển chính để tìm trang. Đoạn mã sau chưa được kiểm tra để nó có thể yêu cầu tinh chỉnh, nhưng ý tưởng là âm thanh.

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 

EDIT: Bạn cũng không thể truy cập trực tiếp thuộc tính này bởi vì nó không tồn tại trong loại System.Web.UI.Page. Như @Tim Schmelter đề xuất, bạn có thể cố gắng truyền trang tới loại trang cụ thể _Default hoặc nếu đây là điều phổ biến đối với nhiều trang của bạn, bạn có thể cần phải tạo lớp trang cơ sở và bao gồm thuộc tính của bạn trong lớp đó. Sau đó, bạn có thể kế thừa lớp này thay vì System.Web.UI.Page

Public Class MyBasePage 
    Inherits System.Web.UI.Page 

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

Sau đó, trong trang:

Partial Class _Default 
    Inherits MyBasePage 

    ... 

End Class 
Các vấn đề liên quan