1.动态编译
当一个ASP.NET Page被创建时,实际上创建的是一个.net类, 一个System.Web.UI.Page的实例. 页面的所有内容,包括HTML代码和Script代码,都被编译进这个.net类中.
当 有一个Request请求这个页面时,ASP.NET Framework检查被请求页面的相应的类是否存在,如果不存在则把页面编译成.net类,并且把编译了的类(assembly)存放到 Temporary Asp.Net Files这个目录中.这个文件夹一般位于
:\WINDOWS\Microsoft.NET\Framework\[version]\Temporary ASP.NET Files
当有新的请求到来时,编译过程将不在需要,先前编译好的类直接执行,并把结果返回给浏览器.
2.控件树
Asp.Net Page可以理解为是一个.Net类的源代码, 除此之外,也可以把Asp.Net Page理解为是一个控件包( a bag of controls).因为有点控件本身可能含有控件,因此更确切点一点,可以把Asp.Net Page理解为一个控件树.
例如:
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
3 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4<html xmlns="http://www.w3.org/1999/xhtml" >
5<head id="Head1" runat="server">
6 <title>Show Control Tree</title>
7</head>
8<body>
9 <form id="form1" runat="server">
10 <div>
11
12 <asp:DropDownList
13 id="DropDownList1"
14 Runat="server">
15 <asp:ListItem Text="Oranges" />
16 <asp:ListItem Text="Apples" />
17 </asp:DropDownList>
18
19 <asp:Button
20 id="Button1"
21 Text="Submit"
22 Runat="server" />
23
24 </div>
25 </form>
26</body>
27</html>
28
这样一个Asp.Net Page, 它的控件树结构如下代码所示:
ctl02 System.Web.UI.LiteralControl
ctl00 System.Web.UI.HtmlControls.HtmlHead
ctl01 System.Web.UI.HtmlControls.HtmlTitle
ctl03 System.Web.UI.LiteralControl
form1 System.Web.UI.HtmlControls.HtmlForm
ctl04 System.Web.UI.LiteralControl
DropDownList1 System.Web.UI.WebControls.DropDownList
ctl05 System.Web.UI.LiteralControl
Button1 System.Web.UI.WebControls.Button
ctl06 System.Web.UI.LiteralControl
ctl07
Asp.Net Page中包含的所有内容都被包含进一个.Net类中, 甚至包括HTML和纯文本内容.
3.Code-Behind Pages
Asp.Net Framework允许你创建两种类型的Asp.Net Pages, 单文件Pages和双文件Pages.这两种类型到底怎么样就不再赘述.稍微来看一下code-behind是如何工作的.
在Asp.Net 1.1中,Asp.Net Framework会为表现层页面(.aspx)和code-behind文件(.cs)产生两个单独的类,这两个类之间通过继承相关联,其中表现层页面类继承code-behind类.
由于继承是一个单向的关系,因此这种方法很脆弱.所有在表现层页面中声明的控件也必须同样在code-behind文件中声明,而且属性必须也相同.否则,控件触发的事件就可能不会被code-behind文件所捕获而加以处理.
在Asp.Net 2.0中,引入了一种新的机制:Partial Class.它允许把一个类的定义分散到不同的文件中.因此你就不需要在表现层页面和code-behind文件中同时声明,两者中任何的一个声明都可以在另一个中直接使用.
5.处理页面事件
当你请求一个页面时,页面触发事件的顺序如下:
-
PreInit
-
Init
-
InitComplete
-
PreLoad
-
Load
-
LoadComplete
-
PreRender
-
PreRenderComplete
-
SaveStateComplete
-
Unload