2010-05-10 64 views
1

我正在處理一個ASP.NET項目,其中絕大多數表單是在運行時動態生成的(表單定義存儲在數據庫中以進行自定義)。因此,無論IsPostBack如何,每次OnLoad觸發時,我都必須動態創建控件並將其添加到頁面中。這一直工作得很好,.NET負責爲這些控件管理ViewState。動態創建控件和ASP.NET頁生命週期

protected override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 
    RenderDynamicControls() 
} 

private void RenderDynamicControls() 
{ 
    //1. call service layer to retrieve form definition 
    //2. create and add controls to page container 
} 

我如果用戶點擊一個給定的按鈕(這個按鈕在設計時創建)的頁面應該重新呈現在一個稍微不同的方式,其中的新要求。因此,除了在的OnLoad執行的代碼(即RenderDynamicControls()),我有這樣的代碼:

protected void MyButton_Click(object sender, EventArgs e) 
{ 
    RenderDynamicControlsALittleDifferently() 
} 

private void RenderDynamicControlsALittleDifferently() 
{ 
    //1. clear all controls from the page container added in RenderDynamicControls() 

    //2. call service layer to retrieve form definition 

    //3. create and add controls to page container 
} 

我的問題是,這是真的來完成我後的唯一途徑?爲了響應點擊按鈕,有效地渲染表單兩次似乎超越了哈希。我從我的研究中收集到,這就是頁面生命週期在ASP.NET中的工作原理:即,在調用子事件之前,OnLoad必須在每個Postback上觸發。儘管如此,在喝酒之前還需要與SO社區進行覈實。

在相關說明中,一旦完成此功能,我計劃在頁面上拋出一個UpdatePanel以通過Ajax執行頁面更新。任何使代碼轉換變得更簡單的代碼/建議將會受到重視。

+0

歡迎使用ASP.NET。準備將所有邏輯扔出窗外 – 2010-05-11 02:25:44

回答

2

從德克德克:-)

你是什麼意思與RenderDynamicControls?創建並設置控件?如果這是你的意圖而不是ASP.NET管理你的ViewState,但是你願意。如果您在每個負載上填寫控件,則始終會覆蓋現有的ViewState!

如果要使用ViewState,請在頁面init事件中創建控件並將其填充到加載事件中,但前提是請求不是回發。這是必要的,因爲ASP.NET在init和load之間重新創建ViewState。這也是你描述的兩個「渲染週期」的原因。您需要第一個控件創建週期,因爲如果沒有適當的控件集,ASP.NET無法恢復ViewState,並且ASP.NET不能在沒有它的情況下正確響應您的響應。

回到您的代碼:一般來說,RenderDynamicControlsALittleDifferently將無法工作 - 因爲您在頁面生命週期中創建控件的時間太晚,並且會通過向控件集合中插入新對象來損壞ViewState。在類似的情況下,我通過將頁面重定向到自己來解決此問題(Response.Redirect)。在這種情況下,RenderDynamicControls會在您更改內部狀態後基於「稍有不同的情況」來完成這項工作。