在自定义服务器控件中维护状态的正确方法是什么?

时间:2008-10-21 01:09:40

标签: c# asp.net custom-server-controls servercontrols

这有效,但这是正确的方法吗?

我有一个自定义服务器控件,上面有一个[输入]框。我希望它有点模仿ASP.NET TextBox,但不完全。渲染文本框时,我有一个javascript,允许用户选择随后放在该输入框中的值。

我在控件上有一个公共文本属性。在get / set中我获取/设置控件的视图状态 - 该部分很简单,但是当通过javascript填充控件时,实际上并未调用Text get,使用JavaScript设置此公开属性的正确方法是什么(或者即使用户只是输入框中的内容)?

编辑: 在OnInit中,我确保通过达到表单值来维护状态。

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        if (HttpContext.Current.Request.Form["MyInputBoxValue"] != "")
        {
            ViewState["MyInputBoxValue"] 
               = HttpContext.Current.Request.Form["MyInputBoxValue"];
        }
    }

然后在HtmlTextWrite中实际返回值,我这样做:

protected override void RenderContents(HtmlTextWriter output)
{

        // There is an input control here and i set its value property
        // like this using the Text internal defined.
        output.Write("<input value=" + Text + ">.....

}

感谢

3 个答案:

答案 0 :(得分:1)

我发现使用IStateManager效果最好。

例如:

partial class MyControl : System.Web.UI.UserControl, IStateManager
{
    [Serializable()]
    protected struct MyControlState
    {
        public bool someValue;
        public string name;
    }

    protected MyControlState state;

    public bool someValue {
        get { return state.someValue; }
        set { state.someValue = value; }
    }

    public bool IsTrackingViewState {
        get { return true; }
    }

    protected override void LoadViewState(object state)
    {
        if ((state != null) && state is MyControlState) {
            this.state = state;
        }
    }

    protected override object SaveViewState()
    {
        return state;
    }

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

getDefaultState()只会将一些合理的默认值加载到新的状态结构中。状态在页面的视图状态中被跟踪,ASP将负责为您带来/输出。

(以上代码从VB移植而未经过检查,希望我没有发现任何错误,但无论如何都应该得到重点)

答案 1 :(得分:0)

如果您需要在回发时维护状态,则必须提供自己的方法 记录用户在客户端使用您的控件所做的事情  然后在服务器上更新服务器控件 更改,或在页面刷新时重做客户端上的更改。

答案 2 :(得分:0)

嗯,我想知道我们是否可以使用现有的ASP.NET持久性...尝试继承最基本的后备状态持久控制(我在想asp:hidden)。然后只需覆盖渲染并添加所需的所有爵士乐。

让我知道它是否有效,那么我将不必测试:)。