ASP.NET的系统对象和状态管理,aspx文件怎么打开

文件 2
3第章ASP.NET的系统对象和状态管理 ASP.NET改变了传统Web开发的很多习惯,但是读者在进行开发的时候还是会使用到请求对象、会话对象和响应对象等。
ASP.NET提供了一系列的对象来操作ASP.NET网站的请求、状态和配置,本章将详细介绍常见的系统对象。
通过本章的学习,读者可以了解Request、Response、Session、Application和Cookie等对象的使用方法,并且能够使用这些对象熟练地处理ASP.NET网站的请求和响应等。
本章学习要点:了解ASP.NET的运行机制。
掌握Request对象和Response对象的常用属性和方法。
掌握Page对象的常用属性。
掌握Cookie、Session和Application的使用方法。
熟悉ViewState对象的使用方法。
掌握Cookie、Session、Application和ViewState的不同点。
熟悉Server对象的常用属性和方法。
掌握页面传值的几种方法。
掌握页面跳转的常用方法。
3.1ASP.NET运行机制 ASP.NET文件编译后才会执行,在介绍ASP.NET的对象之前先了解下ASP.NET的运行机制,如图3-1所示。
图3-1ASP.NET运行机制 ASP.NET的系统对象和状态管理3第章 在图3-1中,仅仅展示了Web服务器将请求提交给ASP.NET处理程序的过程。
ASP.NET 页面有.aspx文件和.cs文件构成,两者是局部类的关系。
用户访问时只能访问.aspx文件(Web 服务器会屏蔽掉不合适的后缀名请求),此时ASP.NET引擎会编译.aspx文件和.cs文件并 合并成页面类。
用户请求经处理后,返回处理结果,这是第一次的请求过程。
当第二次请 求该页面时,由于页面类已经存在于内存中,所以省去了编译的环节只剩下执行和输出了。
63 .aspx
页面在第一次执行时会有一个编译的过程,页面在执行之前需要将 注意 aspx页及其后台代码编译成页面类,然后再执行页面中的处理方法。
当第二次执行时,页面类已经存在不再执行编译过程,所以执行时间比第一次短。
3.2系统对象 ASP.NET页面中包含一系列的对象,这些对象在页面中可以直接使用,可以将它们称为系统对象。
表3-1列出了ASP.NET中常见的系统对象。
对象名PageRequest Response ServerApplicationSessionCookie 表3-1ASP.NET常见的系统对象 说明指向页面自身的方式,在整个页面的执行期内,都可以使用该对象它封装了由Web浏览器或其他客户端生成的HTTP请求的细节,提供从浏览器读取信息或读取客户端信息等功能,用于页面请求期它封装了返回到HTTP客户端的输出信息,提供向浏览器输出信息或者发送指令,用于页面执行期它提供了服务器端的一些属性和方法,如文件的绝对路径等为所有用户提供共享信息,作用于整个应用程序运行期为某个用户提供共享信息,作用于会话期保存在客户端为单个用户提供信息 本节将详细介绍ASP.NET的系统对象,包括它们的概念、属性和使用方法等内容。
3.2.1Request对象 Request对象用来获取客户端在请求一个页面或传送一个Form时提供的所有信息。
它包括用户的HTTP变量、能够识别的浏览器、存储客户端的Cookie信息和请求地址等。
Request对象是System.Web.HttpRequest类的对象,它的常用属性如表3-2所示。
属性名QueryStringFormServerVarible 表3-2Request对象的常用属性 说明获取HTTP查询字符串变量集合,主要用于收集HTTP协议中Get请求发送的数据获取窗体或页面变量的集合,用于收集Post方法发送的请求数据环境变量集合包含了服务器和客户端的系统信息 ASP.NET编程从基础到应用 续表 属性名 说明 Params 它是QueryString、Form和ServerVarible这3种方式的集合,不区分是由哪种方式传递的参数 Url 获取有关当前请求的URL信息 UserHostAddress获取远程客户端的IP主机地址 64UserHostName获取远程客户端的DNS名称 IsLocal 获取一个值,该值指示该请求是否来自本地计算机 Browser 获取或者设置有关正在请求的客户端的浏览器功能信息 除了常用属性外,Request对象也包含多个方法。
例如,BinaryRead()方法执行对当前输入流进行指定字节数的二进制读取;SaveAs()方法将HTTP请求保存到磁盘。
下面通过一个具体案例演示如何使用Request对象。
【实践案例3-1】 在新建项目中添加一个页面,然后向该页面中添加4个Label控件分别表示主机名称、IP地址、请求页面和头部信息。
页面部分的具体代码如下。
当前的主机名称:
当前的IP地址:
当前的请求页面:
-------------------------------------------------------------
遍历头部信息: 向该页面的Load事件中添加如下的代码。
protectedvoidPage_Load(objectsender,EventArgse) { lblhostname.Text=Request.UserHostName; //获得客户端浏览器所在主机的DNS名称 lblipaddress.Text=Request.UserHostAddress;//获得IP地址 lblhostpage.Text=Request.Url.ToString(); //获得URL信息 intcount=Request.Headers.Keys.Count; //浏览器头部信息的个数 for(inti=0;i"; } } 在上述代码中,分别调用Request对象的UserHostName属性、UserHostAddress属性和Url属性获得客户端浏览器所在主机的DNS名称、IP地址和URL信息。
然后,使用for ASP.NET的系统对象和状态管理3第章 语句遍历Request对象的Header属性的Keys集合,取出键后获得相应键的值后向页面展示所有的值。
运行本案例代码最终效果如图3-2和图3-3所示。
65 图3-2Chrome浏览器的显示效果 图3-3Filefox浏览器的显示效果 提示 因为浏览器不同,所以同样的访问其封装的数据也不尽相同。
从返回信息中可以知道浏览器能接收的文档类型、字符集、编码、语言、请求主机地址和浏览器等版本的详细信息。
3.2.2Response对象 Response对象用于输出数据到客户端,包括向浏览器输出数据、重定向浏览器到另一个URL或向浏览器输出Cookie文件等。
Response对象是System.Web.HttpResponse类的对象,它可以在页面的任何地方使用。
该对象的常用方法如表3-3所示。
方法名 Write()WriteFile()Clear()Close()End()Redirect() 表3-3Response对象的常用方法 说明输出指定的内容读取文件并写入客户端输出流清除缓存区流中的所有输出内容关闭到客户端的套接字连接Web服务器停止当前的程序并返回结果将一个页面重新定向到另一个页面,地址栏中地址会发生改变 除了常用的方法外,Response对象也包含多个属性,如表3-4所示。
属性名CharsetContentTypeBufferOutput 表3-4Response对象的常用属性 说明获取或设置响应数据流的字符集获取或设置输出流的HTTPMIME类型,默认值是text/html获取或设置一个值,该值指示是否缓冲输出并在处理完整个页面之后发送 下面主要通过一个案例演示如何使用Response对象的方法和属性。
【实践案例3-2】 在后台程序中经常需要向页面输出一些文本信息,如弹出对话框提示、单击某个按钮输出某句话、显示友好提示以及跳转页面等。
本案例实现后台用户登录的功能,页面设计 ASP.NET编程从基础到应用效果如图3-4所示,用户可以根据效果图添加相应的控件进行设置。
66 图3-4案例3-2的设计效果 用户单击【关闭】按钮时关闭当前页面,实现代码非常简单,这里不再显示。
单击【登录】按钮时根据用户名和密码判断是否登录成功,如果登录成功跳转到当前页面,否则弹出错误信息提示。
【登录】按钮的具体代码如下。
protectedvoidibtLogin_Click(objectsender,ImageClickEventArgse) { stringusername=txtnames.Text; //获得输入的用户名 stringuserpass=txtpasss.Text; //获得输入的密码 if(username=="admin"&&userpass=="admin")//判断用户名和密码 {Response.Redirect("ResponseForm.aspx"); //跳转页面 } else {Response.Write("");//错误提示 } } 在上述代码中,分别声明两个变量username和userpass保存输入的用户名和密码。
如果用户名和密码都等于admin调用Response对象的Redirect()方法重新跳转到当前页面;否则使用Response对象的Write()方法输出弹出的脚本提示。
运行本案例的代码,向输入框中输入用户名和密码进行测试。
单击【登录】按钮提示出错的效果如图3-5所示。
3.2.3Page对象 每一个ASP.NET的页面都会对应一个页面类,Page对象就是页面类的实例。
它是由 ASP.NET的系统对象和状态管理3第章 System.Web.UI命名空间中的Page类来实现的,作为公有属性被声明在System.Web.UI.Control类中,该对象又被System.Web.UI.TemplateControl类继承。
Page类又继承自TemplateControl类,所以页面中可以直接使用Page对象。
该对象中包含多个属性,如Request属性可以获得请求的HttpRequest对象、Session属性可以获取当前的Session对象以及IsPostBack属性可以判断是否为首次加载等。
其常用属性如表3-5所示。
67 图3-5案例3-2登录错误的信息提示 属性名IsPostBack IsValid IsCrossPagePostBackApplicationRequestResponseSessionServer 表3-5Page对象的常用属性 说明获取一个值,该值表示该页是否正在为响应客户端回发而加载。
如果为true表示回传,否则为首次加载获取一个值,该值表示页面是否通过验证,一般在包含有验证服务器控件的页面中使用获取一个值,该值指示跨页回发中是否指示该页为当前Web请求获得Application对象获取请求页的HttpRequest对象获取与Page关联的HttpResponse对象获取ASP.NET提供的当前Session对象获取Server对象,它是HttpServerUtility类的实例 Page对象的常用方法如表3-6所示。
方法名DataBind()RegisterClientScriptBlock()FindControl()RegisterStartupScriptValidate() 表3-6Page对象的常用方法 说明将数据源绑定到被调用的服务器控件及其所有子控件向页面发出客户端脚本块在页命名容器中搜索带指定标识符的服务器控件在页响应中发送客户端脚本块指示指定验证组中的验证控件指派给它们的信息 除了常用的属性和方法外,Page对象也包含多个内置事件。
其常用事件如表3-7所示。
ASP.NET编程从基础到应用 表3-7Page对象的常用事件 事件名 说明 PreInit 在页面初始化开始时发生 InitComplete 在页面初始化完成时发生 PreLoad 在页面内容加载之前发生 LoadComplete 在页面生命周期加载阶段结束时发生 68
PreRenderComplete在呈现页面内容之前发生 SaveStateComplete在页面完成对页和页上控件的所有视图状态和控件状态信息的保存后发生 下面使用Page对象的属性和方法重新更改实践案例3-
2。
实现的主要步骤如下。

(1)向页面设计中添加服务器控件,其登录部分的设计效果如图3-6所示。
图3-6登录设计效果 在图3-6中设置【登录】按钮的PostBackUrl属性值,将它的值指向ess.aspx页面。
该属性表示单击按钮时所发送的URL地址,此属性可以实现跨页数据传递的功能。

(2)页面首次加载时为用户名和身份设置内容,Load事件的具体代码如下。
protectedvoidPage_Load(objectsender,EventArgse) {if(!
Page.IsPostBack) //如果为首次加载 { txtnames.Text="p"; //设置用户名的默认值 ddlrole.Items.Add("超级管理员");//向DropDownList控件中添加数据 ddlrole.Items.Add("普通管理员"); ddlrole.Items.Add("一般用户"); } } 在上述代码中,使用Page对象的IsPostBack属性对页面进行判断。
该属性返回一个布尔值,如果为true表示页面为回传,否则就是首次加载。

(3)向ess.aspx页面中添加两个Label控件,然后为该页面的Load事件添加如下的代码。
ASP.NET的系统对象和状态管理3第章 if(Page.PreviousPage!
=null) //获取向当前页传输控件的页是否为空 {if(PreviousPage.IsCrossPagePostBack)//判断是否使用跨页提交 { stringname=((TextBox)this.PreviousPage.FindControl ("txtnames")).Text; //获取用户名 69 stringpass=((TextBox)this.PreviousPage.FindControl ("txtpasss")).Text; //获取父页面的密码 stringrole=((DropDownList)this.PreviousPage.FindControl ("ddlrole")).SelectedValue; //获取身份 if(name!
="admin"||pass!
="admin")//判断用户名和密码 Page.ClientScript.RegisterStartupScript(GetType(),"",""); else {lblname.Text=name+",欢迎您的登录!您现在的身份是:"; lblrole.Text=role; } } } 在上述代码中,首先使用Page对象的PreviousPage属性判断向当前页传输的源页面是否为空;接着使用IsCrossPagePostBack属性判断是否使用跨页提交;然后使用源页面的FindControl()方法通过控件ID找到相应控件的对象。
如果用户登录失败调用Page对象的ClientScript属性获取当前客户端脚本管理对象的实例,紧接着使用RegisterStartupScript()方法向当前页面注册输出一段JavaScript代码。

(4)重新运行本案例,登录页面的效果如图3-7所示。
图3-7案例3-2更改后登录页面的显示效果 ASP.NET编程从基础到应用 在图3-7中分别输入用户名和密码进行测试,单击【登录】按钮提交输入信息。
ess.aspx页面输出的内容如下。
admin,欢迎您的登录!您现在的身份是:普通管理员 在本案例中,源页面表示登录页面,目标页面表示ess.aspx页面。
注意70 只有源页面和目标页面都属于同一个应用程序时,目标页面才可以访问该 页面上控件的内容。
另外,PostBackUrl属性的控件只有Button、LinkButton 和ImageButton,所示要使用PostBackUrl属性实现跨页数据传递,必须使 用这三种控件。
3.3状态保持 对网上购物的用户来说登录成功后需要保存用户的信息,如本次登录时间、登录的用户名和密码等。
ASP.NET中包含4个重要的状态保持对象:Cookie、Session、Application和ViewState。
本节详细介绍这些对象的相关知识,包括它们的概念、属性、方法以及如何使用等内容。
3.3.1Cookie对象 Cookie就是Web服务器保存在用户硬盘上的一段文本。
它允许一个Web站点在用户的电脑上保存信息并且随后再取回它,信息的片断以键/值对的形式存储。
Cookie是保存在客户机硬盘上的一个文本文件,在ASP.NET中对应HttpCookie类。
Cookie对象为Web应用程序保存用户的相关信息提供了一种有效的方法,它可以存储有关特定客户端、会话或应用程序的信息。
每一个Cookie对象都属于集合Cookies,所以可以使用索引器的方式获得Cookie。
Cookie对象中包含多个属性和方法,其常用属性如表3-8所示。
属性名NameValueValuesPathExpires 表3-8Cookie对象的常用属性 说明获取或设置Cookie的名称获取或设置单个Cookie值获取单个Cookie对象所包含的键值对的集合获取或设置与当前Cookie一起传输的虚拟路径获取或设置Cookie的过期日期和时间 在ASP.NET中Cookie有两种类型:会话Cookie(SessionCookie)和持久性Cookie。
前者是临时性的,一旦会话状态结束它将不复存在;后者则具有确定的过期日期,在过期之前Cookie在用户的计算机上以文本文件的形式存储。
写入Cookie对象时需要使用Response对象,两种创建方法如下所示: ASP.NET的系统对象和状态管理3第章 Response.Cookies[Cookie的名称].Value=变量值; //第一种创建方法 HttpCookiehcCookie=newHttpCookie("Cookie的名称","值");//第二种创建方法 Response.Cookies.Add(hcCookie); 读取Cookie对象时需要使用Request对象,其语法形式如下: string变量名=Request.Cookies[Cookie的名称].Value;71 提示 由于Cookie存储在客户端,所以它受到客户端浏览器的限制,一般不使用它进行客户登录的判断,并且最好不要使用它保存敏感信息。
【实践案例3-3】一些大中型企业经常会在网站的首页设立一项在线投票的功能,以便能够及时地了解 企业的产品或服务在市民心中的地位。
为了在投票系统中确保准确率,防止重复投票是一项必不可少的功能。
本案例将介绍如何使用Cookie对象在投票系统中防止重复投票。
实现的具体步骤如下。

(1)在新建的网站项目中添加一个页面,该页面的设计效果如图3-8所示。
用户可以根据效果图添加相应的内容进行布局。
图3-8案例3-3效果图
(2)单击【提交】按钮实现防止重复投票的功能,为该按钮的Click事件添加如下代码。
protectedvoidbtnSubmit_Click(objectsender,EventArgse) { stringuserip=Request.UserHostAddress.ToString(); //获取用户的主机IP地址 HttpCookiehcCookie=Request.Cookies["UserIP"];//读取Cookie对象 if(hcCookie==null) //判断指定的ID是否已经投过票了,如果没有投票 ASP.NET编程从基础到应用 { HttpCookienewCookie=newHttpCookie("UserIP");//写入Cookie newCookie.Expires=DateTime.MaxValue; //设置失效日期 newCookie.Values.Add("AddressIP",userip); Response.AppendCookie(newCookie); Page.ClientScript.RegisterStartupScript(GetType(),
"",""); return; }else //如果已经投过了,则弹出提示对话框 { stringoldip=hcCookie.Values[0]; if(userip.Trim()==oldip.Trim()) { Page.ClientScript.RegisterStartupScript(GetType(),"",""); return; } else { HttpCookienewCookie=newHttpCookie("UserIP");//重新写入Cookie newCookie.Expires=DateTime.MaxValue; //设置失效日期 newCookie.Values.Add("AddressIP",userip); Response.AppendCookie(newCookie); Page.ClientScript.RegisterStartupScript(GetType(),
"",""); return; } } } 在上述代码中,Request对象的UserHostAddress属性获取用户主机的IP地址,接着使用hcCookie对象保存Cookies属性读取的Cookie对象。
根据hcCookie对象的值进行判断,如果值为空则使用Response对象写入Cookie,然后调用Page对象输出客户端的脚本;否则判断hcCookie对象中存储的值和主机IP地址是否相等,如果相等弹出提示,如果不等将值重新写入Cookie对象。

(3)运行本案例,单击【提交】按钮进行测试,最终效果如图3-9所示。
3.3.2Session对象 尽管Cookie对象可以存储一些状态信息,但是由于Cookie对象本身存在着一些限制,如安全性不高、自身内存小并且Cookie可以被禁用等,故为了解决Cookie的问题,ASP.NET提供了另外一种对象:Session。
ASP.NET的系统对象和状态管理3第章 73 图3-9案例3-3运行效果 浏览器请求Web服务器,Web服务器在需要保存用户状态的时候会为浏览器创建一个会话状态保存对象Session。
该对象有一个唯一的标识列SessionID,使用Session.SessionID属性客户获得SessionID。
在对浏览器请求做出响应时会把SessionID一并发送给浏览器,下一次请求访问时将SessionID提交给服务器,服务器根据SessionID在服务器上查找相对应的会话状态持续使用。
Session对象默认保存在服务器的内存中,它可以像数据字典一样存储和读取数据,其语法形式如下。
Session["keyname"]=value;或者Session[0]=value;value=Session["keyname"];或者value=Session[0]; //存储Session//写入Session Session对象是System.Web.SessionState.HttpSessionState类的实例,它的常用属性和方法如表3-9和表3-10所示。
属性名ContentsCookieModeCountKeysModeSessionIDTimeout 表3-9Session对象的常用属性 说明获取对当前会话状态对象的引用获取一个值,该值指示是否为Cookie会话配置应用程序获取会话状态集合中的项数获取存储在会话状态集合中所有值的键的集合获取当前会话状态模式获取会话的惟一标识符获取并设置在会话状态提供程序终止会话之前各请求所允许的时间 下面主要通过一个案例演示Session对象的使用方法。
ASP.NET编程从基础到应用 表3-10Session对象的常用方法 方法名 说明 Abandon()取消当前会话 Add() 向会话状态集合添加一个新项 Clear() 清除会话状态集合中所有的键和值 Remove() 删除会话状态集合中的项 74RemoveAll()从会话状态集合中移除所有的键和值 RemoveAt()删除会话状态中指定索引的项 【实践案例3-4】一般的管理系统登录界面需要将用户登录的用户信息进行保存,以便在登录成功后的 主界面中显示用户的个人信息,如用户名、登录账号和角色等。
实现的主要步骤如下。

(1)在新建的项目中添加名称为User的实体类表示用户登录信息。
该类主要包括用户 ID、用户名、密码和角色等内容,主要代码如下。
publicclassUser {publicUser(){} //无参构造函数 publicUser(intid,stringusername,stringuserpass,stringrole)//有参构造函数 { this.userid=id; this.userName=username; this.userRole=role; }privateintuserid;privatestringuserName;privatestringuserPass;privatestringuserRole; //用户ID//用户名//密码//用户角色 publicstringUserRole { get{returnuserRole;} set{userRole=value;} }/*省略对其他字段属性的封装*/ }
(2)重新添加登录页面,页面效果如图3-6所示。
单击【登录】按钮时判断输入的用户名和密码是否正确,具体代码如下。
protectedvoidibtLogin_Click(objectsender,ImageClickEventArgse) {stringusername=txtnames.Text;stringuserpass=txtpasss.Text; //获得用户名//获得用户密码 if(username=="foverlove"&&userpass=="foverlove") ASP.NET的系统对象和状态管理3第章 //判断用户名和密码 { Useruser=newUser(1,username,userpass,ddlrole.SelectedValue); //获取用户角色 Session["User"]=user; //使用Session保存用户信息 Response.Redirect("/ThreeObject/Session/web/Cookie_ SessionForm.aspx"); //跳转页面 75 } else Page.ClientScript.RegisterStartupScript(GetType(),"",""); } 在上述代码中,首先判断用户输入的用户名和密码是否成功。
如果登录成功调用User类的构造函数创建实例对象user,然后调用Session对象保存用户信息后跳转页面,否则弹出错误提示。

(3)在登录成功后的主界面中显示用户名和角色,运行的最终效果如图3-10所示。
图3-10案例3-4登录成功后的主界面
(4)为主界面顶部区域的Load事件添加如下的代码。
Useruser=Session["User"]asUser;if(user!
=null){ lblname.Text=user.UserName;lblrole.Text=user.UserRole;} 在上述代码中,直接使用Session对象取出User的值,取出的值为Object类型,所以需要进行强制类型转换。
然后判断user对象的值是否为空,如果不为空将用户名和角色在主界面中显示出来。
3.3.3Application对象和Global.asax文件 Application对象是一个应用程序级的对象,它用于在所有用户间共享信息,并且可以 ASP.NET编程从基础到应用 在Web应用程序运行期间持久的保持数据。
由于Application对象在整个应用程序生存周 期中都有效,所以可以在不同的页面访问该对象的值。
Application对象是System.Web.HttpApplicationState类的实例,该对象常用的属性有
3 个,具体说明如下所示。
“Allkeys获取HttpApplicationState集合中的访问键。
76 “Count获取HttpApplicationState集合中的对象数。
“Item允许使用索引或Application变量名称传回内容值。
除了属性外,Application对象中也包含多个方法,其具体说明如表3-11所示。
方法 Add()Remove()RemoveAt()RemoveAll()Clear()GetKey()Set()Lock()UnLock() 表3-11Application对象的常用方法 说明将新的对象添加到HttpApplicationState集合中从HttpApplicationState集合中移除命名对象按索引从集合中移除单个HttpApplicationState对象从HttpApplicationState集合中移除所有对象从HttpApplicationState集合中清除所有对象通过索引获取HttpApplicationState对象名更新HttpApplicationState集合中的对象值锁定全部的Application变量解除锁定的Application变量 Application对象可以用来统计访问人数、历史访问次数和用户在线时长等问题。
它通常和Global.asax文件一起使用。
Global.asax文件是一个全局应用程序类,它主要用户监控应用程序、会话和请求等对象的运行状态。
该文件存储存在应用程序的根目录下,为System.Web.HttpApplication类的子类。
它包含一系列的方法,具体说明如表3-12所示。
表3-12Global.asax文件的常用方法 方法 说明 Application_AuthenticateRequest()Application_BeginRequest() 认证请求时候触发该方法开始一个新的请求时触发事件,每次Web服务器被访问都执行该方法 Application_End()Application_Error()Application_Start()Session_Start()Session_End() 应用程序结束事件,在这里可以做一些停止应用程序的善后工作应用程序出现错误时触发,可以做一些错误处理操作应用程序启动事件,可以在这里做一些全局对象初始化操作创建一个会话时执行该方法,在Session对象创建时触发结束一个会话时执行该方法,在Session对象销毁时触发 下面主要通过案例演示如何将Application对象和Global.asax文件结合起来查看文章的历史访问数量。
【实践案例3-5】大多数的网站都具有统计网站访问量的功能,通过网站的访问量可以清楚地反映网站 的人气指数。
本案例利用Application对象和Global.asax文件来实现文章访问数量统计的功能。
实现的主要步骤如下。
ASP.NET的系统对象和状态管理3第章
(1)在网站项目中添加新的页面,该页面的设计效果如图3-11所示。
用户可以根据效果图添加相应的内容和控件。
77 图3-11案例3-5设计效果图
(2)打开Global.asax文件,当应用程序启动时初始化文章访问数量的全局参数。
在Application_Start()方法中添加如下代码。
voidApplication_Start(objectsender,EventArgse){ if(Application["totalcount"]==null)Application["totalcount"]=0; }
(3)当会话启动时需要获取Application对象中的数据信息并且使访问数量加
1,其具体代码如下。
voidSession_Start(objectsender,EventArgse) { Application.Lock(); //锁定Application对象的访问 intcount=(int)Application["totalcount"];//获取访问数量 count++; //将访问数量加
1 Application["totalcount"]=count;//重新为Application对象赋值 Application.UnLock(); //解除对Application对象的访问 }
(4)为该页面的Load事件添加如下的代码。
protectedvoidPage_Load(objectsender,EventArgse) ASP.NET编程从基础到应用 {intcount=(int)Application["totalcount"];lblnumber.Text=count.ToString(); } 在上述代码中,首先从Application对象中取出访问数量的值,然后将取出的值保存到78lblnumber控件中。

(5)运行本案例,最终显示效果如图3-12所示。
图3-12案例3-5运行效果 3.3.4ViewState对象 ViewState对象是一种非常特殊的状态保持对象,它由Web页面提供并且只保存当前页的状态信息。
所有页面控件的状态都被以某种形式进行编码,然后保存到ViewState对象中。
ViewState对象可以获取类型为StateBag的示例,该类提供了多种属性和方法,具体说明如表3-13和表3-14所示。
属性名CountKeysValues 表3-13StateBag类的常用属性 说明获取StateBag对象中的StateItem对象的数量获取表示StateBag对象中的项的集合获取表示StateBag对象中的视图状态值的集合 ASP.NET的系统对象和状态管理3第章 表3-14StateBag类的常用方法 方法名 说明 Add() 将新的StateItem对象添加到视图状态中 Clear() 清除视图状态中的所有项 SetItemDirty() 设置指定项的Dirty属性的值 IsItemDirty() 判断指定项是否被修改 79 ViewState对象的写入和读取非常简单,其语法形式如下。
ViewState["keyname"]=value;变量名=ViewState["keyname"]; //写入ViewState对象//读取ViewState对象 下面主要通过案例演示如何使用ViewState对象。
【实践案例3-6】 大多数的企业网站都会有留言板,方便浏览人员提交个人意见或提问信息等。
本案例使用模拟实现添加企业网站的留言功能。
使用ViewState对象存储公司的负责人电话,提交成功时将电话和输入的留言信息输出。
实现的主要步骤如下。

(1)添加名称为ViewStateExample.aspx的页面,该页面的设计效果如图3-13所示。
用户可以根据效果图添加相应的内容。
图3-13案例3-6的设计效果
(2)为该页面的Load事件添加代码,页面加载时隐藏服务器控件Label的内容,并且使用ViewState对象保存负责人电话信息。
其具体代码如下。
ASP.NET编程从基础到应用 protectedvoidPage_Load(objectsender,EventArgse) { showid.Visible=false;ViewState["Phone"]="037169255672"; //存储电话号码 } 80
(3)单击【提交】按钮时显示留言人、留言信息和ViewState对象存储的联系电话。
具体实现代码如下所示。
protectedvoidbtnSubmit_Click(objectsender,EventArgse) { stringname=txtmessagename.Text; //获取留言人名称 stringconent=txtmessagecontent.Text; //获取留言内容 showid.Visible=true; //显示控件内容 lblinfo.Text="
留言人:"+name+"

留言内容:"+conent +"

已经提交成功,公司负责人电话:"+ViewState["Phone"].ToString(); }
(4)运行本案例,输入内容后单击【提交】按钮进行测试,最终效果如图3-14所示。
图3-14案例3-6运行效果 3.3.5状态对象的异同点 Cookie、Session、Application和ViewState这4个对象都是状态保持对象,都可以用来保存数据。
但是,它们之间也有不同,如存储方式、内存空间大小和安全性能等。
表3-15列出了这些对象的主要不同。
ASP.NET的系统对象和状态管理3第章 表3-154个状态对象的不同点 Cookie Session Application ViewState 保存位置客户端 服务器端 服务器端 客户端 作用域和保根据需要设定存时间 用户活动时间(一般为20整个应用程序的生一个Web页面的 分钟) 命期 生命期 应用范围单个用户 单个用户 整个应用程序/所单个用户 有用户 81 信息量大小 小量、简单的安全但效率较低,保存小 数据 量、简单的数据 任意大小的数据 小量、简单的数据 3.4Server对象 在处理用户请求的时候需要获取一些服务器的信息,如获取应用程序的物理路径、计算机名称或者对字符串进行编码解码操作等。
ASP.NET提供了一个Server对象,它封装了一些Web服务器相关的常用方法,可以实现对用户请求的辅助性操作。
Server对象是System.Web.HttpServerUtility类的对象,可以在页面的任何地方使用该对象。
Server对象中包含多个属性和方法,具体说明如表3-16和表3-17所示。
属性名MachineNameScriptTimeout 表3-16Server对象的常用属性说明获取服务器的计算机名称获取和设置请求的超时值(以秒计) 方法名HtmlEncode()HtmlDecode()MapPath()Transfer() Execute()UrlEncode()UrlDecode() 表3-17Server对象的常用方法 说明该方法带有一个字符串参数,可以将其编码,使其在浏览器中正常显示对已经编码的字符串进行解码,并返回已经解码的字符串返回与Web服务器上的指定虚拟路径相对应的物理文件路径对于当前的请求,终止当前页的执行,并使用指定页的URL路径来开始执行一个新页在当前请求的上下文中执行指定虚拟路径的处理程序对字符串进行URL编码并返回已编码的字符串对字符串进行URL解码并返回已解码的字符串 如果用户想要获得某个页面的物理路径,可以使用MapPath()方法。
在该方法中传入一个参数,如果将null作为参数则返回应用程序所在的目录的物理路径。
如返回根目录下Default.aspx的路径,具体实现如下。
Server.MapPath("~/Default.aspx"); 试一试 Server对象的Transfer()方法可以跳转页面,它的效果和Response.Redirect()、按钮的PostBackUrl属性以及Response.Write("JavaScript")代码实现的效果一样。
读者可以分别进行尝试,观察它们的异同点。
ASP.NET编程从基础到应用 【实践案例3-7】 在许多网站页面中用户会经常将一些中文文字作为参数值提交给Web服务器,服务器 会经常把URL上的文本进行编码,如地址栏中经常会出现类似于“%e7%be%8e”这样的 乱码数据。
本案例实现网站根据关键字查找的功能,在地址栏中对输入的内容进行编码, 在服务器解析的时候进行解码显示输入的文字。
实现的具体步骤如下。
82
(1)在网站项目中添加页面
ServerExample.aspx,该页面的设计效果如图3-15所示。
图3-15案例3-7的设计效果
(2)为【搜索】按钮的Click事件添加如下的代码。
protectedvoidbtnSearch_Click(objectsender,EventArgse) {stringsearch=txtsearch.Text;search=Server.UrlEncode(search); //输入的关键字//进行编码 Response.Redirect("/ThreeObject/Server/ServerExample.aspx?
key="+ search); //跳转页面 } 在上述代码中,首先使用Server对象的UrlEncode()方法对输入的关键字进行编码,然后使用Response对象的Redirect()方法跳转页面。

(3)在搜索关键字的前面添加一个服务器控件Label,用于显示从URL中接收到的值。

(4)在页面加载时获取URL的值并进行解码操作。
其具体代码如下。
protectedvoidPage_Load(objectsender,EventArgse) ASP.NET的系统对象和状态管理3第章 { stringsearch=Request.QueryString["key"];//获取传入的URL值 search=Server.UrlDecode(search); //进行解码 if(!
string.IsNullOrEmpty(search)) //判断内容是否为空 lblsearch.Text="您要查询的关键字:"+search; }83
(5)运行本案例访问ServerExample.aspx页面,在文本框中输入内容后单击【搜索】 按钮进行测试,最终效果如图3-16所示。
图3-16案例3-7运行效果 3.5项目案例:实现简单的聊天系统 前几节已经详细介绍过如何使用ASP.NET中的系统对象,包括它们的概念、属性、方法和事件等。
本章将前几节的内容结合起来实现一个简单的聊天系统。
【案例分析】经常上网聊天的用户对聊天室一定不会陌生,它是用于交友、沟通和技术交流的桥梁。
本节主要将Application对象和Session对象结合起来实现一个简单的聊天信息功能。
在本案例中,可以查看当前的在线用户和所有的聊天信息。
实现的具体步骤如下。

(1)添加一个新的Web网站项目,在该项目中添加名称为Login.aspx的用户登录页面。
该页面包括登录昵称和按钮,具体效果不再显示。

(2)向项目中添加名称为Message.aspx的页面表示聊天记录,该页面的设计效果如图3-17所示。
用户可以根据效果图添加相应的内容和控件。

(3)在应用程序启动时需要对用户列表、在线人数和聊天记录等数据进行初始化操作,Global.asax文件中Application_Start()方法的代码如下。
ASP.NET编程从基础到应用 84 图3-17项目案例设计效果 voidApplication_Start(objectsender,EventArgse) { stringuserlist="";Application["user"]=userlist;Application["usernum"]=0;stringchatlist=""; //建立用户列表//当前在线人数//聊天记录 Application["chatlist"]=chatlist;Application["current"]=0; //当前聊天记录数 }
(4)当会话启动和销毁时会触发Session_Start()方法和Session_End()方法,分别对在线人数进行操作。
Global.asax文件的具体代码如下。
voidSession_Start(objectsender,EventArgse)//会话开始时 {Session.Timeout=2;Application.Lock(); //设置会话失效时间为2分钟//锁定Application对象 inttotalusernum=int.Parse(Application["usernum"].ToString()); //获取在线当前人数 Application["usernum"]=totalusernum+1;//将当前在线人数加
1 Application.UnLock(); //解除对Application对象的锁定 }voidSession_End(objectsender,EventArgse) //会话关闭时 ASP.NET的系统对象和状态管理3第章 {Application.Lock(); //锁定Application对象 inttotalusernum=int.Parse(Application["usernum"].ToString()); //获取在线当前人数 Application["usernum"]=totalusernum-1; //将当前在线人数减
1 Application.UnLock(); //解除对Application对象的锁定 } 85
(5)为Login.aspx页面的【进入】按钮添加如下的代码。
protectedvoidbtnin_Click(objectsender,EventArgse) {stringnickname=txtname.Text;Session["username"]=nickname;if(Application["user"]==null) //昵称//保存用户信息//判断在线用户是否为空 Application["user"]=nickname; else Application["user"]=Application["user"]+","+nickname; Response.Redirect("Message.aspx"); //跳转到聊天页面 } 在上述代码中,使用Session对象保存用户输入的昵称,然后将昵称在线的所有用户存储到Application对象中。
登录成功后使用Response对象的Redirect()方法跳转到聊天页面。

(6)聊天页面加载时会获取用户登录的昵称和当前的在线人数。
Load事件的主要代码如下。
protectedvoidPage_Load(objectsender,EventArgse) {if(Session["username"]!
=null) //判断是否登录 {stringname=Session["username"].ToString();//获取用户登录信息 olduser.Text=name;lblnum.Text=Application["usernum"].ToString();//获取当前登录人数 if(!
Page.IsPostBack) LoadUserName(); LoadInfo(); } else Response.Redirect("Login.aspx"); }
publicvoidLoadUserName() //加载在线用户 {lblist.Items.Clear();ddllist.Items.Clear(); //清除ListBox控件中的内容//清除DropDownList控件的内容 ASP.NET编程从基础到应用 stringuserlist=Application["user"].ToString(); //获取在线用户 string[]userll=userlist.TrimStart(',').TrimEnd(',').Split(',');foreach(stringstrinuserll)//向ListBox控件遍历加载在线用户 lblist.Items.Add(str); ddllist.DataSource=userll; ddllist.DataBind(); 86 } publicvoidLoadInfo() //加载所有的聊天记录 {txtcontent.Text=""; //清空聊天内容 intintcurrent=int.Parse(Application["current"].ToString());//加载聊天记录总数 Application.Lock(); stringstrchat=Application["chatlist"].ToString();//获取所有聊天内容 string[]strchats=strchat.Split(','); for(inti=(strchats.Length-1);i>=0;i--)//遍历加载聊天记录 { if(intcurrent==0) txtcontent.Text=strchats[i].ToString(); else txtcontent.Text=txtcontent.Text+"\n"+strchats[i]. ToString(); } Application.UnLock(); } 在上述代码中,首先获得登录用户的信息和在线人数,然后调用LoadUserName()方法和LoadInfo()方法分别加载所有在线用户和聊天记录。

(7)单击【我要发言】按钮将用户昵称、聊天对象和聊天内容保存到Application对象中,其主要代码如下。
protectedvoidbtnliaotian_Click(objectsender,EventArgse){ if(Session["username"].ToString()==ddllist.SelectedValue)//判断当前登录用户和聊天对象 {Page.ClientScript.RegisterStartupScript(GetType(),"","");return; }if(string.IsNullOrEmpty(txtcontent2.Text))//判断聊天内容是否为空{ Page.ClientScript.RegisterStartupScript(GetType(),"",""); return; }Application.Lock();stringstr=txtcontent2.Text; //锁定Application对象//发言内容 stringtoname=ddllist.SelectedValue; 87 intcurrent=Convert.ToInt32(Application["current"].ToString()); //公共聊天内容 if(current==0||current>10) //根据聊天记录条数保存聊天内容 { current=0;Application["chatlist"]=Session["username"].ToString()+"对"+toname+"说:"+str.ToString()+"("+DateTime.Now.ToString()+")"; } else Application["chatlist"]=Application["chatlist"].ToString()+","+Session["username"].ToString()+"对"+toname+"说:"+ str.ToString()+"("+DateTime.Now.ToString()+")"; Application["current"]=current+1;//将聊天记录数加1后重新保存 Application.UnLock(); //取消锁定 txtcontent2.Text=""; //将内容清空 LoadInfo(); //重新加载显示聊天记录 }
(8)单击【退出聊天室】按钮注销当前登录用户,同时重新保存Application对象中的在线用户列表,然后使用Session对象的Remove()方法删除当前用户。
其主要代码如下。
protectedvoidbtnexit_Click(objectsender,EventArgse) { stringname=Session["username"].ToString(); //获得当前登录的用户 stringuserlist=Application["user"].ToString();//获得所有的在线用户 /*重新加载Application对象中的用户列表*/ Session.Remove(name); Session.Abandon(); Response.Redirect("Login.aspx"); }
(9)所有代码完成后运行
Login.aspx进入登录页面,输入登录昵称后单击【进入】按钮进行测试。
运行效果如图3-18所示。
(10)登录成功后的主界面如图3-19所示,用户可以选择聊天对象向他发送消息,然后单击【我要发言】按钮进行测试。
(11)单击【退出聊天室】按钮退出当前登录重新跳转到登录页面。
运行效果不再显示。
ASP.NET编程从基础到应用 88图3-18项目案例登录页面 图3-19主界面 3.6习题
一、填空题
1.__________对象用于动态的响应用户请求,如控制页面转向和输出文本内容等。

2.Request对象的Form属性是用来获取以__________方式提交的数据。

3.如果想要设置Session对象会话的时间可以使用该对象的__________属性。

4.使用__________对象可以用来获取Request、Response、Cookie和Application等。
ASP.NET的系统对象和状态管理3第章
5.通过Cookie对象的__________属性可以设置它的有效日期和时间。

6.只有Button控件、__________控件和ImageButton控件有PostBackUrl属性。

7.Page对象的__________属性用于判断页面是首次加载还是回传。

二、选择题
1.关于ASP.NET的运行机制原理,下面__________的说法是正确的。
89
A.第一次访问页面时需要生成页面类,以后每次访问都不需要重新生成
B.ASP.NET页面的第一次运行速度比以后的速度都要快
C.ASP.NET第一次运行速度慢是因为要将数据读入内存,以后直接访问就可以了
D.每个用户访问ASP.NET应用程序时都非常慢,但是过一段时间就很快了
2.实现跨页数据传递时需要使用Page对象的__________属性。

A.IsPostBack
B.IsCrossBack
C.IsCrossPagePostBack
D.PreviousPage
3.用户登录成功后一般将用户名和密码等信息保存到__________对象中。

A.ViewState
B.Application
C.Session
D.Cookie
4.如果用户想要从
A.aspx页面跳转到B.aspx页面,下面__________的说法是错 误的。

A.通过使用Button控件、ImageButton控件或LinkButton控件的PostBackUrl属 性实现
B.Response.Write("B.aspx")
C.Response.Redirect("B.aspx")
D.Server.Transfer("B.aspx")
5.关于状态保持对象的说法,正确的是__________。

A.Cookie
和Session保存在客户端,占用宽带资源;Application和ViewState保 存在服务器端,占用服务器资源
B.Session对象保存的数据相对安全,所以可以使用该对象保存任何大小的数据
C.Application对象是程序级的对象,所有在应用程序的任何地方都可以直接使 用,如stringname=Application["name"]
D.ViewState对象是一个特殊的状态保持对象,它只能在单个页面中使用,而不 能在B页面中获得A页面中ViewState对象保存的数据 ASP.NET编程从基础到应用
三、上机练习
1.实现登录成功后的注销功能添加一个新的Web项目,当用户登录成功后使用Session对象保存用户的信息并且跳90转到主界面。
如果用户之前在本机登录过,需要显示用户名和上次登录时间;否则显示游客。
然后,在主界面中单击【注销】按钮删除Session对象,并且跳转到登录页面。

2.使用Request对象和Server对象显示网站信息添加一个新的Web项目页面,用户登录成功显示网站信息,包括客户端浏览器类型、版本、IP地址、主机名称以及服务器端的机器名称和网站根路径等。
最终效果如图3-20所示。
图3-20上机实践2的运行效果 3.7实践疑难解答 3.7.1ASP.NET页面传值问题 ASP.NET页面传值问题网络课堂:【问题描述】:各位前辈,ASP.NET中Cookie、Response、Application和ViewState对象都可以用于保存数据,但是如果我想从B.aspx取得A.aspx中某个值如何实现?哪些对象或方法可以使用,哪些不能使用,能不能说得详细点?谢谢!【解决办法】:这位同学你好,从B.aspx页面取得A.aspx页面某个值的方法有很多, ASP.NET的系统对象和状态管理3第章 我总结了一下,主要有3种情况。

(1)使用状态保持对象Cookie、Session和Application。
ViewState对象的生命周期是 一个Web页面所以不能使用。

(2)跨页传递,通过Button、ImageButton和LinkButton控件的PostBackUrl属性实现 跳转页面,然后在B.aspx页面中通过FindControl()方法获取数据。

(3)URL地址栏传参,通过Response.Redirect("B.aspx?
参数名")跳转到B.aspx页面,91 然后通过Request对象的QueryString属性获得值。
用户也可以根据实际情况使用Form属性。
3.7.2ASP.NET中Session丢失的原因 ASP.NET中Session对象丢失的原因网络课堂: 【问题描述】:ASP.NET中Session对象非常容易丢失,哪位大哥大姐能够说一下Session丢失主要有哪些原因? 【解决办法】:在InProc模式下Session对象丢失的原因有很多,常见的原因如下。

(1)_wp.exe或w3wp.exe在“任务管理器”中或其他情况下导致其进行被终止运行。

(2)修改.cs文件后,该文件被编译了两次。

(3)修改了Web.Config文件或者某些病毒软件扫描Web.Config文件。

(4)服务器上bin目录里的.dll文件被更新。

(5)程序中有框架页面和跨越情况。

(6)Windows2003环境下应用程序池回收、停止后重启。
除了上述的原因外,也有其他的一些因素,欢迎继续补充或者纠正。
3.7.3使用Response对象输出图像 Response对象输出图像网络课堂: 【问题描述】:各位大哥,小弟知道使用Response对象可以输出图片文件,但是具体是如何实现的呢?急求答案,谢谢啦! 【解决办法】:呵呵,这位同学,看来你很心急啊!为什么你不尝试动手做一下呢?要想输出图片需要使用文件流和Response对象的BinaryWriter()方法,将一个二进制图片传入到该方法中。
其主要代码如下所示,你也可以根据实际情况进行修改。
stringpath=Server.MapPath("water_4001.jpg");//初始化图像的物理路径 ASP.NET编程从基础到应用 FileStreamfs=newFileStream(path,FileMode.Open,ess.Read);//创建文件流 if(fs==null)return;byte[]data=newbyte[(int)fs.Length]; //将图像的二进制数据保存到data中 fs.Read(data,
0,(int)fs.Length); 92 fs.close(); Response.ContentType="image/jpeg"; //关闭文件流 Response.BinaryWrite(data);

标签: #矩形 #mini #怎么看 #文件格式 #文件 #加密文件 #文件 #共享文件夹