Asp.net高级程序设计之WEB窗体(3)
WEB应用程序特点
1. 在服务器上运行---ASP.NET通过回送的技术来把页面(以及所有用户的输入信息)发送到服务器.ASP.NET接收到这个页面后,就会触发相应的服务器段时间来通知你的.CS文件以执行操作。
2. 无状态---HTTP是一种无状态的网络传输协议,因此基于此的大多数技术都是无状态的。ASP.NET提供了一个持久化机制叫做视图状态来模拟面向连接状态。视图状态自动的把信息嵌入到呈现HTML的隐藏输入框中。
表单SUBMIT提交过程
HTML
1. 浏览器手机每个控件的当前值
2. 把这些值粘成一个长字符串---(FirstName=Shang&LastName=Ji&CS=on&VB=on)信息作为一系列的名称/值对已&符号分开。
3. 使用一个HTTP POST操作把字符串发送的FROM中定义的ACTION页面
Web表单
所有的服务器端的编程框架都在原始窗体数据上添加了一层抽象---Request.Form。这样的方式有助于类型安全。所有的ASP.NET中的控件都是放置在一个单一(只能有一个)的<FORM>标签中。只有当runat=”server”时才允许标签运行在服务器端。
ASP.NET事件驱动模型的工作原理
1. 当页面第一次运行时,ASP.NET创建页面和控件对象,接着执行初始化代码(合并.CS.DESIGNER.CS文件)然后页面被呈现为HTML并返回到客户端。页面对象在服务器内存中被释放。
2. 用户在某点触发某个回送时,例如单击某个和按钮,页面所有的表单数据都被提交。
3. ASP.NET获取这些返回的页面并重新构建页面对象
4. ASP.NET检查是什么操作触发了回送,并引发适当的时间(例如按钮的Click事件)
5. 修改后的页面转换为HTML并返回到客户端。页面对象从内存中释放。加入有新的回送发生,ASP.NET重复(2)-(4)。
自动回送揭秘:要使用自动回送,只需要把WEB控件的AutoPostBack属性设置为True。ASP.NET在呈现HTML页面时,在控件上添加一个_doPostBack()的JavaScript方法。
还会添加两个因此的输入字段,以保存信息,字段初始为空。
<input type=”hidden” name=”_EVENTTARGET” id=”_EVENTTARGET” value=””>
<input type=”hidden” name=”_EVENTARGUMENT” id=”_ EVENTARGUMENT” value=””>
视图状态
记录在动态网页结构下网页回传后的改变。ASP.NET检查网页上所有的空间的属性,如果任何一个属性从他的初始状态开始发生了变化,ASP.NET就会记录着一个变化,最后把所有的变化序列化为一个BASE64编码的字符串。并通过隐藏字段的方法插入到网页<form>中。在网页被回传的时候,ASP.NET先重新创建页面和控件对象,然后反序列化视图状态并更新所有的控件,再根据窗体中传回的数据调整页面。现在你的时间处理代码就可以发挥作用了。注意:WEB窗体是每个客户端和服务器端的往返上重建的。它在内存中和保存的时间不会超过他呈现一个简单请求的时间。
揭秘视图状态:
byte[] stringByte = Convert.FromBase64String(viewStateString);
string decodedViewState = System.Text.Encoding.AAAAAASCII.GetString(stringBytes);
视图状态程序分块,如果字段太长可以采用分段的方式存储数据。
在web.config文件中设置:<system.web><pages maxPageStateFieldLength=”1024”/></system.web>
WEB窗体处理阶段
1. 页面框架初始化---ASP.ENT在这个阶段开始创建页面。产生控件。如果是回送ASP.NET将反序列化视图状态信息。Page.Init事件在此阶段触发。但是通常处理此事件。因为此时控件对象可能还没有创建,视图状态信息也还没有加载。
2. 用户代码初始化---PAGE.LOAD时间在这个阶段被触发。在PAGE.LOAD时间里初始化控件将被视图状态记录为一次变化,把改变记录到视图状态里。所以要尽量报纸晓得页面,并避免在这个事件中初始化空间,而应该在标签控件里设置属性。可以设置ENABLEVIEWSTATE为FALSE禁用控件的视图状态信息。
3. 验证
4. 事件处理---ASP.NET时间有以下两种A.立即反应事件(调用JAVASCRIPT方法_dopostback()触发一次回发。)B.变化事件(改变控件的选择,文本时触发)
5. 自动数据绑定---如果页面中使用了数据源控件,asp.net就会在控件事件处理之后PAGE.PREPRENDE时间发生之前执行数据源的更新操作在PGAE.PRERENDER事件触发后,数据源控件把获得的数据插入到关联的控件中。
6. 清除---此时页面已经呈现为了HTML,不能做修改。开始清除并触发PAGE.UNLOAD事件。
页面和控件的创建
WEB窗体首先呈现表单自身,然后通知页面中的所有空间各自呈现自身。如果控件可以包含子控件,也可以负责自身呈现代码。ASP.NET第一次创建页面时(相应一个HTML请求),会检查.aspx文件对已使用RUNAT=”SERVER”特性的每个元素创建并配置一个控件对象,并把这个控件作为子控件加入到页面。Response.Write()方法不应该在实际的ASP.NET应用程序中使用。因为他会跳过WEB控件模型,从而产生一个不连续的界面。页头<HtmlHead>控件,对于那些极端动态的页面非常方便。可以通过后台编码的模式生成标题(page.Header.Title=””),样式表(ISyelSheet),META控件(HtmlMeta)。动态控件被创建过户一般显示在父容器的最底部,可以使用PlaceHolder来控制位置。动态控件只存在于当前页面,一旦页面发生了回送,它就会消失。
Page类
其实页面本身也是作为控件对象被实例化的。即所以的WEB窗体都是asp.net Page类的实例。这个类还有非常有用的属性:Session,Application,Cache, Request,Response, Server,User, Trave.ServerTransfer()方法是在应用程序中把用户重定向到其他页面的速度最快的方法。这个方法不需要在客户端和服务器端之间往返。而是ASP.NET引擎直接加载新页面并开始处理新页面。所以显示在客户端浏览器的URL不会发生变化。Server.HtmlEncode(string1):如果string1含有html标签(如<br>),那么这个方法就让服务器不解析string1,而是直接显示string1的原始值不做任何改变。Decode()就是把<br>解析为标签。
Trace
Trace对象是一个通用的跟踪工具。它允许你把页面级的信息写到日志。跟踪和Visual Studio的调试功能互补,调试解决在编写程序是代码产生的问题,而跟踪是用来进行新能检测和计时。它可以看到页面中当前上下文信息。可以使用Trace.Write()方法或者Trace.Warn()方法吧自己的信息写入跟踪日志。如下面的代码
默认情况下,跟踪时逐页启动的。要启用应用程序级别的跟踪,就修改WEB.CONFIG配置文件<system.web><trace enabled=”true” requestLimit=”10” pageOutput=”false” traceMode=”SortByTime” localOnly=”true”/><system.web/> 之后就可以在应用程序根目录的trace.axd查看跟踪。
心得
如果把学习技术当做一种任务,一种责任,那学习的质量会大打折扣。忽视了技术本身所带给人的快乐。技术是用于创造的,用于把人的意识以实物的形式体现出来。学习一种技术本身就应该是对技术充满了好奇,充满了神秘,出于一种对庐山正面目的渴望。这种渴望尽管不可能像渴望美女一样的强烈,但性质上却是一样的。所以学习应该充满了无尽的快乐。
《壮志潜龙》--------- A son never give up! Never give up,which means when you gonna fall down ,you stand up.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
{
Trace.Write(“Button1_Click1”,”About to update the label.”);
lblInfo.Text+=”Button1.Click event handled.<br>”;
Trace.Write(“Button1_Click1”,”label updated.”);
}