[转载]【认识aspx】页面处理程序【页面生成关系】【页面继承关系】 – DebugLZQ – 博客园.
对于 Web 开发来说,最重要的就是生成 HTML 页面,除了用流的方式一个字符一个字符地输出,有没有简单的方式来创建一个处理程序生成网页呢?
有!就是什么代码也不写的方式。当然,是我们自己不写,由程序生成。
对于网站开发来说,最常用的功能就是生成 HTML 网页,虽然通过处理程序再结合文本输出流,从理论上就可以生成任何网页,但是开发效率显然不容乐观。
为了从根本上解决这个主要的开发问题,ASP.NET 使用模板的方式来生成一个处理程序。模板的扩展名为 aspx ,通过一个内置的处理程序工厂 PageHandlerFactory 将 aspx 形式的模板编译生成处理程序代码,然后,将这个处理程序返回给 HttpApplication 完成请求的处理。aspx 形式的模板文件可以直接通过文本编辑器进行编辑,甚至可以通过 DreamWeaver 之类的网页设计软件进行排版,极大地提高了网站开发的效率,带来了网站开发技术的革命性升级。
在 ASP.NET 的系统配置文件中,已经进行了如下的配置,可以看到,对于扩展名为 aspx 的请求,将由 PageHandlerFactory 这个处理程序工厂进行处理,代码如下:
<add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="True" />
这个类定义在命名空间 System.Web.UI 下,具体的定义如下:
public class PageHandlerFactory : IHttpHandlerFactory
aspx 模板文件与 Page 类和生成类之间的关系如图所示:
需要注意的是, aspx 模板的解析和代码生成仅仅出现在第一次处理的时候,以后的请求将直接使用已经编译生成的程序集,所以,这个处理过程并不会降低网站的处理速度。
对于一个 aspx 模板文件来说,一般情况下将对应存在一个同名的 cs 后台代码文件,其中定义了一个与页面同名的类,通过代码文件可以看到这个类派生自 Page 基的类。
PageHandlerFactory 通过 aspx 文件将生成两个类,一个为与后台代码中定义的类同名的部分类,这个部分类将与后台代码中定义的类在编译的时候合并为一个派生自 Page 的页面派生类。但是,在 ASP.NET 中,创建实际页面对象的类并不是这个类,而是生成的第二个类,一般情况下,这个类的名字为页面的名字后面加上下划线和 aspx。这才是实际创建页面对象的页面类。
例如,我们有一个页面文件 MyPage.aspx,那么,应该存在一个对应的后台代码文件 MyPage.aspx.cs 或者 MyPage.aspx.vb,其中定义了 MyPage 这个 Page 的派生类。
通过 PageHandlerFactory,MyPage.aspx 将生成两个类,部分类 MyPage 和 MyPage_aspx,其中,后台代码文件中的 MyPage 将和生成的部分类 MyPage 在编译的时候合并为一个完整的 MyPage 类定义,而 MyPage_aspx 则是从 MyPage 派生的一个页面类,用来创建实际的页面对象实例。它们之间的关系如下图所示:
由于页面处理程序是通过模板生成的,所以,大多数情况下,我们只要创建好这个 aspx 的模板就可以了,HttpApplication 会通过 PageHandlerFactory 创建这个生成的处理程序,然后使用这个处理程序完成服务器的处理任务。
现在,如果我们需要通过处理程序生成一个网页的话,只需要设计一个 aspx 的页面即可。
在一些特殊的情况下,我们需要创建一些生成 HTML 输出的程序,但是这些程序并不希望能够被客户端直接请求,那么,可以借助 PageParser 或者 BuildManager 通过 aspx 格式的模板来创建一个自定义的处理程序完成处理任务。