2011-11-09 73 views
1

我有一個自定義控件,它在某種程度上模仿了內置的ASP.Net CheckboxList控件。在呈現事件中,我根據控件正在獲取的DataSource生成UL> LI> Checkbox#customId結構。堅持自定義ASP.Net控制狀態

我最大的疑惑在於,即使輸入的HTML元素在頁面上呈現,當提交回頁面時,Request.Form集合也沒有與這些輸入相關的數據。

所以,我的問題是這樣的: 一旦PostBack被觸發,有沒有辦法讓用戶檢查輸入?

由於提前, 卡利

+0

您是否可以在渲染以外的地方構建這些控件?聽起來像頁面生命週期的問題,但我可能會誤解問題。 –

回答

2

通常情況下,自定義服務器控件將實行SaveViewStateLoadViewState,並TrackViewState方法來管理控件的狀態。

我不知道該怎麼你的控制是建立,所以我不能給你確切的代碼,但在這裏是在我創建了一個控制使用這些方法的一個例子:

protected override void LoadViewState(object savedState) 
{ 
    if (savedState != null) 
    { 
     object[] state = (object[])savedState; 

     if (state[0] != null) 
      base.LoadViewState(state[0]); 
     if (state[1] != null) 
      ((IStateManager)ItemStyle).LoadViewState(state[1]); 
     if (state[2] != null) 
      ((IStateManager)headerStyle).LoadViewState(state[2]); 
     if (state[3] != null) 
      ((IStateManager)AlternatingItemStyle).LoadViewState(state[3]); 
    } 
} 

protected override object SaveViewState() 
{ 
    object[] state = new object[4]; 

    state[0] = base.SaveViewState(); 
    state[1] = itemStyle != null ? ((IStateManager)itemStyle).SaveViewState() : null; 
    state[2] = headerStyle != null ? ((IStateManager)headerStyle).SaveViewState() : null; 
    state[3] = alternatingItemStyle != null ? ((IStateManager)alternatingItemStyle).SaveViewState() : null; 

    return state; 
} 

protected override void TrackViewState() 
{ 
    base.TrackViewState(); 

    if (itemStyle != null) 
     ((IStateManager)itemStyle).TrackViewState(); 
    if (headerStyle != null) 
     ((IStateManager)headerStyle).TrackViewState(); 
    if (alternatingItemStyle != null) 
     ((IStateManager)alternatingItemStyle).TrackViewState(); 
} 

除了上面的方法,如果你想重新從Request對象的信息,您可以實現IPostBackDataHandler接口,這需要這兩種方法:

public virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection) 
{ 
    string somePostedValue = postCollection["SomePostedValue"]; 
    string anotherPostedValue = postCollection["AnotherPostedValue"]; 
} 

public virtual void RaisePostDataChangedEvent() 
{ 

} 
0

正如詹姆斯正確地指出,這是頁面生命的問題週期。

我最初做的是通過寫入HTmlTextWriter在Render方法上編寫UL> LI> Input結構。雖然此方法實際上創建了預期的HTML,但在回發時,FORM屬性未帶回任何已檢查的輸入。

我最終做的是使用Html服務器控件在CreateChildControls上創建控件。這樣,我就可以從FORM集合中檢索我正在尋找的信息。另外,正如James在他的回覆中指出的那樣,爲了將狀態從一個請求持久化到另一個請求,需要重寫LoadViewState和SaveViewState方法。