Web开发有一个很大的特点,就是基于 Http 协议的通信方式。 Http 协议特点就是一个 Request 就有而只有一个 Response ,而且是无状态的通信方式。什么是无状态呢?那就是 client 端并没有一个状态记录,每次 client 端的页面都是从 server 端重新加载的, client 端之前所有的一切都会丢失,被从 server 端的数据重新覆盖。这就是为什么你在浏览网页的时候会看见出现一闪即逝的白屏,那就是 client 端刷新到之前的网页,而开始渲染刚从 server 端读到的数据。
这个特点非常重要,对我们实现一些功能有很大的影响。更详细的 http 模型请参考 。
那么因为 Asp.net 可以像有状态一样操作呢。我登陆了一个网站,接着我都是以我这个身份浏览其他页面。我开始搜索,把搜索结果翻到第二页,搜索条件我并没有重新输入啊。这些操作除了页面有刷新,其他的就像你操作一个 winform 程序没什么区别。那 Asp.net 是怎么做到的呢?
答案就是页面状态。 Asp.net 允许使用各种技术来帮助我们维持页面状态。
1. Session 。 当用户打开一个网站,就 server 端会分配一个 Session ,每个用户的 Session 都保存在服务器端,各不一样,不会被互相干扰。在 Asp.net 中的 Session 是一个 Dictionary[string, object] 。你可以用 Session[“key1”] = 100, 或者 object value1 = Session[“key1”] 。
2. Cookie 。 用户对应每个网站,都会在 client 端开辟一个 cookie 文件,来保存用户的 cookie 信息。 Cookie 只能存储 string 类型的信息,而且避免记录敏感信息,因为 Cookie 记录在 client 端,容易被人窃取。需要注意的是, cookie 是可以被用户禁用的,所以在开发网页的时候不能太过依赖 cookie 。
3. ViewState 。 ViewState 是 asp.net 的一个概念,可以存储一个页面上的所有状态。特别要提示的是 ViewState 只能保存一个页面的状态,跨页面就不行了。 ViewState 是一个类似 Dictionary[string, object] 的集合。它的用法和 Session 差不多,不过需要注意的是放入 ViewState 中的 object 必须是能够被序列化的。所有页面中的控件都会有自己的 ViewState ,不会相互干扰。
4. HiddenField 。 Asp.net 有一个 HiddenField 控件,你会发现添加了这个控件页面并没有任何显示,但其实它是一个隐藏控件,在 html 下的表示为 <input type=”hidden”/> 。是可以保持页面的数据。它的功能有点像 ViewState ,不过只能保存 string 类型的数据。
5. QueryString 。 QueryString 是一种对 Url 上的请求,比如: http://localhost/default.aspx?key1=value1&key2=value2,在 Asp.net 中, QueryString 是一个类似 Dictionary<string, string> 的数组。你可以用 string value1 = QueryString[“key1”] 来取值。
6. Application 。 Application 是 server 端的一个全局的状态变量。要注意的是,首先,这个状态变量是建立在内存中的,其次是这个状态变量是可以被网站的所有页面访问的。这就意味着它只能存储一些要公布的信息,而不能存储一些比较个人的信息了。
7. Cache 。 Cache 也是 server 端的全局的状态变量,而且它除了拥有 Application 的功能以外,还有一些它自己的特性,自动更新和释放。所有 Cache 比起 Application 更具有灵活性。在 Asp.net 里面你可以这样使用 Cache 。 Cache["key1"] = "Value 1"; 或者 Cache.Add("Key1", "Value"); 。
以上就是 Asp.net 可以使用的保持页面状态的机制。但是不要忘记,所有开辟在 server 端内存中的页面状态都会因为 website 重启中消失,但是导致 website 重启的可能性实在太多,所以太过依赖于服务器的 Session,Application,Cache 都不是安全的。当然, Asp.net 允许我们并不一定把页面状态存放在内存中哦,让我在之后讲。