Asp.net中的视图状态机制

视图状态和状态管理
    我们知道HTTP协议是一个无状态的协议,而WEB应用程序就建立在HTPP协议上,我们也知道WEB应用程序是一个状态连续的应用.比如:当你在进行了一个操作以后我们需要保持处理后的状态然后再进行其他的处理,此是我们需要一种状态保持机制.那么建立在无状态的HTTP协议上的WEB应用这样才能保持状态呢?下面我们来分析:
    
    我们知道传统的ASP用Session,Cookies来保存状态,在ASP.NET中我们当然也可以用(兼容ASP),但是Session不能扩展,Cookie不能被所有的应用程序所依赖.所以ASP.NET为我们提供了一种新的机制叫做"视图状态(View State)"
    
    视图状态是一种全新的机制,在服务器控件的开发中使用它也是很简单,前面已经讲到,所有的服务器控件都是从Control类或它的某个派生类中继承,Control类有一个ViewState属性,这个属性是System.Web.UI.StateBag类型("键/值对字典)",控件的状态信息都可以保存在这个从Control类继承而来的ViewState属性中.

我们来看一个例子:
public string UserName
{
    get
    {
        object o = ViewState["username"];         
        return o == null?String.Empty:(string)o;
    }
    set
    {
        ViewState["username"] = value;
    }
}

    这是自定义服务器控件里面的一个属性的定义,在包含这个控件的页面回传后,会重新加载这个控件,在控件初始化以后ViewState会跟踪这个UserName属性,如果这个属性在初始化以后被修改了,那么ViewState会在控件的可串行化视图状态(页面中的__ViewState隐含元素)中保存属性的值.
    
    那么视图状态是这样工作的呢?
    在处理好一个页面请求后,准备发送到客户端之前,服务器端就把整个页面中所有控件的状态(当然还包括其他的一些信息)串行化到一个字符串中,然后把这个字符串发送到客户端(我们查看源文件所看到的__ViewState隐含元素),当客户端页面回传到服务器端的时候,页面框架读出上次的状态并将这个串行化的数据并行化对应到每个控件,将上次保存在隐含元素中的状态信息与本次收集到的信息比较然后自动更新每个控件的ViewState字典中保存的控件状态

可以在视图状态中存储的类型
(to be continue...)

你可能感兴趣的:(asp.net)