2012-01-26 61 views
4

我有一個關於asp.net中的視圖狀態和自定義控件的問題。asp.net中的視圖狀態和自定義控件

說我有一個頁面和一個簡單的複合控件。我知道在複合控件中,我必須將所有子控件加載到Page.OnInit上,以便可以應用它們的視圖狀態併爲OnLoad做好準備。

現在說我在頁面上有一棵樹,並基於選定的節點我想加載某個自定義控件。 TreeView的selectedNode在OnInit期間不可用,但在OnLoad和之後可用。我也知道,如果我在頁面的OnLoad上添加一個自定義控件,該頁面的海關控制的週期仍將從OnInit開始,然後到OnLoad等。

所以我的問題是,如果自定義控件的OnInit是仍然被調用,即使我在父級的OnLoad方法中加載此控件,爲什麼viewstate不填充自定義控件?

是否因爲父級包含孩子的視圖狀態,如果我從父母的OnLoad載入孩子viewstate不可用?

如果您有上述情況(使用樹視圖),您通常會如何加載自定義控件?

+5

難道你不能將問題分段嗎? – gdoron

+0

對我來說聽起來正確。您是否驗證過回發之前和之後的控件樹是否相同? –

回答

1

ASP.NET 確實即使他們添加到頁面中OnLoad,因爲這示例說明了孩子負載ViewState的控制:

protected override void OnLoad(EventArgs e) 
{ 
    Literal literal = new Literal(); 
    this.placeHolder.Controls.Add(literal); 
    if (!this.IsPostBack) 
     literal.Text = "I'm still here after a postback."; 
} 

需要注意的是,默認情況下,ASP.NET視圖狀態加載基於子控件的索引,因此確保控件的順序從一個回傳到下一個回傳。