簡介
即將推出的新版 Microsoft® ASP.NET 介紹了大量新功能和改進功能,它的代號為 ASP.NET Whidbey,是根據新版 Microsoft® Visual Studio® .NET 的代號命名的。其中的某些功能利用了基礎 Microsoft® .NET Framework 版本(ASP.NET Whidbey 就是基於該版本構建的)中的新功能。在這些功能當中,最有用的功能集之一與代碼編譯有關。
本文介紹 ASP.NET Whidbey 編譯模型的主要更改、這些更改對編寫 ASP.NET 應用程式的影響,以及如何利用這些更改。
改進的功能和新的編譯功能可以分為以下四個基本方面:
對模組化代碼模型的改進。
新的 Code 目錄。
新增的對先行編譯 ASP.NET 應用程式的支援。
Microsoft® IntelliSense® 增強功能。
新的模組化代碼模型
預設情況下,使用 Visual Studio .NET 2002 或 2003 開發的網站使用一種稱為“模組化代碼”的功能將可視元素(HTML 標籤、控制項等)從與 UI 相關的編程邏輯中分離開來。當開發人員建立一個新 Web Form(例如 foo.aspx)時,Visual Studio 會自動建立一個相關的 Codebehind 類檔案,該檔案名稱的前一部分與 Web Form相同,後面是 .vb 或 .cs(取決於項目使用的語言)。類檔案將通過 @ Page 指令的 Codebehind 和 Inherits 屬性與 Web Form相關聯。
類檔案包含事件處理代碼(包括用於將事件處理常式綁定到相應事件的代碼),以及每個控制項(通過 Visual Studio Web Form編輯器添加到 .aspx 檔案中)的分離聲明。編譯(產生)Web 應用程式項目後,其中的所有 Codebehind 類都將編譯到一個 .NET 程式集中,該程式集將放置到 Web 應用程式的 \bin 目錄中。Web Form頁本身會在運行時動態進行編譯,並且每個 Web Form均繼承自與其相關的 Codebehind 類。有關 Visual Studio .NET 2003 和 ASP.NET 1.1 中的模組化代碼模型的詳細資料,請參閱 MSDN Library 文章 Web Forms Code Model(英文)。
無需在 Codebehind 類中編寫控制項聲明和事件綁定代碼(在控制項聲明中通過聲明的方式綁定事件)。
允許運行時同時對 Web Form頁和 Codebehind 類進行動態編譯,無需再為細微的更改而重建整個項目。
減少共用開發中的檔案爭用現象。
對於使用模組化代碼檔案的開發人員以及喜歡單檔案開發(所有代碼和標記均包含在 .aspx 檔案中)的開發人員,均可獲得相同的 IDE 體驗。
下面給出了模組化代碼模型更改前後的不同視圖。以下代碼只是在使用模組化代碼添加新的 Web Form(在 Visual Studio .NET Whidbey 中稱之為具有代碼分隔的 Web Form)時,由 Visual Studio 建立的預設代碼:
'此調用是 Web Form設計器所必需的。
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
End Sub
'注意:以下預留位置聲明是
'Web Form設計器所必需的。
'請勿刪除或改變其位置。
Private designerPlaceholderDeclaration As System.Object
Private Sub Page_Init(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN:此方法調用是 Web Form設計器所必需的。
'請勿使用代碼編輯器修改它。
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
'此處放置用於初始化該頁面的使用者代碼
End Sub
為了更好地說明上述操作的實現過程,讓我們先來看幾個樣本。在第一個樣本中,我們將看到如何建立一個簡單的業務組件,以及如何從 Web Form頁對其進行訪問。
利息計算機
首先,我們開啟 Visual Studio .NET Whidbey,建立一個名為 Compilation 的新 Web 網站。建立 Web 網站之後,IDE 應與圖 1 類似。
圖 1:Visual Studio .NET Whidbey Web 網站
然後,我們將 \Code 檔案夾添加到該 Web 網站,添加方法為右擊該項目,然後選擇 New Folder(建立檔案夾)。此檔案夾必須命名為 Code,但名稱不區分大小寫。添加檔案夾後,我們可以添加一個新的類檔案:右擊 \Code 檔案夾,單擊 Add New Item...(添加新項...),然後在 Add New Item(添加新項)對話方塊的 Templates(模板)窗格中選擇 Class(類)項。將類命名為 CalculateInterest.vb。然後添加用於計算利息的代碼(將其添加到 Class 和 End Class 語句之間):
Public Function CalcBalance(ByVal Prncpl As Integer, _
ByVal Rate As Double, _
ByVal Years As Integer, _
ByVal Period As Integer) As String
Dim BaseNum As Double = (1 + Rate / Period)
CalcBalance = _
Format(Prncpl * System.Math.Pow(BaseNum, _
(Years * Period)), "#,###,##0.00").ToString
End Function
<script runat="server">
Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs)
Dim Calc As New CalculateInterest
Label6.Text = "$" & _
Calc.CalcBalance(Convert.ToInt32(TextBox1.Text), _
(Convert.ToInt32(TextBox2.Text) / 100), _
Convert.ToInt32(TextBox3.Text), _
Convert.ToInt16(Dropdownlist1.SelectedValue))
Label6.Visible = True
End Sub
</script>
為了說明現在使用建立的資源檔是多麼簡單,我們將一個 Web Form添加到項目中,方法如下:右擊 Web 網站節點,然後單擊 Add New Item....(添加新項...)。在 Add New Item(添加新項)對話方塊中,選擇 Web Form,將頁面命名為 ColorPicker.aspx,然後單擊 Open(開啟)。修改此頁面,使其與以下列表匹配。
ColorPicker.aspx:
<%@ page UICulture="en-GB" language="VB" %>
<script runat="server">
Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Label1.Text = Resources.strings.txtColorPrompt
End Sub
Sub Submit_Click(ByVal sender As Object, _
ByVal e As System.EventArgs)
Label1.ForeColor = _
System.Drawing.Color.FromName(Dropdownlist1.SelectedValue)
Select Case Dropdownlist1.SelectedValue
Case "紅色"
Label1.Text = Resources.strings.txtColorResponseRed
Case "綠色"
Label1.Text = Resources.strings.txtColorResponseGreen
Case "藍色"
Label1.Text = Resources.strings.txtColorResponseBlue
End Select
Dropdownlist1.Visible = False
Submit.Visible = False
End Sub
</script>
請注意,在 ASP.NET Whidbey 中訪問資源檔只需要一行代碼。因為將資源檔放到 Code 目錄中後,即可自動嵌入和引用該資源檔,所以不需要引用任何命名空間或程式集,也不需要為訪問資源字串建立對象。而且 ASP.NET 還可以確定應該使用哪個資源檔(基於使用者瀏覽器的設定),因此我們不需要在運行時對此進行判斷並作出相應的響應。ASP.NET 可以協助我們完成這一切。
先行編譯支援
ASP.NET Web Form的優勢之一就是增加動態編譯後,您可以很輕鬆地更改 .aspx 頁,儲存更改時頁面將動態更新,而不需要重新編譯(只要不使用模組化代碼)。但動態編譯並不是對每個應用程式都適合,而且第一次訪問某個應用程式時,動態編譯會導致瀏覽器的初始效能降低。另外,很多時候您可能希望部署一個沒有原始碼的應用程式。
如果您遇到上述情況,您會更高興地瞭解到 ASP.NET Whidbey 具有支援先行編譯 Web 網站的功能。ASP.NET Whidbey 支援兩種先行編譯模式:在位先行編譯和部署先行編譯。
在位先行編譯
在位先行編譯使您可以對 Web 網站中的所有頁面進行手動批編譯。這也是使用者在您的應用程式中首次單擊某個頁面後發生的操作(前文提到的後一種情況除外),使用者只需坐下來等待批編譯完成。
在位先行編譯也很容易實現,只需瀏覽到 Web 網站的根目錄,添加特定的處理常式名稱 precompile.axd(熟悉 ASP.NET 跟蹤功能的使用者會發現該名稱與 trace.axd 處理常式的名稱類似):
http://localhost/mywebsitename/precompile.axd
其中 mywebsitename 是您 Web 網站的名稱。先行編譯網站之後,對網站內頁面的請求也應隨即完成,而不會有任何編譯滯後。
部署先行編譯
第二種先行編譯模式使您可以建立整個 Web 網站的可執行版本,部署這種版本不需要任何原始碼(包括 HTML 和其他靜態檔案)。因此,部署先行編譯可以防止別人隨意訪問由代碼錶示的智慧財產權資訊。產生的程式集和 Stub 檔案集可以通過 XCOPY、FTP、Windows 資源管理員等部署到生產伺服器上。
為了先行編譯網站以進行部署,ASP.NET Whidbey 提供了一個名為 aspnet_compiler.exe 的命令列公用程式。要在檔案系統 Web 網站上調用 ASP.NET 先行編譯器,需要開啟一個命令視窗,瀏覽到 .NET Framework 的安裝位置(<Windows>\Microsoft.NET\Framework\<版本>),然後輸入以下命令:
其中 <websitename> 為 Web 網站的名稱(即在瀏覽器中輸入的名稱),<source> 和 <destination> 為兩個檔案系統路徑,分別指向要編譯網站的位置以及編譯後的版本應輸出至的位置。以我們的 Web 網站為例,輸入的命令如下所示(請注意下面是一條命令):
aspnet_compiler /v /Compilation
-p c:\WebSites\Compilation c:\WebSites\Compilation_Compiled
如果要查看 ASP.NET 先行編譯器的所有可用選項,只需輸入以下命令:
aspnet_compiler /?
請注意,某些命令列選項要求 Web 網站必須為有效 Microsoft® Internet 資訊服務 (IIS) 應用程式才能正常工作。
如果在 Microsoft® Windows 資源管理員中瀏覽至目標目錄,您會看到先行編譯 Web 網站後將產生一個包含 bin 目錄的網站,bin 目錄中包含一些程式集和描述性檔案,以及大量與原始頁面同名的 Stub 檔案,但不包含代碼(包括 HTML 和可執行代碼)。如果瀏覽此網站,輸出與原始網站的輸出相同。請注意,不能在已進行部署先行編譯的網站上使用在位先行編譯,原因很簡單,因為它已經被先行編譯過了。
IntelliSense 無處不在!
對於 Visual Studio .NET 2002 和 2003,最令我頭痛的問題之一(相信很多開發人員也有同感)就是對 IntelliSense 和其他用於提高生產率的功能的支援不一致。希望在 HTML 視圖中將控制項從工具箱中拖到頁面上嗎?還做不到。事實上,在 HTML 視圖中根本看不到工具箱的 Web Form面板!要在 .aspx 頁面上寫入內嵌代碼而不是使用模組化代碼?可以做到,但必須放棄 IntelliSense、拖放功能以及其他更多功能。最後,正如我最近在 MSDN ASP.NET Developer Center 上發表的文章中提到的,在 Visual Studio .NET 2002 或 2003 中獲得自訂控制項的設計時支援需要跨越層層障礙,包括有點粗糙但奏效的 XSL 修改。
令人高興的是,ASP.NET Whidbey 中實現了編譯模型的統一,所有這些問題也都迎刃而解。在 Visual Studio .NET Whidbey 中,可以寫入內嵌代碼或使用新的模組化代碼模型,還能獲得控制項拖放、IntelliSense 陳述式完成以及所有以前您希望使用卻因編碼方式局限而無法使用的那些可以提高生產率的功能。另外,對自訂伺服器控制項和 Web 控制項的設計時支援有了很大的改進,包括為源視圖(HTML 視圖在 Visual Studio .NET Whidbey 中的等效視圖)中的自訂控制項增加了 IntelliSense 陳述式完成。
小結
ASP.NET Whidbey 中對編譯模型的更改,以及 Visual Studio .NET Whidbey 中相應功能的改進無疑是一個巨大的飛躍,不僅為開發人員提供了所需的靈活性,還使他們可以充分利用 IDE 提供的可以提高生產率的功能。大大簡化的模組化代碼模型將使該功能更有用、更簡捷,而新增的對內嵌代碼的完全支援顯然會受到那些希望所有代碼都位於一個 .aspx 檔案中的開發人員的歡迎。