最新技术: ASP.NET 页的客户端
来源:百度文库 编辑:神马文学网 时间:2024/04/19 08:34:09
目录
分析 ASPX 代码
分析 HTML 客户端代码
视图状态字段
回发机制
分析类代码
软件行业的一个趋势是将许多编写代码的工作量转移到基本平台的基础结构。众多开发平台只是要求开发人员使用相对宽松的语法,在较高级别上对所需的信息进行描述,而不是按照一组严格的语法规则进行逐字节的硬编码。现在,开发人员经常使用 XML 语言来描述所需的结果,通过编译器或运行时引擎对内容进行分析,并将其处理成传统的可执行代码。
例如,Windows® Presentation Foundation(.NET Framework 3.0 的支柱之一)使用 XAML 作为基于 XML 的呈现语言,以描述表单用户界面。Microsoft AJAX 库(以前代码名为 ASP.NET“Atlas”的系统的一部分)使用其 XML-Script 元语言将相同原则应用于富文本网页(尽管从技术上看,XML-Script 不属于其核心发布内容,而是作为非官方示例技术进行共享)。XML-Script 是声明性布局语言,它将 HTML 元素和脚本组合在一起,形成虚拟的客户端控件。最终,XML-Script 为客户端页面引入了逻辑处理和功能。
使用声明性语言创作网页和表单有几个优点。通过采用此方式,服务器端组件可以更方便地生成页面和表单,而不必生成实际的 Visual Basic®、C# 或 JavaScript 代码。此外,对于诸如 Visual Studio® 这样的创作工具,声明性标记就其本质而言更容易进行设计。从体系结构角度来看,采用声明标记的方式,所指定的是页面元素的行为,而不是这些元素如何实现这类行为。这样,就可以创建更多的抽象层。
第一个利用这种模型的具体编程环境是 ASP.NET(从版本 1.0 开始)。正如大多数 Web 开发人员现在所知的,ASP.NET 页通常是在一、两个文件中进行编写的:一个 .aspx 标记文件和一个可选的代码隐藏文件。代码隐藏文件中包含了以任何受支持的编程语言(通常是 Visual Basic 或 C#)所编写的类文件。.aspx 标记文件包含形成页面结构的 HTML 标记、ASP.NET 控制标记和文字(它还可以包含代码)。此文本将在运行时进行分析,并转换成页类。这样的页类,在与代码隐藏类和一些系统生成的代码组合之后,共同形成可执行代码,以处理任何提交的数据,并生成响应,然后将其发送回客户端。
虽然这个总体模型为绝大多数 ASP.NET 开发人员所知,但还是存在很多只有少部分开发人员有深入了解的“黑洞”。MSDN®、相关书籍和在线文章对页面机制的各个方面进行了解释,但仍然缺少对页面内部机制进行的全面而统一的介绍。如果看一看 ASP.NET 页的 HTML 源代码,就会发现很多您可能几乎不了解的隐藏字段和自动插入的 JavaScript 代码块。但是,正是在这些字段和代码块的支持下,网页才能正常工作。在本专栏中,我将分析 ASP.NET 页所生成的客户端源代码。我不单要讨论如视图状态这类大家熟悉的隐藏字段,而且还会涉及到一些少有人知的隐藏字段,例如,控件状态、事件验证、事件目标和参数,以及系统提供的脚本代码。
我在此处讨论的很多实现细节均是针对当前的 ASP.NET 版本而言的。这些细节在将来的版本中会有所更改(相对于过去的版本已有了更改),因此您不应当构建任何依赖于不成文细节的运行代码。
分析 ASPX 代码
图 1 显示了一个虽然很小但可以运行的 ASP.NET 页。尽管它非常简单,但这是一个很好示例,因为它包括真实环境中的 ASP.NET 页面的典型元素:输入域、可点击的回发元素以及只读元素。
.aspx 页包含三个服务器控件:用于捕获数据的文本框、用于启动回发操作的提交按钮、用于显示只读数据的标签。在 .aspx 文件顶部,Page 指令定义了单个页面的一些全局属性。让我们看一看 Page 指令的最常用属性,比如在图 1 中显示的那些属性。<%@ Page Language="C#"AutoEventWireup="true"CodeFile="Test.aspx.cs"Inherits="Test"%>
大多数 Page 指令属性对页标记(即,浏览器通过 HTTP 响应接收的 HTML 代码)的影响都有限。但是,大部分 Page 属性都会影响由系统在 .aspx 标记和代码隐藏类的顶部构建的动态生成页的代码。Language 属性指定在 Visual Studio 中创作代码隐藏类所使用的语言。系统将使用相同语言生成动态页类,以处理浏览器对 .aspx 资源的请求。CodeFile 属性指示存储代码隐藏类的源文件。Inherits 属性指示在代码文件中应当作为动态生成的页类的父类的代码隐藏类的名称。最后,AutoEventWireup 属性指示是否应当使用默认命名约定将处理代码映射到 Page 事件。如果将 AutoEventWireup 设置为 True,则可以在代码文件中添加 Page_Load 方法,以处理页面的 Load 事件,并且它将自动注册到 Page 的 Load 事件。隐式命名约定指示事件处理程序将采用 Page_XXX 格式,其中,XXX 可以是在 Page 类中定义的任何公共事件的名称。如果将 AutoEventWireup 设置为 false,则必须将 Page 类事件与它的处理程序进行显式绑定。您可以在专门设计的类构造函数中执行此操作:public partial class Test : System.Web.UI.Page{public Test(){this.Load += new EventHandler(Page_Load);}...}
Web 服务器收到对给定 .aspx 资源的 HTTP 请求时,它会将请求转发给 ASP.NET 工作进程。该进程中驻留有 CLR,在其内部创建了一个运行时环境来处理 ASP.NET 请求。ASP.NET HTTP 运行时环境的最终目标是处理请求,即获得将嵌入 HTTP 响应中的标记(HTML、WML、XHTML 以及应用程序应当返回的任何其他标记)。负责返回请求标记的是称为 HTTP 处理程序的特殊系统组件。
HTTP 处理程序是实现了 IHttpHandler 接口的类的实例。ASP.NET Framework 提供了少量预定义的 HTTP 处理程序,以处理特定情况,或者用作处理其他或更多特定请求的基类。System.Web.UI.Page 类是 ASP.NET 中的一个最复杂的内置 HTTP 处理程序。
每个 ASP.NET 请求都会映射到一个 HTTP 处理程序。假设客户端浏览器对一个名为 test.aspx 的页面发出请求。请求将传递给 ASP.NET,并由 HTTP 运行时进行处理。运行时通过页处理程序工厂确定由 HTTP 处理程序类来处理该请求。如果在 AppDomain 中尚未提供正确的处理程序,则会动态地创建该处理程序,并将其存储在 Web 服务器计算机的 ASP.NET 临时文件夹中。对于名为 test.aspx 的页,将以类的形式创建一个名为 ASP.text_aspx 的 HTTP 处理程序。
针对给定请求的 HTTP 处理程序类的动态创建过程对于每个页面只发生一次,即在应用程序运行期间内该页面第一次被请求时进行创建(尽管来说,使用批编译时,只要应用程序内有一个页面收到了第一次请求即可生成处理程序)。如果应用程序重新启动或 Web 服务器上的页面源文件发生了修改,则动态创建的程序集将无效并被替换。图 2 显示了从基础 Page 类直到处理用户请求的动态生成类等页类的层次结构。
图 2 Page 类的层次结构 (单击该图像获得较小视图)
图 2 Page 类的层次结构 (单击该图像获得较大视图)
ASP.NET 运行时通过分析相应 .aspx 文件的源代码来创建动态页类的 Visual Basic 或 C# 源代码。每个包含 runat="server" 的标记都将映射到一个服务器控件实例。任何其他文本则映射到文字控件,并按原样一字不差地发出。Register 指令(如果有)帮助解析指向非标准控件的标记。返回到客户端浏览器的标记是通过将页面中每个服务器控件所发出的标记组合到一起而形成的。请注意,每个页通常都会发出标记,而且通常是 HTML 标记。但是,这不是必需的,并且 ASP.NET 页可以输出它需要的任何数据。
分析 HTML 客户端代码
图 3 显示了图 1 中的示例页的 HTML 输出。在该 HTML 中,服务器端 .aspx 页中看不到任何有 Page 指令的迹象。而是逐字复制 !DOCTYPE 指令。图 1 中的第一个 runat="server" 块是
分析 ASPX 代码
分析 HTML 客户端代码
视图状态字段
回发机制
分析类代码
软件行业的一个趋势是将许多编写代码的工作量转移到基本平台的基础结构。众多开发平台只是要求开发人员使用相对宽松的语法,在较高级别上对所需的信息进行描述,而不是按照一组严格的语法规则进行逐字节的硬编码。现在,开发人员经常使用 XML 语言来描述所需的结果,通过编译器或运行时引擎对内容进行分析,并将其处理成传统的可执行代码。
例如,Windows® Presentation Foundation(.NET Framework 3.0 的支柱之一)使用 XAML 作为基于 XML 的呈现语言,以描述表单用户界面。Microsoft AJAX 库(以前代码名为 ASP.NET“Atlas”的系统的一部分)使用其 XML-Script 元语言将相同原则应用于富文本网页(尽管从技术上看,XML-Script 不属于其核心发布内容,而是作为非官方示例技术进行共享)。XML-Script 是声明性布局语言,它将 HTML 元素和脚本组合在一起,形成虚拟的客户端控件。最终,XML-Script 为客户端页面引入了逻辑处理和功能。
使用声明性语言创作网页和表单有几个优点。通过采用此方式,服务器端组件可以更方便地生成页面和表单,而不必生成实际的 Visual Basic®、C# 或 JavaScript 代码。此外,对于诸如 Visual Studio® 这样的创作工具,声明性标记就其本质而言更容易进行设计。从体系结构角度来看,采用声明标记的方式,所指定的是页面元素的行为,而不是这些元素如何实现这类行为。这样,就可以创建更多的抽象层。
第一个利用这种模型的具体编程环境是 ASP.NET(从版本 1.0 开始)。正如大多数 Web 开发人员现在所知的,ASP.NET 页通常是在一、两个文件中进行编写的:一个 .aspx 标记文件和一个可选的代码隐藏文件。代码隐藏文件中包含了以任何受支持的编程语言(通常是 Visual Basic 或 C#)所编写的类文件。.aspx 标记文件包含形成页面结构的 HTML 标记、ASP.NET 控制标记和文字(它还可以包含代码)。此文本将在运行时进行分析,并转换成页类。这样的页类,在与代码隐藏类和一些系统生成的代码组合之后,共同形成可执行代码,以处理任何提交的数据,并生成响应,然后将其发送回客户端。
虽然这个总体模型为绝大多数 ASP.NET 开发人员所知,但还是存在很多只有少部分开发人员有深入了解的“黑洞”。MSDN®、相关书籍和在线文章对页面机制的各个方面进行了解释,但仍然缺少对页面内部机制进行的全面而统一的介绍。如果看一看 ASP.NET 页的 HTML 源代码,就会发现很多您可能几乎不了解的隐藏字段和自动插入的 JavaScript 代码块。但是,正是在这些字段和代码块的支持下,网页才能正常工作。在本专栏中,我将分析 ASP.NET 页所生成的客户端源代码。我不单要讨论如视图状态这类大家熟悉的隐藏字段,而且还会涉及到一些少有人知的隐藏字段,例如,控件状态、事件验证、事件目标和参数,以及系统提供的脚本代码。
我在此处讨论的很多实现细节均是针对当前的 ASP.NET 版本而言的。这些细节在将来的版本中会有所更改(相对于过去的版本已有了更改),因此您不应当构建任何依赖于不成文细节的运行代码。
分析 ASPX 代码
图 1 显示了一个虽然很小但可以运行的 ASP.NET 页。尽管它非常简单,但这是一个很好示例,因为它包括真实环境中的 ASP.NET 页面的典型元素:输入域、可点击的回发元素以及只读元素。
.aspx 页包含三个服务器控件:用于捕获数据的文本框、用于启动回发操作的提交按钮、用于显示只读数据的标签。在 .aspx 文件顶部,Page 指令定义了单个页面的一些全局属性。让我们看一看 Page 指令的最常用属性,比如在图 1 中显示的那些属性。<%@ Page Language="C#"AutoEventWireup="true"CodeFile="Test.aspx.cs"Inherits="Test"%>
大多数 Page 指令属性对页标记(即,浏览器通过 HTTP 响应接收的 HTML 代码)的影响都有限。但是,大部分 Page 属性都会影响由系统在 .aspx 标记和代码隐藏类的顶部构建的动态生成页的代码。Language 属性指定在 Visual Studio 中创作代码隐藏类所使用的语言。系统将使用相同语言生成动态页类,以处理浏览器对 .aspx 资源的请求。CodeFile 属性指示存储代码隐藏类的源文件。Inherits 属性指示在代码文件中应当作为动态生成的页类的父类的代码隐藏类的名称。最后,AutoEventWireup 属性指示是否应当使用默认命名约定将处理代码映射到 Page 事件。如果将 AutoEventWireup 设置为 True,则可以在代码文件中添加 Page_Load 方法,以处理页面的 Load 事件,并且它将自动注册到 Page 的 Load 事件。隐式命名约定指示事件处理程序将采用 Page_XXX 格式,其中,XXX 可以是在 Page 类中定义的任何公共事件的名称。如果将 AutoEventWireup 设置为 false,则必须将 Page 类事件与它的处理程序进行显式绑定。您可以在专门设计的类构造函数中执行此操作:public partial class Test : System.Web.UI.Page{public Test(){this.Load += new EventHandler(Page_Load);}...}
Web 服务器收到对给定 .aspx 资源的 HTTP 请求时,它会将请求转发给 ASP.NET 工作进程。该进程中驻留有 CLR,在其内部创建了一个运行时环境来处理 ASP.NET 请求。ASP.NET HTTP 运行时环境的最终目标是处理请求,即获得将嵌入 HTTP 响应中的标记(HTML、WML、XHTML 以及应用程序应当返回的任何其他标记)。负责返回请求标记的是称为 HTTP 处理程序的特殊系统组件。
HTTP 处理程序是实现了 IHttpHandler 接口的类的实例。ASP.NET Framework 提供了少量预定义的 HTTP 处理程序,以处理特定情况,或者用作处理其他或更多特定请求的基类。System.Web.UI.Page 类是 ASP.NET 中的一个最复杂的内置 HTTP 处理程序。
每个 ASP.NET 请求都会映射到一个 HTTP 处理程序。假设客户端浏览器对一个名为 test.aspx 的页面发出请求。请求将传递给 ASP.NET,并由 HTTP 运行时进行处理。运行时通过页处理程序工厂确定由 HTTP 处理程序类来处理该请求。如果在 AppDomain 中尚未提供正确的处理程序,则会动态地创建该处理程序,并将其存储在 Web 服务器计算机的 ASP.NET 临时文件夹中。对于名为 test.aspx 的页,将以类的形式创建一个名为 ASP.text_aspx 的 HTTP 处理程序。
针对给定请求的 HTTP 处理程序类的动态创建过程对于每个页面只发生一次,即在应用程序运行期间内该页面第一次被请求时进行创建(尽管来说,使用批编译时,只要应用程序内有一个页面收到了第一次请求即可生成处理程序)。如果应用程序重新启动或 Web 服务器上的页面源文件发生了修改,则动态创建的程序集将无效并被替换。图 2 显示了从基础 Page 类直到处理用户请求的动态生成类等页类的层次结构。
图 2 Page 类的层次结构 (单击该图像获得较小视图)
图 2 Page 类的层次结构 (单击该图像获得较大视图)
ASP.NET 运行时通过分析相应 .aspx 文件的源代码来创建动态页类的 Visual Basic 或 C# 源代码。每个包含 runat="server" 的标记都将映射到一个服务器控件实例。任何其他文本则映射到文字控件,并按原样一字不差地发出。Register 指令(如果有)帮助解析指向非标准控件的标记。返回到客户端浏览器的标记是通过将页面中每个服务器控件所发出的标记组合到一起而形成的。请注意,每个页通常都会发出标记,而且通常是 HTML 标记。但是,这不是必需的,并且 ASP.NET 页可以输出它需要的任何数据。
分析 HTML 客户端代码
图 3 显示了图 1 中的示例页的 HTML 输出。在该 HTML 中,服务器端 .aspx 页中看不到任何有 Page 指令的迹象。而是逐字复制 !DOCTYPE 指令。图 1 中的第一个 runat="server" 块是
最新技术: ASP.NET 页的客户端
最新技术: ASP.NET 页的客户端sss
最新技术: ASP.NET 页的客户端1
ASP.NET技术的学习顺序
ASP.NET技术网站
javascript和ActiveX的交互问题 .NET技术 / ASP.NET
asp.net页面缓存技术
关于初学ASP.NET技术的学习顺序问题
领先技术-ASP.NET 页面的服务器端 by Dino Esposito
关于初学ASP.NET技术的学习顺序问题
ASP.NET技术获取IP与MAC地址的方法
使用 ASP.NET Atlas PageNavigator控件实现客户端分页导航
Win2003+IIS6+ASP+NET+PHP+PERL+MSSQL+MYSQL最新服务器安全设置技术实例
asp.net的生命周期
动网新闻的分类效果--简短的代码 .NET技术 / ASP.NET
动网新闻的分类效果--简短的代码 .NET技术 / ASP.NET
几个微软经典开源的项目源代码 - .NET技术 / ASP.NET
2010 我的求职经历(完结篇) - .NET技术 / ASP.NET
精通ASP.NET中弹出窗口技术
精通ASP.NET中弹出窗口技术
ASP.NET 2.0 本地化技术之研究
asp与asp.net的区别
.NET求职技术总结 - Meazza-asp.net - 博客园
JAVA客户端通过SOAP与NET的