转载: web窗体回顾

来源:互联网 发布:网络直播的优点和缺点 编辑:程序博客网 时间:2024/06/11 06:13

 

      昨天没有写自己的日志,是因为昨天看的太多了来不及消化,由于对于数据绑定没有很透彻的了解,只好先放了一放,回过头来把web窗体又重新看了一遍,并且有简单的看了一些xml的知识.现在就简单的总结一下吧!
     
ASP.NET页面(正式名称叫Web窗体)是ASP.NET应用至关重要的一部分。它们提供了Web应用的真实输出,即客户请求网页并在浏览器里浏览。Web窗体模型在ASP.NET2.0里有了些许的调优,而不是巨大的变化。一些变化在表面是看不出来的。例如,页面在生存周期中包含了更多的事件,那样它们就可以插入其它的ASP.NET功能,如主题和新的数据绑定模型。视图状态分片(View state chunking):并不将所有视图状态信息存放在单个域中,可以让ASP.NET将其存入几个大小适当的域中。这个特征主要解决代理服务器的问题,这些代理服务器不支持大块的隐含输入域。XHMTL支持(XHTML support):Web窗体使用XHTML兼容的标签来进行渲染,这是从ASP.NET 1.1里移植过来的,但在.NET2.0中使用几乎不会有任何问题。可编程的页头(Programmable page header):网页的<head>部分现在是HtmlHead服务器控件的一个实例。可以通过程序改变标题、添加metadata或者链接的样式表到页面。Web应用在服务器端执行(Web applications execute on the server):例如,假定你创建了一个窗体,允许客户选择产品记录并且更新信息。用户在浏览器中执行这些任务,但为了执行要求的操作(如更新数据库),你的程序需要在Web 服务器上执行。为了处理这个界线(divide),ASP.NET采用了回滚(postback)技术,执行一定的动作时,客户端就发送页面(和用户输入的所有信息)到服务器。一旦ASP.NET接到了页面,便触发服务器端相应的事件来通知你的程序。Web应用是无状态的(Web applications are stateless):换句话说,在渲染过的HTML发送给用户之前,网页对象被销毁,所有客户端特定的信息都被丢弃。动态借接口:显然,控件模型使获取窗体信息更为方便,但更为引人注目的是它简化了添加信息到网页的过程。几乎所有的Web控件都是可读或可写的,你可以象读取一样简便地设置文本框控件的Text属性。这种代码主要有这几个优点:首先,编写更容易(不会出现错误编写错误)。其次,基于控件的代码更容易放置到网页中。最后,控件模型精细但同样惊人的优点是它隐藏底层HTML细节的方法。ASP.NET通过提供新的事件驱动的模型,使事件处理有了全新的改变。在这个模型中,将控件添加到Web窗体,然后确定相应的响应事件。每个事件处理器都封装在一个单独的方法中,这样保持了页面的简洁和组织性。
  asp.net的工作流程:
视图状态分片(View State Chuncking
隐含的视图状态域并没有大小限制。但是,一些代理服务器和防火墙会禁止隐含域大于某个值的网页通过。为了解决这个问题,可以使用视图状态分片(view state chunking)技术,它能自动将视图状态切分到多个域,保证隐含域的大小不会超过设置的阀值。
为了使用视图状态,你仅需要设置maxPageStateFieldLength属性,这个属性是web.config文件的<pages>的属性。它指定了视图状态的最大大小(单位为字节)。下面的示例将视图状态上限设置为1KB:
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<system.web>
<pages maxPageStateFieldLength = "1024" />
</system.web>
</configuration>
当请求的页面所产生的视图状态大于这个值时,就会创建几个隐含的输入域:
<input type="hidden" name="__VIEWSTATEFIELDCOUNT" value="3" />
<input type="hidden" name="__VIEWSTATE" value="..." />
<input type="hidden" name="__VIEWSTATE1" value="..." />
<input type="hidden" name="__VIEWSTATE2" value="..." />
记住,视图状态分片是一个简单的机制,是为了避免特定的代理产生的问题(相对来说发生较少)。视图状态分片不能改善性能(反而增加了少量额外的序列化负载)。在大量良好的设计当中,应该尽可能减少视图状态中的信息,这样可以提升性能。
在服务器端,对于ASP.NET Web窗体的处理是分阶段进行的。在每一个阶段,不同的事件被唤起。这允许在任何一阶段,向网页中插入处理流,并且进行你需要的响应。
下面列出了ASP.NET网页处理流中的主要阶段:
l         页面框架初始化
l         用户代码初始化
l         校验
l         事件处理
l         自动进行数据绑定
l         清除
请记住,对于每一次Web请求,这些阶段是独立进行的。
页面框架初始化(Page Framework Initialization
这是ASP.NET创建网页的第一个阶段。这一阶段产生.aspx网页中标签定义的所有控件。如果页面不是第一次请求(也就是说是回传的页面),ASP.NET将反序列化视图状态信息并应用到所有控件。在这一阶段,网页的Page.Init事件释放。
用户代码初始化
在这个处理阶段,Page.Load事件被释放。大多数网页处理这个事件,执行任何要求的初始化(如添充动态文本或配置控件)。
无论页面是首次被请求还是回传的请求的一部分,Page.Load事件总是会释放。
校验(Validation
ASP.NET引入了新的校验控件,能够自动校验其它用户输入控件,并且显示出错信息。这些控件在页面加载后其它事件发生前释放。但是,校验控件主要为那些大部分自供给(这意味着你不需要对校验事件进行响应)的控件服务。你可以检查页面在其它事件句柄里是否有效(使用Page.IsValid属性)。
事件处理(Event Handling
现在,页面完全加载并且进行了校验。ASP.NET释放所有从最后一次回传以后发生的事件。大部分ASP.NET事件是下面两种类型之一:
l         立即响应事件(Immediate response events):包括单击提交按钮,或者点击在一个丰富的Web控件中的其它按钮、图像区域或者链接,通过调用_doPostBack() JavaScript函数触发回传。
l         变化事件(Change events):包括控件中的选择或者文本框中的文本发生的变化。如果AutoPostBack设置为true,这些事件就为Web控件立即释放。否则,在页面下次回传时释放事件。
假设有一个页面,页面上有一个提交按钮和一个文本框,它们并不自动回传。你改变文本框中的文本,然后点击提交按钮。此时,ASP.NET顺序唤起下列事件:
• Page.Init
• Page.Load
• TextBox.TextChanged
• Button.Click
• Page.PreRender
• Page.Unload
自动数据绑定(Automatic Data Binding
它将自动执行数据绑定进程。使用数据源控件时,ASP.NET在页面的生命周期中向数据源自动执行更新和查询。
清除(Cleanup
在生命周期的最后,网页渲染成HTML。渲染之后,开始执行清除,Page.Unload事件释放。此时,网页对象仍可用,但是最后的HTML已完成渲染,不能被更改。
不要忘记,.NET具有垃圾收集服务,它定期运行来释放那些不再引用的对象占用的内存。如果有任何未管理的资源需要释放,应当在清除阶段显性地执行,当然,之前就完成清除更好。当垃圾收集器收集页面时,Page.Disposed事件释放。至此,Web页面的整个流程完毕。
动态控件创建(Dynamic Control creation
使用Controls集,你可以通过程序创建一个控件,并且将其添加到网页。用动态控件时,必须记住:它们直到下一次传回时才会存在。ASP.NET不会重新创建一个动态添加的控件。如果想要多次重新创建一个控件,你应当在Page.Load事件处理器中执行控件创建。这可以带来额外的好处,即允许在动态控件中使用视图状态。尽管视图状态通常在Page.Load事件前存储,但如果你在Page.Load事件处理器中创建一个控件,ASP.NET会自动应用Page.Load事件处理器结束后的任何视图状态信息。这个过程是自动的。
如果稍后要与控件进行交互,应该给它指定唯一的ID。可以根据这个ID来从它所在容器的Controls集中获取控件。也可以使用递归查找逻辑(在控件树示例中已演示过)来查找控件,或者使用静态的Page.FindControl()方法,在整个页面中根据ID搜索控件。
1、    网页在第一次运行时,ASP.NET创建页面和控件对象。执行初始化代码,然后页面渲染为HTML并返回给客户端。页面对象在服务器内存中释放。
2、    在某个时刻,用户进行操作,如单击一个按钮,触发回传的操作。此时,窗体数据随着页面提交。
3、    ASP.NET捕获返回的页面,并且重新创建页面对象,并应用视图状态信息。
4、    ASP.NET随后检查触发回送的操作,并唤起对应的事件(如Button.Click),执行事件处理代码。通常情况下,会执行一些服务器端的操作(如更新数据库或从文件读取数据),并且修改控件对象来显示新的信息。
5、    修改后的页面渲染为HTML并返回给客户端。页面对象从内存中释放。如果发生另一次回传,ASP.NET重复第2至4步的过程。
注意由于HTML是完全无状态的,所有状态需要ASP.NET重新创建才可获得,因此事件驱动模型是竞争的。
对于创建丰富的Web窗体,ASP.NET Web控件使用自动回传(automatic postback)功能来扩展了这个模型。有了这个功能,输入控件可以释放不同的事件,而且服务器端的代码能够立即对其进行响应。例如,当用户点击一个检查框、改变列表中的选择,或者文本框中的文本并且移动到它其区域时,就会触发回传。这些事件虽然不象Windows应用中的事件那样易获得,但它们相对于提交按钮,则是很大的进步。为了使用自动回传,只需要简单地将Web控件的AutoPostBack属性设置为true(默认值是false,目的是保证无事件响应时优化性能)。这样,ASP.NET使用客户端的JavaScript来桥接客户端和服务器端的程序。
工作过程是这样的:如果你创建了包含一个或多个Web控件的网页,Web控件被设置为使用AutoPostBack(即将其值设置为true),那么,ASP.NET添加名为_doPostBack()的JavaScript函数来渲染HTML页。调用时,它触发回传,将带有所有信息的页面传回Web服务器。任何一个将AutoPostBack属性设置为true的控件都会使用onClick或onChange属性来连接到_doPostBack()函数。这些属性表明,为了响应客户端的JavaScript事件onClick和onChange,浏览器应当执行相应动作。ASP.NET使用_doPostBack()函数作为中介,自动将客户端的JavaScript事件转换为服务器端的ASP.NET事件。
提示,请记住,ASP.NET包含两个控件模型:纯粹的HTML服务器控件和功能更丰富的web控件。自动回传仅在web控件中可用。
ASP.NET模型中,最为重要的要素是新的视图状态机制。视图状态解决了由于HTTP与生俱来的无状态(变化信息丢失)带来的问题。ASP.NET设计了综合的状态序列化机制。本质上,一旦页面代码运行完毕(渲染成HTML发送到客户端之前),ASP.NET检查页面上所有控件的所有属性,如果任何一个属性在初始状态过程中发生了改变,ASP.NET将这个信息保存在名字/值集中。最后,ASP.NET将所有收集到的信息序列化为Base64的字符串(Base64串保证了没有无效的HTML特殊字符)。然后插入<form>节中间作为新的隐含字段。
页面回传时,ASP.NET执行如下步骤:
1、ASP.NET重新创建基于默认值的页面和控件对象。因此,页面与第一次被请求时具有相同的状态。
2、接下来,反序列化并应用视图状态信息,并且更新所有控件,使页面返回到最后发送给用户前的状态。
3、最后,ASP.NET基于传回的窗体数据调整页面。例如,如果用户在文本框控件中输入了新的文本,或者在列表框里有了新的选择,那些信息存于窗体集中,ASP.NET使用这些信息来修改对应的控件。完成这一步之后,页面反映当前状态,正如呈现给用户一样。
4、现在该轮到事件处理代码工作了。ASP.NET触发相应的事件,响应程序相应地改变页面,跳转到新页面,或者执行一个完全不同的操作。
图提供了端到端的浏览,汇总了页面请求的全部概念。
ASP.NET页面请求
出处:http://mmiluy.blog.51cto.com/45974/10451