现在的位置: 首页 > 综合 > 正文

服务器控件-视图状态与状态管理-笔记(6)

2012年02月09日 ⁄ 综合 ⁄ 共 3571字 ⁄ 字号 评论关闭

web应用程序创建于HTTP协议的顶层,这个协议是一个无状态的协议.

页面和它的子控件是基于每一个请求而创建的,请求最后阶段被删除.

然而在一个Web请求的持续时间外,保持信息,常常是需要的.

这个机制在传统的ASP状态管理编程是可用的,比如session,cookies.

然而session不可扩展,cookies不能被所有的应用程序所依赖.

 

asp.net提供了一个新机制---视图状态(view state)

这种机制可以使页面和它的子控件在,从服务器到客户端,再从客户端返回的,往返过程中,保持状态信息.

视图状态提供了一种简单而方便的技术,可以在一个固有的,无状态环境之上,创建一个,有状态的,并持续执行的页面的效果.

本质上,默认的视图状态机制包括了通过页面上一个隐含的变量,来保持状态信息.

 

使用视图状态机制的最简单的方法就是通过控件,从Control类继承来的Viewstate属性.

ViewState属性,输入System.Web.UI.StateBag类型---一个键/值对的字典,控件属性的值可以储存到这里.

控件ViewStateDemoLabel定义了两个属性text和textinviewstate.

text存到私有域中,

把TextInViewState存储到ViewState字典中.

using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace MSPress.ServerControls
{
    public class ViewStateDemoLabel:WebControl
    {
        private string _text;
        public string Text {
            get { return(_text==null)?String.Empty:_text;}
            set { _text=value;}
        }
        public string TextInViewState
        {
            get
            {
                object o=ViewState["TextInViewState"];
                return (o==null)?String.Empty:(string)o;
            }
            set
            {
                ViewState["TextInViewState"] = value;
            }
        }
        protected override void RenderContents(HtmlTextWriter writer)
        {
            writer.Write("Text=");
            writer.Write(Text);
            writer.Write("<br>");
            writer.Write("TextInViewState=");
            writer.Write(TextInViewState);
        }
    }

}

当页面框架在回传之后重载家在控件时,会自动重新存储一些属性,

这些属性在上一次请求的处理过程的最后,将他们的状态值,存储到ViewState中.

当属性被存储到ViewState字典中时,

ViewState会在控件初始化后,跟踪属性.

只有当属性初始化后,被修改时,ViewState才会在控件的可串行化视图状态中,

保存属性的值.

这个过程最小化了往返过程中数据的大小.

使用ViewState作为属性存储,自定义控件,可以容易地进行基本的状态管理,

而不用事先自定义的状态管理逻辑程序.

如果属性没有出现在ViewState字典中,那么属性获取操作(Getter)必须返回与属性相关的默认值.

 

用于在ViewState中,存储属性的键,通常是代表属性名的字符串.

 

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>

<%@ Register Assembly="MSPress.ServerControls" Namespace="MSPress.ServerControls"
    TagPrefix="msp" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
    <script runat="server">
        void button1_Click(object sender, EventArgs e)
        {
            demolable1.Text = textbox1.Text;
            demolable1.TextInViewState = textbox2.Text;
        }
        </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
       First Name: <asp:TextBox ID="textbox1" runat="server"></asp:TextBox><br />
       Last Name:  <asp:TextBox ID="textbox2" runat="server"></asp:TextBox>
    </div>  
    <div>
        <asp:Button ID="button1" runat="server" Text="Submit" OnClick="button1_Click" />
        <asp:Button ID="button2" runat="server" Text="ReLoad"/>
    </div>
    <div>
        <msp:ViewStateDemoLabel ID="demolable1" runat="server" Font-Size="Medium" Font-Names="Verdana" />
    </div>
    </form>
</body>
</html>

HTML源代码,有一个隐含的input控件,名为"_VIEWSTATE".64基数编码字符串,这个字符串包含了页面和所有控件的串行化的视图状态.

了解页面和每一个控件的视图状态大小:

<%@PageLanguage=”C#” Trace=”true”%>

可在视图状态中存储多种类型:

视图状态串行化机制默认支持:

Int32,Boolean,String,Unit,Color.

为Arrary,ArraryList和包含上面列出类型的Hashtable对象而优化.

使用Session和Application对象

有时,控件可能需要跨用户对话,甚至跨应用程序复用数据.

Asp.net提供的内部Session和Application对象的一些总体的准则:

1。用视图状态,存储控件需要在回传后,恢复状态数据.

2。使用System.Web.SessionState.HttpSessionState对象,这个对象可在控件上,

作为Page.Session使用,可以存储需要跨用户浏览器会话的数据.

可以在Page.Session中存储敏感的信息,因为这个信息只存在于服务器上.

Session对象为每一个用户会话而创建;当使用Session对象时,没有必要为线程的安全担心.

然而,应注意允许页面开发者对特定的Web应用程序关闭Sesson状态特性.

3。使用System.Web.HttpApplicationState对象,这个对象可在控件上作为

Page.Application使用,可以存储需要整个应用程序的数据.这个对象只存在于服务器上.

Page.Application对象不是线程安全的,因为多个用户可以同时访问页面.

当使用Page.Application对象时,应该为线程的安全性负责.

抱歉!评论已关闭.