构建自定义控件之二——ViewState和ControlState

来源:互联网 发布:动艺网络 编辑:程序博客网 时间:2024/04/28 12:39

ASP.NET利用一个名为_VIEWSTATE的隐藏表单域在回传中保存控件属性的状态。如果想要保存控件的属性值,就要把控件属性值添加到该隐藏的表单域。2.0支持在回传/回发保存值得两种方法:视图状态和控件状态

2.1支持视图状态

使用ControlPage类的ViewState属性把值添加到视图状态。

理论上讲,可以添加任何可序列化类的实例到ViewState,但在实践中,应当只添加间的地值到ViewState,否则会影响页面的执行效率。

代码示例:ViewStateControl.cs

 


using System;
using System.Collections.Generic;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace JerryShi.Controls
{
    
public class ViewStateControl : WebControl
    
{
        
private string _text;

        
public string Text
        
{
            
get return _text; }
            
set { _text = value; }
        }


        
public string ViewStateText
        
{
            
get
            
{
                
if (ViewState["ViewStateText"].Equals(null))
                
{
                    
return string.Empty;
                }

                
else
                
{
                    
return ViewState["ViewStateText"].ToString();
                }

            }

            
set
            
{
                ViewState[
"ViewStateText"= value;
            }

        }


        
protected override void RenderContents(HtmlTextWriter writer)
        
{
            writer.Write(
"Text:" + Text);
            writer.WriteBreak();
            writer.Write(
"ViewStateText:" + ViewStateText);
            writer.WriteBreak();
        }


    }

}

 

注:ViewState在页面InitComplete事件之后才进行加载,在页面PreRenderComplete事件之后进行保存。所以我们不应该在InitComplete事件之前或之中检索视图状态,也不应在PreRenderComplete事件之后向视图状态添加值。

2.2支持控件状态

与视图状态不同的是:控件状态无法禁用,而视图状态可以通过设置控件的EnableViewState属性为False禁用。

注:将最重要的信息保存在ControlState中。

代码示例:ControlStateControl.cs

 


using System;
using System.Collections.Generic;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace JerryShi.Controls
{
    
public class ControlStateControl : WebControl
    
{
        
private string _controlStateText;

        
public string ControlStateText
        
{
            
get return _controlStateText; }
            
set { _controlStateText = value; }
        }


        
public string ViewStateText
        
{
            
get
            
{
                
if (ViewState["ViewStateText"].Equals(null))
                
{
                    
return string.Empty;
                }

                
else
                
{
                    
return ViewState["ViewStateText"].ToString();
                }

            }

            
set
            
{
                ViewState[
"ViewStateText"= value;
            }

        }


        
protected override void OnInit(EventArgs e)
        
{
            Page.RegisterRequiresControlState(
this);
            
base.OnInit(e);
        }


        
protected override object SaveControlState()
        
{
            
return _controlStateText;
        }


        
protected override void LoadControlState(object savedState)
        
{
            _controlStateText 
= savedState.ToString();
        }


        
protected override void RenderContents(HtmlTextWriter writer)
        
{
            writer.Write(
"ViewStateText:" + ViewStateText);
            writer.WriteBreak();
            writer.Write(
"ControlStateText:" + ControlStateText);
            writer.WriteBreak();
        }

    }

}

 

重写了WebControl基类的OnInit()SaveControlState()LoadControlState()方法。

OnInit——初始化控件

SaveControlState——保存视图状态

LoadControlState——加载视图状态

原创粉丝点击