2009-10-01 76 views
4

雖然看起來「創建服務器控件」的「正確」方式是構造CreateChildControls調用中的所有子控件。但是由於很難知道什麼時候會被調用(這是整個點作爲性能優化),所以我在OnInit或OnLoad中看到我們的大部分開發人員都在構建它。這工作99%的案件。我們不得不使用CreateChildControls嗎?當「必須」我使用asp.net CreateChildControls()?

回答

4

您應該始終在CreateChildControls中構建您的子控件。這是生命週期中初始化並將其添加到控制樹的適當時間。其中一個原因是,許多時候調用EnsureChildContols方法,然後在必要時調用CreateChildControls。最佳實踐,就這樣做。

2

Control Execution Lifecycle

CreateChildControls方法被稱爲每當ASP.NET頁面框架需要創建控件樹,此方法調用不限於特定階段在控制的生命週期。例如,可以在加載頁面時,數據綁定期間或在渲染期間調用CreateChildControls

0

性能方面,等待創建子控件將爲您的服務器節省一些不必要的CPU時間。例如,如果引發異常或在調用CreateChildControls()之前中斷了線程,則保存創建這些控件所需的時鐘週期。

有什麼理由說在OnInit中創建控件比在CreateChildControls()中更有效?

+0

不,我說的是使用CreateChildControls更高效,因爲可能避免不必要的工作。然而,有時候需要等一等,比如說base.OnLoad,因爲它會得到一些數據,這些數據將決定你應該如何創建這些孩子。在這種情況下,由於您不知道何時會調用EnsureChildControls,因此無法將子級創建延遲至OnLoad之後。它工作,如果我只是在OnLoad中創建一切... – Xerion 2009-10-01 23:46:37

+0

@ Xerion:足夠公平。我不知道爲什麼你的CreateChildControls無法獲取數據,但我確定有一些設計理由。 – JustLoren 2009-10-02 12:53:29

+0

如果這是最好的論據,那是多麼愚蠢的「優化」。誰在乎,如果請求需要150ms而不是149.5ms,如果它導致400/500 *這應該是罕見的*? – 2012-08-06 02:19:22

0

您將在Init或Load中創建控件,直到您編寫需要重新創建控件的控件爲止。

我發現最好是在CreateChildControls中創建控件,然後使用EnsureChildControls來控制確保在需要時創建它們。這使您可以通過將ChildControlsCreated設置爲false來拆除控件,並在需要時再次重新創建它們。