我有一個自定義控件,它在某種程度上模仿了內置的ASP.Net CheckboxList控件。在呈現事件中,我根據控件正在獲取的DataSource生成UL> LI> Checkbox#customId結構。堅持自定義ASP.Net控制狀態
我最大的疑惑在於,即使輸入的HTML元素在頁面上呈現,當提交回頁面時,Request.Form集合也沒有與這些輸入相關的數據。
所以,我的問題是這樣的: 一旦PostBack被觸發,有沒有辦法讓用戶檢查輸入?
由於提前, 卡利
我有一個自定義控件,它在某種程度上模仿了內置的ASP.Net CheckboxList控件。在呈現事件中,我根據控件正在獲取的DataSource生成UL> LI> Checkbox#customId結構。堅持自定義ASP.Net控制狀態
我最大的疑惑在於,即使輸入的HTML元素在頁面上呈現,當提交回頁面時,Request.Form集合也沒有與這些輸入相關的數據。
所以,我的問題是這樣的: 一旦PostBack被觸發,有沒有辦法讓用戶檢查輸入?
由於提前, 卡利
通常情況下,自定義服務器控件將實行SaveViewState
,LoadViewState
,並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()
{
}
正如詹姆斯正確地指出,這是頁面生命的問題週期。
我最初做的是通過寫入HTmlTextWriter在Render方法上編寫UL> LI> Input結構。雖然此方法實際上創建了預期的HTML,但在回發時,FORM屬性未帶回任何已檢查的輸入。
我最終做的是使用Html服務器控件在CreateChildControls上創建控件。這樣,我就可以從FORM集合中檢索我正在尋找的信息。另外,正如James在他的回覆中指出的那樣,爲了將狀態從一個請求持久化到另一個請求,需要重寫LoadViewState和SaveViewState方法。
您是否可以在渲染以外的地方構建這些控件?聽起來像頁面生命週期的問題,但我可能會誤解問題。 –