2010-10-10 19 views
0

在面嚮對象語言中,如果類A包含類B作爲成員,那麼可以從類A的構造函數中訪問類B的屬性(在首先實例化類B之後)。在ASP.Net中,爲什麼我無法從ASPX頁面的構造函數訪問服務器控件的屬性?

但是在ASP.Net中,我的理解是Page對象包含服務器控件對象作爲其成員,但我不明白爲什麼,如果嘗試從Page構造函數訪問服務器控件的屬性,會得到一個NullReferenceException 。

回答

3

在構造函數中,ASPX還沒有運行,所以所有的服務器端控件都是null

將您的代碼移動到Page_Load

+0

服務器控件對象是在頁面的構造函數調用其構造函數時創建的!這些對象不會在以後創建。正確的,他們應該可以從頁面構造函數中獲得。 – Aperture 2010-10-10 02:44:09

+0

當然,後來的事情會發生作用,但我想推動理論上的界限。 – Aperture 2010-10-10 02:46:31

+1

如果你想得到所有的理論知識,學習頁面生命週期,然後開始在頁面構造器或你喜歡的地方編寫你自己的子控件實例化代碼。但這不是ASP.NET自己做的。 – 2010-10-10 03:10:41

4

這聽起來更像是生命週期問題。包含在頁面上的控件不是與您的Page對象同時創建的,而是在您的httprequest循環中。

此頁面給出了循環的清晰圖片:http://msdn.microsoft.com/en-us/library/ms178472.aspx

您應該改寫Init方法以確保您的控件已初始化。文章引用

所有控件初始化並且已應用任何外觀設置後引發。個別控件的Init事件發生在頁面的Init事件之前。 使用此事件來讀取或初始化控件屬性。

+0

服務器控件對象是在頁面的構造函數調用其構造函數時創建的!這些對象不會在以後創建。 – Aperture 2010-10-10 02:42:54

+0

我不是我確定跟着你...當調用頁面的構造函數時,servercontrols(帶有runat =「server」的標籤)不一定會創建。我絕不會依賴它,並建議編寫依賴於子控件的代碼,以便將頁生命週期考慮在內。 – 2010-10-10 02:54:11

+0

@BurningIce:比方說,我們有一個UserControl(如一個迷你aspx頁面),其中包含服務器控件。如果只能從UserControl.Load事件訪問這些服務器控件,則可能會產生問題,因爲使用此用戶控件的將來頁面將無法在UserControl_Load事件之前訪問子服務器控件。然後人們只能猜測這些服務器控件何時可用。你看,不確定性不好... – Aperture 2010-10-10 03:04:02

相關問題