1

这行得通,但这是正确的方法吗???

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

我在控件上有一个公共文本属性。在获取/设置中,我获取/设置控件的视图状态 - 这部分很容易,但是当通过 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 + ">.....

}

谢谢

4

3 回答 3

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 移植的,没有检查,希望我没有犯任何错误,但无论如何它应该明白这一点)

于 2008-10-21T02:35:28.210 回答
0

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

于 2008-10-21T01:22:49.403 回答
0

Hmm I wonder if we can use the existing ASP.NET persistence... try inheriting from the most basic post-back state persisting control (I'm thinking asp:hidden). Then just override the render and add all the jazz you want.

Let me know if it works, then I won't have to test :)

于 2009-03-05T19:26:00.550 回答