2010-06-04 42 views
0

我不完全理解ASP.NET如何繼承控件。 我有一個用戶控件,ucBase,它在ascx文件中有一個asp.net標籤。後面的代碼引用標籤,如果控件不是另一個用戶父項的父項,則它在運行時正常工作。當用戶控制用作基本用戶控件時,用戶控件中的服務器ccntrols爲空(asp.net)

如果我有另一個用戶控件,ucChild從ucBase繼承,ucBase代碼中的標籤始終爲空。 ucChild在其ascx文件中沒有控件

服務器控件(如標籤)需要在ascx文件中聲明,而不是以編程方式創建。

ucBase在父級用戶控件中查看自己的控件需要做什麼?

回答

1

問題:

繼承既繼承了您的用戶控件的代碼的一部分。標記不是可以繼承的東西,因爲它是在運行時動態編譯的。

標記和代碼隱藏之間的關係是通過用戶控件附帶的.designer.cs部分類完成的。這個設計器文件包含標記中所有對象的聲明。這基本上是用一堆空對象引用的字段來裝飾代碼隱藏類 - 當運行編譯的標記代碼時,這些將用實際實例初始化。

當您從.ascx文件繼承時,您正在繼承所有這些空對象佔位符。但是,由於新控件中的標記與父控件不同,因此當新控件的標記不包含相應的標記時,實際上不會創建這些對象,並且在分析和編譯標記時,所有引用將保留空值。這有意義嗎?

的修復:

要做到這一點,最好的辦法就是讓自包含的用戶控件,基於代碼即有利於組成,而不是基於標記。換句話說,不是使用標記,而是使用Page_Init設置用戶控件,並將所需的所有控件添加到後面代碼中的Controls集合中。

然後,當您繼承此類時,將會執行所有相同的代碼,以確保您的子usercontrol在其中具有相同的UI控件。

+0

我希望基本用戶控件在自己的acsx文件上訪問自己的控件。這不是孩子用戶控件試圖訪問父控件的情況。基本用戶控件是一個獨立控件。當另一個用戶控件繼承它時,基本用戶控件不再像一個自包含的用戶控件一樣工作。 我提到我有一個原因,我希望控件在ascx文件中聲明,而不是以編程方式創建。那麼是否沒有辦法在沒有編程創建控件的情況下進行這項工作? – 2010-06-04 17:45:44

+0

這是正確的,沒有辦法。 .ASCX文件適用於小型可重複使用的內容塊,實際上不是爲了分發或繼承而構建的。 – womp 2010-06-04 18:13:27