ASP.NET页面即Web窗体。

  Web应用程序要像传统的富客户端应用一样运行,主要存在两大问题:

  1、Web应用程序在服务器上执行。ASP.NET通过回送技术,当发生特定的行为时,会将页面以及所有用户提供的信息发送到服务器,ASP.NET接受这个页面后,就会触发相应的服务器端事件来通知你的程序代码。你通过完全面向对象的代码来响应这些事件。

  2、Web应用程序是无状态的。ASP.NET通过视图状态解决这一问题。

  在HTML页面中,通过在Form标签中加入Input标签,使用submit标签将页面信息通过HTTP POST提交到服务器,服务器会收到以&分割的键值对字符串,可以通过Request.Form["attributeName"]来获取字段的值,但它不是面向对象的,ASP.NET Web窗体中使用控件ID作为控件对象(完全面向对象)的做法,使开发人员避免接触HTML语法。

  ASP.NET事件的工作原理很简单:当页面第一次运行时,ASP.NET创建页面和控件对象,执行初始代码,然后将页面呈现为HTML并返回客户端,页面对象在服务器内存中释放;当用户触发回送,所有表单数据都被提交;ASP.NET重建页面对象还原到发送到客户端时的最后状态;ASP.NET检查触发回送的操作,并引发相应的事件,在事件处理程序中执行某些服务器操作,修改控件对象显示新的信息;修改后的页面再转换成HTML发送到客户端,页面对象从内存中释放,假如有新的回送,继续重复以上操作。

  ASP.NET使用自动回送来扩展这个模型。只需要把Web控件的AutoPostBack属性设置为true,ASP.NET在呈现的HTML页面上添加一个_doPostBck()方法,该方法指明引发控件的ID以及其他任何相关的附件信息,并提交表单。将客户端的JavaScript事件变为一个服务端的ASP.NET事件。

  ASP.NET使用视图状态来解决HTTP的无状态问题。当页面被回送时,ASP.NET根据.aspx来重建页面,此时页面可能已经被修改过了,而返回的数据并不包含这些变化,为了避免这些丢失,需要自行实现。ASP.NET在最后的HTML呈现之前,检查网页上所有的控件属性,与它的初始状态比较,发生变化的记录在集合当中,然后将集合中的所有信息序列化为一个Base64编码的字符串,最终将这个字符串作为隐藏域插入到页面中,当页面回送后,ASP.NET根据.aspx文件重建页面,然后反序列化视图状态,并更新相应控件,将页面返回到最后一次被发送到客户端的状态,ASP.NET再根据传回来的数据调整页面,并响应事件。为了安全起见,可对视图状态进行加密。可以使用视图状态分块来解决视图状态过大的问题。

  ASP.NET的Web控件同XHTML1.1标准保持兼容。根据文档类型定义和配置XHTML呈现来决定支持版本。

  早期的ASP.NET产生冗长的客户端ID,但通过客户端JavaScript对其进行操作时,特别麻烦。ASP.NET 4增加了ClientIDMode属性,来解决这个问题。有以下几个使用原则:如果不需要引用客户端元素,就不必考虑该问题;如果很少使用客户端ID,可将ClienIDMode设置为Static;如果使用客户端ID很频繁,可将整个页面的ClientIDMode设置为Static,将重复控件的ClienIDMode设置为Predictable,并使用ClientIDRowSuffix属性。