保持自定义ASP.Net控件的状态

时间:2011-11-09 23:08:46

标签: asp.net

我有一个自定义控件,在某种程度上模仿内置的ASP.Net CheckboxList控件。在渲染事件中,我根据控件获取的DataSource生成UL> LI> Checkbox#customId结构。

我最大的困惑是,即使输入HTML元素在页面上呈现,在提交页面时,Request.Form集合也没有与这些输入相关的数据。

所以,我的问题是: 一旦触发了PostBack,有没有办法让用户检查输入?

提前致谢, 卡利

2 个答案:

答案 0 :(得分:2)

通常,自定义服务器控件将实施SaveViewStateLoadViewStateTrackViewState方法来管理控件的状态。

我不知道你是如何构建控件所以我不能给你确切的代码,但这里是我创建的控件中使用的那些方法的一个例子:

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方法。