1、 视图状态ViewState12.1 控件状态ControlState12.2 隐藏域HiddenField12.3 查询字符串12.4 Cookie12.5 会话状态Session12.6 应用程序状态Application12.7 配置文件属性Profile12.8 思考题12.9视图状态(ViewState)管理就是通过页面中的ViewState对象保持和管理页面交互的数据,同时视图状态管理的方法也是页面保存page对象和各个控件属性值的默认方法。当服务器获取浏览器对页面的请求后,服务器会将ASP.NET页面中page对象和各个控件的当前状态散列为一个Base64编码字符串,并在页中保存
2、为一个或多个隐藏域或多个隐藏域。当将页回发(PostBack)到服务器时,页会在页初始化阶段分析ViewState字符串,并还原那些信息。这个过程不需要额外的程序代码,ASP.NET的运行机制会自动完成,即默认的ViewState管理。ASP.NET程序运行后所生成的HTML文本中产生了一个名为“_VIEWSTATE”的input标签,它是隐藏类型(hidden),它的值是一串编码后的字符串。例子展示如何使用ViewState来保存用户在多次回发访问这个页面时产生的数据。页面中有一个BulletedList控件用来展示多个字符串,而所有的字符串都是由用户通过页面中的TextBox输入并点击按钮
3、添加的。当通过浏览器访问这个页面时,用户输入的字符串会被记录并展示。ViewStateForm.aspx文件的代码如下:ViewStateForm.aspx.cs文件的代码如下:protected void Page_Load(object sender,EventArgs e)if(!IsPostBack)entries=new List();ViewStateentries=entries;private void bindData()BulletedList1.DataSource=ViewStateentries;BulletedList1.DataBind();protected v
4、oid Button1_Click(object sender,EventArgs e)entries=(List)ViewStateentries;entries.Add(TextBox1.Text);ViewStateentries=entries;bindData();使用ViewState可以方便地在一个页面的多次回发中保持状态,但它的使用也有一些限制和需要注意的地方。l 首先,如果需要在多个页上使用状态信息,或者如果需要在对网站的多次独立的访问之间保存信息,必须使用其它方法来维护状态,比如应用程序状态、会话状态或配置文件属性。l 其次,ViewState信息被序列化为Base64编码
5、机制进行编码,这可能会在HTML文件中生成大量数据。将页发送到服务器时,ViewState的内容会作为页回发信息的一部分进行发送。l 第三,ViewState信息是被放在隐藏字段来传递数据的。如果隐藏字段中的数据量过大,则某些代理和防火墙将禁止访问包含这些数据的页。l 第四,如果用户查看网页的HTML源并可以对Base64编码字符串进行解码,进而可以看到ViewState字段中的信息,这可能会产生安全问题。因此,不要在ViewState中存储保密的数据,或者需要加密后保存。除ViewState以外,ASP.NET还支持控件状态(ControlState)。ControlState与ViewSt
6、ate类似,也存储在一个或多个隐藏字段中。页使用ControlState来保留必须在回发之间保留的控件信息,虽然ViewState也可以完成相同的任务,但开发人员可以在页级别关闭ViewState,从而使控件无法正常工作。这时,就需要使用ControlState属性来保持特定控件的属性信息,因为即使将page对象或某个控件的ViewState设置为禁止,ControlState依然可以正常工作。ASP.NET 允许程序将信息存储在HiddenField控件中,后台的代码可以在利用HiddenField控件的Value属性记录一个字符串,此控件将呈现为一个标准的HTML的input元素并且typ
7、e=hidden。HiddenField在浏览器中不以可见的形式呈现,但可以像对待标准控件一样设置其属性。当向服务器提交页时,HiddenField的内容将在HTTP窗体集合中随同其他控件的值一起发送。HiddenField的做法利用了ASP.NET回发机制的特点,即在页面的回发过程中,Form中的所有HTML控件的值,包含被设置为“hidden”类型的控件的值,都会被以POST的方式提交给服务器,这样便可以建立多次回发之间的数据联系。实际上,ViewState的方式就是利用了HiddenField来完成的。与ViewState的问题一样,恶意用户可以很容易地查看和修改HiddenField的
8、内容,因此,不要在HiddenField中存储任何敏感信息或保障应用程序正确运行的信息。查询字符串是在页面URL地址的结尾附加的信息。下面是一个典型的查询字符串示例:http:/ POST命令向服务器提交数据,而查询字符串则采用HTTP GET命令进行提交。Cookie机制允许网站将少量的数据存储在客户端文件系统浏览器会话的内存中,比如某个网站可以把正在访问的用户名保存在Cookie中,下次用户登录时可以自动填入用户名的输入框。Cookie所包含的信息是随着HTML页面一起由服务器发送到客户端的。Cookie的保存期可以是有限时间的,也可以是永久的。例子中,用户通过输入框输入一个新的名字,通过
9、按钮提交后,服务器使用Cookie机制将用户名保存在客户端的Cookie文件中。当用户再次访问这个地址时,页面会先判断Cookie中是否存在保存的用户名,如果存在,就在页面中显示出来。CookieForm.aspx文件中的代码如下:请输入你的新名字,下次我会记得你:CookieForm.aspx.cs文件中的代码如下:protected void Page_Load(object sender,EventArgs e)if(!IsPostBack)if(Request.CookiesuserName!=null)Label1.Text=你是+Request.CookiesuserName.Va
10、lue+吗?欢迎你回来!;else Label1.Text=你是谁啊?我不记得你!;protected void Button1_Click(object sender,EventArgs e)Response.CookiesuserName.Value=TextBox1.Text;Response.CookiesuserName.Expires=DateTime.Now.AddDays(1);在Windows操作系统中使用IE浏览器时,Cookie是以文件的形式保存在系统中。可以通过IE浏览器的“Internet选项”菜单,点击“浏览历史记录”中的“设置”按钮打开“网站数据设置”对话框,可以
11、看到Cookie文件保存的位置。与ViewState相同,ASP.NET允许可以使用会话状态(Session)来维持每个客户端的状态。但与ViewState不同的是,Session可以在不同页面中保存和共享状态信息,而ViewState只能在一个页面的多次回发中共享状态。例如,在购物网站中,我们可以同时打开多个不同的页面选购商品,并分别将它们提交到共同的购物车中。这里的购物车就可以由Session来管理。在ASP.NET程序开发中,可以使用Session对象来保存会话状态。Session对象是HttpSessionState类的一个实例,它采用“键/值对”字典形式的结构来存储会话信息。Sess
12、ionForm.aspx文件的代码如下:SessionForm.aspx.cs文件的代码如下:protected void Page_Load(object sender,EventArgs e)if(!IsPostBack)if(Sessionentries=null)entries=new List();Sessionentries=entries;bindData();private void bindData()BulletedList1.DataSource=Sessionentries;BulletedList1.DataBind();protected void Button1_
13、Click(object sender,EventArgs e)entries=(List)Sessionentries;entries.Add(TextBox1.Text);Sessionentries=entries;bindData();应用程序状态(Application)与会话状态(Session)的使用方法非常相似,但状态信息共享的范围不同。简单地说,如果有不同的用户在使用网站的应用程序,则每个用户都将有一个独立的Session,多个用户之间不会通过Session共享信息,因此可以用Session保存购物车信息。Application则不同,整个Web服务器只有一个Applicat
14、ion实例对象,即所有的用户都可以访问到同样的Application。Global.asax.cs的代码如下:public class Global:System.Web.HttpApplication protected void Application_Start(object sender,EventArgs e)Application.Add(OnlineCount,0);protected void Session_Start(object sender,EventArgs e)Application.Lock();ApplicationOnlineCount=(int)Applic
15、ationOnlineCount+1;Application.UnLock();protected void Session_End(object sender,EventArgs e)Application.Lock();ApplicationOnlineCount=(int)ApplicationOnlineCount-1;Application.UnLock();为了提升用户体验,方便用户使用,很多网站系统都会记录每个用户的多种配置信息,比如允许用户选择信息分类、设置操作方式,甚至有些网站允许用户自己设置的网站颜色、布局和风格等,用户再次登录这个网站后,网站将会呈现出上次设置后的样式。要
16、想完成上述功能,需要在服务器上记录用户所设置的Web 应用程序的个性化数据。显然,这些数据不能像Session一样只保存在内存中,而Profile(配置文件)就可以支持用户将各种配置长久地保存在服务器的文件或数据库中。Profile功能将信息与单个用户关联,并采用持久性的方式存储这些信息。Profile功能提供了一个通用存储系统,使开发者能够定义和维护几乎任何类型的数据,同时仍可用类型安全的方式使用数据。开发者可以使用SqlProfileProvider类将Profile数据存储到数据库中。开发者还可以以自定义格式将Profile数据存储到XML文件或Web服务等自定义存储方式中。因为Profile数据没有存储到应用程序内存中,所以这些数据在Web服务器重启后仍能得到保留。此外,Profile还可以实现跨进程的数据共享。(1)ASP.NET提供的基于客户端的状态管理方式包括哪些方法?(2)ASP.NET提供的基于服务器的状态管理方式包括哪些方法?(3)简述视图状态(ViewState)的工作机理。(4)简述Cookie的工作机理。(5)简述会话状态(Session)和应用程序状态(Application)的异同。
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。