本节更详细地讲解了ASP.NET页面。你会学到动态编译跟引用(code-behind)文件。我们也会讨论页面类支持的事件。

理解动态编译

说来也奇怪,创建一个ASP.NET页面时,你实际上是在给一个.NET类创建源代码。你在创建一个System.Web.UI.Page类的新实例。一个asp.net页面的所有内容包括所有script及HTML内容在内,都被编译成了一个.NET类.

在请求一个asp.net页面时,asp.net Framework会检查这个页面相对的一个.net类.如果不存在对应的类,Framework会自动把页面编译为新的类并存储到ASP.NET临时文件夹里.这个文件夹位于:

/WINDOWS/Microsoft.NET/Framework/[version]/Temporary ASP.NET Files

下次有人请求相同页面时,页面就不会重新编译.编译好的类会执行并把结果返回给浏览器.

就算你拔掉你的web服务器,远远地弄到婆罗洲3年,再重新打开服务器,有人请求相同的这个页面时,页面还是不需要重新编译.编译好的类会一直保存在这个临时文件夹直到程序被修改了.

类被添加到这个文件夹后,一个文件从属关系就在类跟原始ASP.NET页面之间产生了.如果页面有了任何的修改,相应的.net类就被自动删除了.下次请求这个页面时,Framework会自动把修改后的页面源文件编译为新的.net类.

这个过程就叫做动态编译.动态编译使asp.net程序可以支持几千个不同用户的同时访问.与asp一般页面不同,在被请求时asp.net页面不需要解析跟编译.asp.net页面只有在程序被修改时才会编译.

注释

你可以使用aspnet_compiler.exe命令行工具来预编译一个完整的asp.net程序.如果程序被预编译了,用户在就不会碰到第一次请求页面时的编译延迟.

你可以通过CompilationMode属性来禁用单个页面,同个文件夹里的页面或者整个网站的动态编译.在<%@ Page %>命令里用了CompilationMode属性后,单个页面就可以禁用动态编译.在web配置文件中用了CompilationMode属性后,整个文件夹或者程序都禁用了动态编译.

在网站中有几千个页面的或你不想每个页面都载入一个assembly到内存时禁用编译就非常有用.CompilationMode被设置为Never值时,页面就不会再编译且页面不会有一个assembly产生.页面是实时解释的.

含有服务器端代码的页面无法禁用编译.特别指出的是,不编译的页面不能有服务器端的<script>...</script>代码块.此外,不编译的页面可以含有asp.net空间跟数据绑定(databinding)表达式.

如果还是有点晕的话,下面列出了FirstPage.aspx的源代码(稍微去掉了一些代码).这个文件是允许调试程序后从上面提到的临时文件夹里拷出的.

Listing 1.12. FirstPage.aspx Source

Option Strict Off
Option Explicit On
Imports Microsoft.VisualBasic
Imports System
Imports System.Collections
Imports System.Collections.Specialized
Imports System.Configuration
Imports System.Text
Imports System.Text.RegularExpressions
Imports System.Web
Imports System.Web.Caching
Imports System.Web.Profile
Imports System.Web.Security
Imports System.Web.SessionState
Imports System.Web.UI
Imports System.Web.UI.HtmlControls
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts
Namespace ASP

    <System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()>  _
    Public Class firstpage_aspx
        Inherits Global.System.Web.UI.Page
        Implements System.Web.SessionState.IRequiresSessionState, System.Web.
IHttpHandler
 
        Protected WithEvents lblServerTime As Global.System.Web.UI.WebControls.
Label
        Protected WithEvents form1 As Global.System.Web.UI.HtmlControls.HtmlForm
        Private Shared __initialized As Boolean
        Private Shared __fileDependencies As Object
 
    Sub Page_Load()
             lblServerTime.Text = DateTime.Now.ToString()
        End Sub
 
        Public Sub New()
            MyBase.New
            Dim dependencies() As String
            CType(Me,System.Web.UI.Page).AppRelativeVirtualPath = "~/FirstPage.
aspx"
            If (Global.ASP.firstpage_aspx.__initialized = false) Then
                dependencies = New String(0) {}
                dependencies(0) = "~/FirstPage.aspx"
                Global.ASP.firstpage_aspx.__fileDependencies =
Me.GetWrappedFileDependencies(dependencies)
                Global.ASP.firstpage_aspx.__initialized = true
            End If
            Me.Server.ScriptTimeout = 30000000
        End Sub
 
       Protected ReadOnly Property Profile() As System.Web.Profile.DefaultProfile
            Get
               Return CType(Me.Context.Profile,System.Web.Profile.DefaultProfile)
            End Get
        End Property
 
        Protected ReadOnly Property ApplicationInstance() As System.Web.
HttpApplication
            Get
                Return CType(Me.Context.ApplicationInstance,System.
Web.HttpApplication)
            End Get
        End Property
 
        Private Function __BuildControllblServerTime() As Global.System.Web.UI.
WebControls.Label
            Dim __ctrl As Global.System.Web.UI.WebControls.Label
            __ctrl = New Global.System.Web.UI.WebControls.Label
            Me.lblServerTime = __ctrl
            __ctrl.ApplyStyleSheetSkin(Me)
            __ctrl.ID = "lblServerTime"
            Return __ctrl
        End Function
 
        Private Function __BuildControlform1() As
Global.System.Web.UI.HtmlControls.HtmlForm
            Dim __ctrl As Global.System.Web.UI.HtmlControls.HtmlForm
            __ctrl = New Global.System.Web.UI.HtmlControls.HtmlForm
            Me.form1 = __ctrl
            __ctrl.ID = "form1"
            Dim __parser As System.Web.UI.IParserAccessor =
CType(__ctrl,System.Web.UI.IParserAccessor)
            __parser.AddParsedSubObject(New System.Web.UI.LiteralControl(""&
Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)
&"    <div>"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.
VisualBasic.ChrW(10)&"    "&Global.Microsoft.VisualBasic.ChrW(13)&Global.
Microsoft.VisualBasic.ChrW(10)&"    Welcome to ASP.NET 2.0! The current date
and time is:"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.
VisualBasic.ChrW(10)&"   "& _
                        " "&Global.Microsoft.VisualBasic.ChrW(13)&
Global.Microsoft.VisualBasic.ChrW(10)&"    "))
            Dim __ctrl1 As Global.System.Web.UI.WebControls.Label
            __ctrl1 = Me.__BuildControllblServerTime
            __parser.AddParsedSubObject(__ctrl1)
            __parser.AddParsedSubObject(New System.Web.UI.LiteralControl(""
&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&
"    "&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&
"    </div>"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.
ChrW(10)&"    "))
            Return __ctrl
        End Function
 
        Private Sub __BuildControlTree(ByVal __ctrl As firstpage_aspx)
            Me.InitializeCulture
            Dim __parser As System.Web.UI.IParserAccessor = CType(__ctrl,
System.Web.UI.IParserAccessor)
            __parser.AddParsedSubObject(New System.Web.UI.LiteralControl(""&
Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.
ChrW(10)&"<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN""
 ""http://www.w3.o"& _
                        "rg/TR/xhtml1/DTD/xhtml1-
transitional.dtd"">"&Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.
VisualBasic.ChrW(10)))
            __parser.AddParsedSubObject(New
System.Web.UI.LiteralControl(""&Global.Microsoft.VisualBasic.
ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"<html xmlns=
""http://www.w3.org/1999/xhtml""
 >"&Global.Microsoft.VisualBasic.ChrW(13)&
Global.Microsoft.VisualBasic.ChrW(10)&"<head>"&Global.Microsoft.VisualBasic.
ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&"    <title>First Page</ti"& _
                        "tle>"&Global.Microsoft.VisualBasic.ChrW(13)&
Global.Microsoft.VisualBasic.ChrW(10)&"</head>"&
Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.VisualBasic.
ChrW(10)&"<body>"&Global.Microsoft.VisualBasic.ChrW(13)&Global.
Microsoft.VisualBasic.ChrW(10)&"    "))
            Dim __ctrl1 As Global.System.Web.UI.HtmlControls.HtmlForm
            __ctrl1 = Me.__BuildControlform1
            __parser.AddParsedSubObject(__ctrl1)
            __parser.AddParsedSubObject(New System.Web.UI.LiteralControl(""&
Global.Microsoft.VisualBasic.ChrW(13)&Global.Microsoft.
VisualBasic.ChrW(10)&"</body>"&Global.Microsoft.VisualBasic.
ChrW(13)&Global.Microsoft.VisualBasic.ChrW(10)&
"</html>"&Global.Microsoft.VisualBasic.ChrW(13)&
Global.Microsoft.VisualBasic.ChrW(10)))
        End Sub
 
        Protected Overrides Sub FrameworkInitialize()
            MyBase.FrameworkInitialize
            Me.__BuildControlTree(Me)
            Me.AddWrappedFileDependencies(Global.ASP.firstpage_aspx._
_fileDependencies)
            Me.Request.ValidateInput
        End Sub
 
        Public Overrides Function GetTypeHashCode() As Integer
            Return 579569163
        End Function
 
      Public Overrides Sub ProcessRequest(ByVal context As System.Web.HttpContext)
            MyBase.ProcessRequest(context)
        End Sub
    End Class
End Namespace
Listing 1.12中的类继承于System.Web.UI.Page.页面显示时ProcessRequest()方法被asp.net Framework调用.这个方法创建了页面的控件树,下一部分将以控件树为标题.
 
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐