雖然看起來「創建服務器控件」的「正確」方式是構造CreateChildControls調用中的所有子控件。但是由於很難知道什麼時候會被調用(這是整個點作爲性能優化),所以我在OnInit或OnLoad中看到我們的大部分開發人員都在構建它。這工作99%的案件。我們不得不使用CreateChildControls嗎?當「必須」我使用asp.net CreateChildControls()?
4
A
回答
4
您應該始終在CreateChildControls中構建您的子控件。這是生命週期中初始化並將其添加到控制樹的適當時間。其中一個原因是,許多時候調用EnsureChildContols方法,然後在必要時調用CreateChildControls。最佳實踐,就這樣做。
2
CreateChildControls方法被稱爲每當ASP.NET頁面框架需要創建控件樹,此方法調用不限於特定階段在控制的生命週期。例如,可以在加載頁面時,數據綁定期間或在渲染期間調用CreateChildControls。
0
性能方面,等待創建子控件將爲您的服務器節省一些不必要的CPU時間。例如,如果引發異常或在調用CreateChildControls()之前中斷了線程,則保存創建這些控件所需的時鐘週期。
有什麼理由說在OnInit中創建控件比在CreateChildControls()中更有效?
0
您將在Init或Load中創建控件,直到您編寫需要重新創建控件的控件爲止。
我發現最好是在CreateChildControls中創建控件,然後使用EnsureChildControls來控制確保在需要時創建它們。這使您可以通過將ChildControlsCreated設置爲false來拆除控件,並在需要時再次重新創建它們。
相關問題
- 1. 我必須使用BreezeController嗎?
- 2. 我必須使用循環
- 3. 我必須安裝哪個SQL Server版本才能使用asp.net?
- 4. 我是否必須在ASP.NET中使用Viewstate
- 5. 當我必須使用最後的聲明
- 6. 當我有svn @ sourceforge時,是否必須使用maven倉庫?
- 7. epoll:我必須使用多線程
- 8. 我必須使用Form標籤嗎?
- 9. 我必須使用按鈕嗎?
- 10. 我必須使用多少個線程
- 11. Googe Maps:我必須使用Ionic Native嗎?
- 12. 我必須使用wsgi_module的「def application」嗎?
- 13. 我是否必須使用UNION insted JOIN?
- 14. 爲什麼我必須使用-lstdC++ fs?
- 15. 我必須使用連接表嗎? [MYSQL]
- 16. 我必須使用Flash Media Encoder嗎?
- 17. 我必須用根生產
- 18. ASP.NET C#必須聲明
- 19. asp.net的DataReader,必須關閉
- 20. 我必須在python
- 21. 我必須在Blueprint.js
- 22. 當我在UITableView中實現-scrollViewDidScroll:UIScrollViewDelegate時,我必須調用super嗎?
- 23. 當我們必須使用DebuggerDisplay屬性?使用這個的優點是什麼?
- 24. RadGrid覆蓋CreateChildControls
- 25. 如果我想使用Hibernate和Annotation,我必須使用javax.persistence。*嗎?
- 26. 驗證必須使用XVAL
- 27. 是否必須使用SSL?
- 28. 我必須用我的活動
- 29. 我是否必須預編譯asp.net mvc應用程序?
- 30. 使用問題,爲什麼我必須使用使用global :: MyName.SubName?
不,我說的是使用CreateChildControls更高效,因爲可能避免不必要的工作。然而,有時候需要等一等,比如說base.OnLoad,因爲它會得到一些數據,這些數據將決定你應該如何創建這些孩子。在這種情況下,由於您不知道何時會調用EnsureChildControls,因此無法將子級創建延遲至OnLoad之後。它工作,如果我只是在OnLoad中創建一切... – Xerion 2009-10-01 23:46:37
@ Xerion:足夠公平。我不知道爲什麼你的CreateChildControls無法獲取數據,但我確定有一些設計理由。 – JustLoren 2009-10-02 12:53:29
如果這是最好的論據,那是多麼愚蠢的「優化」。誰在乎,如果請求需要150ms而不是149.5ms,如果它導致400/500 *這應該是罕見的*? – 2012-08-06 02:19:22