第一部分:页面状态介绍
Http协议————“无状态协议”
Web服务器每分钟对上千个用户进行管理的一种方式就是执行所谓的“无状态”链接。只要有一个希望浏览器返回一个页面、图像或其他资源的请求,就发生以下事情:
1、连接到服务器
2、告诉服务器想要的页面、图像或者其他项
3、服务器发送请求的资源
4、服务器切断连接,把用户忘的干干净净。
也就是页面之间在Http协议下是没有任何关系的,这样就需要有状态管理来传输页面之间的数据。
WEB页面处理过程
1、页面的一次往返处理:用户对服务器控件的一次操作,就可能引起页面的一次往返处理:页面被提交到服务器端,执行响应的事件处理代码,重建页面,然后返回到客户端。
2、页面重建:每一次页面被请求,或者页面事件被提交到服务器,ASP.NET运行环境将执行必要的代码,重建整个页面,把结果页面送到浏览器,然后抛弃页面的变量、控件的状态和属性等等页面信息。
3、页面处理内部过程:
(1)、Page_Load:IsPostBack属性判定页面是否为第一次被请求。
(2)、事件处理:这一阶段处理表单的事件
(3)、Page_Unload:这个阶段页面已经处理完毕,需要做些清理工作,一般地,你可以在这个阶段关闭打开文件和数据库链路,或者释放对象。
ASP.NET Web Form框架的“连续”和“有状态”假象
访问者打开页面的连续画面,这实际上一种假象,这种假象是由ASP.NET页框架、页及其控件实现的。
第二部分:基于客户端的状态管理:
状态信息放在客户端上。
一、视图状态(ASP.NET特有)
二、隐藏的窗体域
三、Cookie
四、查询字符串
一、视图状态
ASP.ENT使用了ViewState视图状态,是所有服务器控件的一个属性。如果你查看Web Form产生的HTML代码,可以看到一个名为_ViewState的隐藏字段,ASP.NET将状态信息以Hash的方式存储在这里,通过它,可以在下一次回发时知道回发前各控件的状态。
1<inputtype="hidden"name="__VIEWSTATE"id="__VIEWSTATE"value="/wEPDwUILTMyNDAxOTkPZBYCAgQPZBYEAgMPDxYCHgRUZXh0BRvlvZPliY3nlKjmiLfvvJrotoXnuqfnlKjmiLdkZAIHD2QWAmYPDxYGHgtDZWxsUGFkZGluZ2YeC0NlbGxTcGFjaW5nZh4EXyFTQgKAgBhkFiYCAQ9kFgJmD2QWAmYPZBYCZg88KwAJAQAPFgYeDU5ldmVyRXhwYW5kZWRkHgxTZWxlY3RlZE5vZGVkHglMYXN0SW5kZXgCEGRkAgMPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCAmRkAgUPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCBWRkAgcPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCAmRkAgkPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCIWRkAgsPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCA2RkAg0PZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCA2RkAg8PZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCAmRkAhEPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCBGRkAhMPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCCWRkAhUPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCAmRkAhcPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCBGRkAhkPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCAmRkAhsPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCAmRkAh0PZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCA2RkAh8PZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCBmRkAiEPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCCWRkAiMPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCAmRkAiUPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCA2RkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYTBQ9MZWZ0TWVudTEkY3RsMDAFD0xlZnRNZW51MSRjdGwwMQUPTGVmdE1lbnUxJGN0bDAyBQ9MZWZ0TWVudTEkY3RsMDMFD0xlZnRNZW51MSRjdGwwNAUPTGVmdE1lbnUxJGN0bDA1BQ9MZWZ0TWVudTEkY3RsMDYFD0xlZnRNZW51MSRjdGwwNwUPTGVmdE1lbnUxJGN0bDA4BQ9MZWZ0TWVudTEkY3RsMDkFD0xlZnRNZW51MSRjdGwxMAUPTGVmdE1lbnUxJGN0bDExBQ9MZWZ0TWVudTEkY3RsMTIFD0xlZnRNZW51MSRjdGwxMwUPTGVmdE1lbnUxJGN0bDE0BQ9MZWZ0TWVudTEkY3RsMTUFD0xlZnRNZW51MSRjdGwxNgUPTGVmdE1lbnUxJGN0bDE3BQ9MZWZ0TWVudTEkY3RsMThhvz2XbcWenPMmfNNLRf3pN2JrYw=="/>
ASP.NET服务器控件的生命周期:
1、初始化——Init事件(OnInit方法)
2、加载视图状态——LoadViewState方法(当页面回发时,首先从_ViewSatae字段信息中加载该控件的状态)
3、处理回发数据——LoadPostData方法
4、加载——Load事件(OnLoad方法)
5、发送回发更改通知——RaisePostDataChangedEvent方法
6、处理回发事件——RaisePostBackEvent方法
7、预呈现——PreRender事件(OnPreRender方法)
8、保存视图状态——SaveViewState方法
9、呈现——Render方法
10、处置——Dispose方法
11、卸载——UnLoad事件(OnUnLoad方法)
视图状态的用法:
1、启用视图状态,即EnableViewState = "true",默认为true,如果为false,那么该控件和子控件的视图状态就不会被串行化。
2、可以在视图状态中存储的类型:Int32,bool,string,color,array,arrayList,Unit以及以上类型的HashTable对象
3、视图状态与安全
视图状态串行化的字符串表达式作为明文来往返传送,这是不安全的,在视图状态中绝不能保存任何信息(例如口令、连接字符、文件路径等。)
参考例子(ViewState.aspx和ViewState_userinfo.aspx)
usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Collections;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
namespaceASPNETState
{
publicpartialclassViewState:System.Web.UI.Page
{
protectedvoidPage_Load(objectsender,EventArgse)
{
if(!IsPostBack)
{
Label1.Text="EnableViewState=True";
//EnableViewState设为True时,Lable1的状态保存在_viewState隐藏字段中,当刷新页面时,不执行此语句,但是可以从_ViewState中取到以前的状态信息,所以还是原值。
Label2.Text="EnableViewState=False";
//EnableViewState设为False时,Lable2的状态没有保存在_viewState隐藏字段中,当刷新页面时,不执行此语句,并且取不到以前的状态信息,所以为空。
}
}
protectedvoidButton2_Click(objectsender,EventArgse)
{
if(ViewState["count"]==null) //从ViewState中读数据
{
ViewState["count"]=0; //向ViewState中保存数据(可以保存多种类型的数据)
}
intncount=(Int32)ViewState["count"];
ncount+=1;
ViewState["count"]=ncount;
Label3.Text=ViewState["count"].ToString();
}
protectedvoidButton1_Click(objectsender,EventArgse)
{
}
}
}
二、隐藏的窗体域
1、隐藏域不会显示在用户的浏览器中,但我们可以像设置标准控制的属性那样设置其属性。当一个网页被提交给服务器时,隐藏域的内容和其他控制的值一块儿被送到HTTP Form集合中。隐藏域可以是任何存储在网页中的与网页有关的信息的存储库,隐藏域在其value属性中存储一个变量,而且必须被显性地添加在网页上。
2、ASP.NET中的HtmlInputHidden控制提供了隐藏域的功能。
简单的说,就是页面上有一个保存值的隐藏控件,页面上可以取到它的值,但是看不见它。
例子见(hidden.aspx)
三、Cookie
Cookie定义:
1、由网络服务器发送出来以储存在网络浏览器上小量信息;
2、Cookie是把与用户和网站相关的信息存储比会话时间还长的一种方式。
3、Cookie存储在用户的硬盘上(一般存储在Web浏览器软件所在的文件夹上,称为Cookies)
用途:
1、用户的个人配置
2、注册和“Remember me”
3、弹出窗口
如何工作:
1、Cookie存储在C:\Documents and Settings\<Username>\Cookies下
2、IE选项中的“隐私”选项下修改cookie设置,也可以在“常规”选项卡下选择“删除cookie”
如何使用:
1、使用Response对象设置Cookie状态
Response.Cookies["UserName"].Value = "张三";
2、使用Request对象读取已有的Cookie
string strName = Request.Cookies["UserName"].Value;
3、清除:
Response.Cookies["UserName"].Value = null;或
Response.Cookies["UserName"].Expires = new System.DateTime(1999,10,12);(过期)
属性:
1、Value:值,是string类型的
2、Domain:设置这个属性后,只有在这个域下才能访问该Cookie
例如:
Response.Cookies["UserName"].Domain = ".Webcast.com.cn";
//只有指定以“.Webcast.com.cn”结尾的域可以访问本Cookie
3、Path:该属性指定那些路径下的页面可以访问此Cookie
4、Expires:指定Cookie过期的日期(清除Cookie)
Response.Cookies["UserName"].Expires = new System.DateTime(1999,10,12);(过期)
参见实例(Cookie.aspx)
该例子是说在页面上的TextBox中输入一个用户名,然后点“注册”按钮,此时将用户名存入Cookie中,然后在页面加载时取Cookie值显示在页面中,同时10s中自动删除Cookie。
usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Collections;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
namespaceASPNETState
{
publicpartialclassCookie:System.Web.UI.Page
{
protectedvoidPage_Load(objectsender,EventArgse)
{
if(Request.Cookies["UserName"]!=null) //注意是Request
{
Response.Write("亲爱的"+Request.Cookies["UserName"].Value+",欢迎你光临!");
}
else
{
Response.Write("欢迎光临!");
}
}
protectedvoidbtnZC_Click(objectsender,EventArgse)
{
Response.Cookies["UserName"].Value=txtUser.Text;
Response.Cookies["UserName"].Expires=DateTime.Now.AddSeconds(10);//10秒钟后失效,即Cookies["UserName"]的信息丢失;或者手工删除(IE中选项删除Cookie)
}
}
}
四、查询字符串
在讲查询字符串之前先了解一下GET 和 POST方法的不同:
通过HTTP从Web服务器请求页面或其他资源,有两个通用的方法(GET 和 POST方法)。可使用GET方法直接获得资源,也可使用POST把值传给相应资源。GET方法是缺省的
假如把一个或多个成对的名称/值附在请求页面的URL后,就变成请求的查询字符串,且在QueryString集合中提供给ASP页面。单击Web页面、Email消息或其它文档的超链接,或在浏览器的地址栏中输入地址并按回车,或单击浏览器中的Links或Favorites按钮,所有这些都要使用GET方法。
因此,对这些动作中传递值给ASP的唯一方法是通过QueryString集合,把值附在URL后。
http://mysite.com/process_page.asp?FirstName=Priscilla&LastName=Descartes
可以采用如下方式访问在QueryString集合中提供的值(QueryString就是下面要讲的查询字符串):
strFirstName = Request.QueryString("FirstName") ''Return "Priscilla"
strLastName = Request.QueryString("LastName") ''Return "Descartes"
strRaw = Request.QueryString
Return "FirstName=Priscilla&LastName=Descartes"
在一个页面内使用<FORM>段时,可以设置打开的FORM标记的METHOD属性值为“GET”或“POST”,缺省值为“GET”。假如使用“GET”或省略其属性,浏览器将该值绑定在页面所有控件上,成为一个查询字符串,且附在被请求页面的URL上。当这个请求到达Web服务器时,其值由ASP的Request.QueryString集合提供。然而,假如设置METHOD属性为“POST”,浏览器将值包装进发送服务器的HTTP报头中,通过Request.Form集合提供给ASP。
通常来说,可以在所有的HTML窗体中使用GET方法。然而,浏览器或服务器的URL字符串长度存在一定的限制。因此,附有长的字符串可能会引起溢出和某些字符串的字符被截掉。同时,查询字符串出现在浏览器的地址栏和所有的保存的链接和收藏夹中。不仅如此,还显露了通过Web服务器时在HTTP请求中不想显示的值,它也可能出现你的服务器和其他路由服务器的日志文件中。在HTTP请求报头中的值很少是可见的,并且不出现在日志文件中。
使用POST方法需要注意的小问题是,当用户重新下载<FORM>时,窗体的值将不再保留,其值为空且必须重新输入。然而,当附在URL上时,其值被存储为一个链接,将被保留,因此将出现在所有的URL与字符串结合的请求中,这或许是个优点也可能是个缺点,这根据应用而定(一些浏览器在客户端上能够在一定范围内自动保留一个页面上的值)。
先看看get方法(利用查询字符串):
1、查询字符串提供了一种简单而受限制的维护状态信息的方法,我们可以方便地给那个信息从一个网页传递给另一个网页。
2、带有查询字符串的URL如下所示:
http://localhost:1305/QueryString_Show.aspx?username=xieex&password=1111
3、使用:
string sUserName,sPwd;
sUserName = Request.Params["username"].ToString();
sPwd = Request.Params["password"].ToString();
或
sUserName = Request.QueryString["username"].ToString();
sPwd = Request.QueryString["password"].ToString();
或
sUserName = Request["username"].ToString();
sPwd = Request["password"].ToString();
都可以取到xieex和1111
其实这样的传值方式很常见也很有用,例如有些系统中,Gird中有很多条数据,我可以对某条数据进行浏览或者编辑,当点“浏览”按钮时,我弹出对话框对该条记录进行浏览,此时不允许编辑,此时我就需要从主页面上传一个状态(state)到对话框页面上来,然后在对话框页面上取其状态(Request["state"].ToString()),此时根据其值(edit或browse)就可以控制是否可以编辑了。
参见实例(QueryString.aspx和QueryString_Show.aspx)
该例子是说在QueryString.aspx页面上注册用户名和密码,然后跳转到另一个页面上,在另一个页面上取其用户名和密码。
在该页面上注册用户名和密码
usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Collections;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
namespaceASPNETState
{
publicpartialclassQueryString:System.Web.UI.Page
{
protectedvoidPage_Load(objectsender,EventArgse)
{
}
protectedvoidButton1_Click(objectsender,EventArgse)
{
Response.Redirect("QueryString_Show.aspx?username="+txtUser.Text+"&password="+txtPwd.Text);
}
}
}
在另一个页面上取用户名和密码:
usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Collections;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
namespaceASPNETState
{
publicpartialclassQueryString_Show:System.Web.UI.Page
{
protectedvoidPage_Load(objectsender,EventArgse)
{
Response.Write("用户:"+Request.Params["username"]+"<br>");
Response.Write("密码:"+Request.Params["password"]+"<br>");
Response.Write("用户:"+Request.QueryString["username"]+"<br>");//get方法时用Request.QueryString
Response.Write("密码:"+Request.QueryString["password"]+"<br>");
Response.Write("用户:"+Request["username"]+"<br>");
Response.Write("密码:"+Request["password"]+"<br>");
}
}
}
再看看post方法
直接看例子:(Post.aspx和post_acc.aspx)
该例子和上面例子差不多,是说在Post.aspx页面上注册用户名和密码,然后跳转到另一个页面上,在另一个页面上取其用户名和密码。
相关推荐
ASP.NET状态管理是Web开发中的核心概念,尤其是在使用Visual Studio .NET 2003这样的早期版本时。状态管理允许开发者在用户与Web应用程序交互的过程中保存和恢复数据,确保用户体验的连续性和一致性。在ASP.NET中,...
讲座内容: 如果保持...这次讲座,我们将给大家介绍在ASP.NET中如何进修状态管理。 <br/> 课程讲师: 邵志东 MSDN特邀讲师 北京新科海学校 副总经理 <br/>技术等级: Level 200 <br/>
ASP.NET状态管理.doc
ASP.NET 提供了缓存、输出缓存、会话状态管理等功能,帮助优化应用程序性能。对于大型系统,还可以考虑使用负载均衡和分布式缓存。 9. **单元测试与持续集成**: 使用 NUnit、xUnit 等工具进行单元测试,确保代码...
Asp.net的特性包括自动垃圾回收、页面生命周期管理、视图状态、缓存机制等,这些都使得开发会员管理系统变得更加便捷。 三、会员管理模块 1. 管理员管理:管理员是系统的核心角色,负责系统的整体运行。Asp.net...
【ASP.NET餐饮管理系统详解】 ASP.NET是微软公司推出的一种用于构建动态网站、Web应用程序和Web服务的技术框架。在本项目中,"ASP.NET餐饮管理系统"是一个基于Web的平台,旨在帮助餐饮业进行日常运营和管理。它利用...
讲座内容: 如果保持...这次讲座,我们将给大家介绍在ASP.NET中如何进修状态管理。 <br/> 课程讲师: 邵志东 MSDN特邀讲师 北京新科海学校 副总经理 <br/>技术等级: Level 200 <br/>
五、ASP.NET状态管理 在Web环境中,由于其无状态性,状态管理成为了一个重要的话题。ASP.NET提供了多种状态管理机制,如视图状态、控制状态、隐藏字段、Cookie、Session和Application状态等,帮助开发者在多个请求...
状态管理用于无状态的Web...本文探讨了ASP.NET网页编程中客户端和服务器端状态管理技术的工作原理和实现方法,并对各项技术的特点进行分析比较。这对于如何开发出执行效率高、安全性强的Web应用程序具有较好的借鉴作用
总的来说,这个"图书管理系统 c# asp .net 图书管理系统 网页"项目,利用C#和ASP.NET的强大功能,为图书馆提供了一套高效、便捷的数字化管理工具,提高了图书管理的效率,同时也提升了用户的借阅体验。通过深入学习...
8. **ASP.NET状态管理** ASP.NET提供了多种状态管理选项,如View State、Control State、Session State和Cookie。了解每种状态管理方式的特点和适用场景,有助于优化应用性能和用户体验。 9. **ASP.NET AJAX** ...
在这个文档管理系统中,ASP.NET框架提供了强大的数据处理、状态管理以及安全性支持。 文档管理系统的用户界面通常由多个Web页面组成,这些页面通过ASP.NET的控件进行交互。例如,"文件上传"控件允许用户将本地文件...
ASP.NET合同管理管理系统源码是一款基于微软的ASP.NET技术开发的高效、稳定且功能全面的合同管理系统。ASP.NET是微软.NET框架的一部分,主要用于构建Web应用程序。这个系统旨在帮助企业或机构更好地管理和跟踪合同...
五、ASP.NET状态管理 在Web环境中,由于其无状态性,状态管理变得尤为重要。ASP.NET提供多种状态管理技术,包括视图状态、隐藏字段、Cookie、会话状态和应用程序状态等,以保存和恢复用户的交互信息。 六、ASP.NET...
5. **状态管理**:ASP.NET提供了多种状态管理机制,如View State、Session、Cookie等,用于在HTTP无状态的环境中保持用户信息和页面状态。在图书管理中,这可能被用于记住用户的借阅历史或者搜索条件。 6. **Web...
3. **状态管理**:ASP.NET提供了多种状态管理机制,如视图状态、控制状态、隐藏字段、Session和Cookie,以保持用户在网页间导航时的数据。 4. **数据绑定**:ASP.NET的数据绑定机制使UI与数据源的连接变得简单,...
4. **状态管理**:ASP.NET提供了多种状态管理机制,如视图状态、隐藏字段、Cookie等,用于在页面间保持数据。 5. **安全性**:ASP.NET内置的安全特性,如身份验证、授权、加密等,确保了应用程序的安全性。 6. **...
第四部分是本书的高级话题,分析了ASP.NET状态管理、自定义服务器控件、ASP.NET缓存、多语言本地化应用程序、ASP.NET Web部件等。从深度上来讲,本书对实际开发中极不常用而大部分同类书都浓墨重彩的知识点只做了...
5. 状态管理:ASP.NET提供了多种状态管理机制,如Session、ViewState和Cookie,用于在用户会话期间保持数据。在工资系统中,这可能用于跟踪用户的操作状态或者临时存储计算结果。 6. 错误处理和日志记录:为了确保...