我有一个自定义控件,在某种程度上模仿内置的ASP.Net CheckboxList控件。在渲染事件中,我根据控件获取的DataSource生成UL> LI> Checkbox#customId结构。
我最大的困惑是,即使输入HTML元素在页面上呈现,在提交页面时,Request.Form集合也没有与这些输入相关的数据。
所以,我的问题是: 一旦触发了PostBack,有没有办法让用户检查输入?
提前致谢, 卡利
答案 0 :(得分:2)
通常,自定义服务器控件将实施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()
{
}
答案 1 :(得分:0)
正如詹姆斯正确指出的那样,这是页面生命周期的问题。
我最初做的是通过写入HTmlTextWriter在Render方法上编写UL> LI>输入结构。虽然这种方法实际上创建了预期的HTML,但在回发时,FORM属性没有带回任何已检查的输入。
我最终要做的是使用Html服务器控件在CreateChildControls上创建控件。这样,我就可以从FORM集合中检索我正在寻找的信息。
另外,正如James在回复中指出的那样,为了将状态从一个请求持久保存到另一个请求,需要重写LoadViewState和SaveViewState方法。