CẬP NHẬT:Tôi đã thử nghiệm các điều khiển của mình một số chi tiết và tôi nghĩ mình đã tiến gần hơn. Vui lòng đọc tiếp để biết thông tin cập nhật.Tại sao trẻ em của điều khiển người dùng tùy chỉnh của tôi không được khởi tạo?
Tôi có 2 điều khiển người dùng ASP.NET 2.0, một trong số đó được đặt bên trong của số khác. Bên trong của điều khiển bên trong tôi có một điều khiển thẻ HtmlAnchor
mà tôi đang cố gắng thiết lập một URL cho từ điều khiển bên ngoài. Khi tôi cố gắng đặt thuộc tính HRef
từ đánh dấu của trang kết xuất, kiểm soát HtmlAnchor
là null
và ném ngoại lệ.
URL set
thuộc tính đang được gọi là trước sự kiện OnInit của điều khiển bên trong hoặc bên ngoài và trước sự kiện 'OnPreInit
' của Trang chính. Tôi giả định điều này là bởi vì tôi đang thiết lập URL của điều khiển con trong đánh dấu kiểm soát cha mẹ trên trang tôi đang hiển thị các điều khiển có nghĩa là giá trị được đặt trước OnInit()
. Dưới đây là (rút gọn) phiên bản mã Tôi đang sử dụng:
[ParseChildren(true)]// <- Setting this to false makes the
// page render without an exception
// but ignores anything in the markup.
[PersistChildren(false)]
public partial class OuterControl : System.Web.UI.UserControl
{
// The private '_Inner' control is declared
// in the .ascx markup of the control
[PersistenceMode(PersistenceMode.InnerProperty)]
public InnerControl Inner
{
get{ return _Inner; }
set{ _Inner = value; }
}
}
public partial class InnerControl : System.Web.UI.UserControl
{
// The private 'linkHref' control is declared
// in the .ascx markup of the control
public string Url
{
get { return linkHref.HRef; }
set { linkHref.HRef = value; }
}
}
Các OuterControl được sử dụng trên trang Default.aspx của tôi như thế này:
<uc1:OuterControl ID="OuterCtrl1" runat="server">
<Inner Url="#" />
</uc1:OuterControl>
Trong ví dụ đánh dấu ở trên, nếu Tôi cố gắng hiển thị trang này một ngoại lệ bị ném vì điều khiển linkHref
là không. Sử dụng trình gỡ rối của tôi, tôi có thể thấy rằng mọi điều khiển trong InnerControl là null, nhưng cả hai sự kiện của OuterControl là OnInit()
chưa được kích hoạt khi thuộc tính Url
được truy cập.
CẬP NHẬT
Tôi nghĩ thêm các thuộc tính 'ParseChildren
' và 'PersistChildren
' sẽ giúp đỡ. Tôi đã sử dụng chúng trong Server Controls trước nhưng không bao giờ trong User Controls, mặc dù hiệu ứng có vẻ là tương tự. Tôi không nghĩ rằng tôi đang giải thích tài liệu cho hai thuộc tính này một cách chính xác, nhưng nó có thể ngăn chặn các ngoại lệ khỏi bị ném. Đánh dấu trang bị bỏ qua mặc dù.
Có ai biết cách làm việc này không. Tôi không hiểu tại sao các điều khiển này nhận được giá trị được đặt trước OnInit()
. Khi tôi cố gắng đặt giá trị của họ bằng cách sử dụng đánh dấu ASPX, hàm tạo cho số InnerControl
đang được gọi hai lần. Một lần để thiết lập các giá trị dựa trên đánh dấu (tôi giả định) và một lần nữa trên OnInit()
(mà tôi đoán là lý do tại sao các giá trị đánh dấu đang bị bỏ qua).
Nỗ lực này có vô vọng hay tôi đang tiếp cận nó từ góc độ sai?
Tôi đang đặt HRef trong đánh dấu của Trang, không phải là phương pháp OnInit. Tôi biết điều này xảy ra trước sự kiện OnPreInit() của Trang. Tôi muốn có thể sử dụng đánh dấu để thiết lập các giá trị điều khiển nếu có thể vì nó có nghĩa là không phải biên dịch lại để thực hiện thay đổi. –