2009-10-30 117 views
9

Web部件生命週期described這樣的:爲什麼在回發時OnLoad/CreateChildControls順序發生變化?

在頁面加載

  1. 構造
  2. 的OnInit
  3. 的OnLoad
  4. ConnectionConsumer方法被調用,如果Web部件連接
  5. CreateChildControls ...

1日回發(回傳點擊 處理程序將通過公共 屬性ViewState)

  1. 構造
  2. 的OnInit
  3. 的CreateChildControls
  4. 的OnLoad
  5. 回傳點擊處理...

月2回傳(回傳點擊 處理程序將通過公共 屬性ViewState)

  1. 構造
  2. 的OnInit
  3. LoadViewState
  4. 的CreateChildControls
  5. 的OnLoad ...

就像你c看到OnLoad和CreateChildControls改變它們的順序。這在我的代碼中引入了一些困難,因爲我需要收集我以前在OnLoad元素中執行的各種數據。

是否有任何理由爲什麼訂單在回發階段發生變化?

回答

14

只要框架(或您自己)調用EnsureChildControls方法,就會調用CreateChildControls。只要你需要子控件在那裏,就應該調用這個方法。

在框架的情況下,它希望設置OnInit和OnLoad之間的發佈值(以便您可以在OnLoad期間訪問這些值)。因爲它需要控件來執行此操作,它會爲您調用EnsureChildControls。

如果沒有回發,也不需要設置值,因此對EnsureChildControls的調用將等待,直到框架確實需要控件。這恰好在OnLoad和OnPreRender之間。

+0

這是一個很好的答案。 – spa 2009-12-09 10:00:44

-4

這不應該發生,你確定嗎?有沒有其他線程運行,可能會使它看起來好像命令已經改變?

這畢竟只是ASP.NET,一個由計算機執行的程序(意思是它應該總是做同樣的事情,不像一個人)。

+0

是的我確定...--( – spa 2009-10-30 08:17:24

+0

這不是我自己想出來的東西,它在各種博客文章中都有描述(請參閱問題中的鏈接),我使用調試器對其進行了驗證 – spa 2009-10-30 08:23:01

相關問題