【问题标题】:What is the proper way to maintain state in a custom server control?在自定义服务器控件中维护状态的正确方法是什么?
【发布时间】:2010-09-18 05:46:45
【问题描述】:

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

我有一个自定义服务器控件,上面有一个 [输入] 框。我希望它有点模仿 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 + ">.....

}

谢谢

【问题讨论】:

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


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

    【讨论】:

    • 这就像一个冠军,特别是我必须设置一个值来检查项目是否脏:if (!((IDictionary)_viewstate).Contains("CustomValue") || _viewstate .IsItemDirty("CustomValue"))
    • 在您的LoadViewState() 方法中,您将丢弃传入参数state,方法是用getDefaultState() 的返回值覆盖它。这是故意的吗?
    • @ChrisWalsh 不,7 年后再看这个,我不知道为什么会出现这种情况,也不知道它最初来自什么代码库。我删除了那条线,这对我来说似乎很有意义(尽管需要注意,我至少有 5 年没有做过 ASP WebForms)。感谢您指出。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      让我知道它是否有效,然后我就不必测试了:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-18
        • 2016-12-29
        • 2012-05-21
        • 2016-06-18
        • 2010-09-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多