即将推出的新版 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 窗体(例如 foo.aspx)时,Visual Studio 会自动创建一个相关的 Codebehind 类文件,该文件名称的前一部分与 Web 窗体相同,后面是 .vb 或 .cs(取决于项目使用的语言)。类文件将通过 @ Page 指令的 Codebehind 和 Inherits 属性与 Web 窗体相关联。
类文件包含事件处理代码(包括用于将事件处理程序绑定到相应事件的代码),以及每个控件(通过 Visual Studio Web 窗体编辑器添加到 .aspx 文件中)的分离声明。编译(生成)Web 应用程序项目后,其中的所有 Codebehind 类都将编译到一个 .NET 程序集中,该程序集将放置到 Web 应用程序的 /bin 目录中。Web 窗体页本身会在运行时动态进行编译,并且每个 Web 窗体均继承自与其相关的 Codebehind 类。有关 Visual Studio .NET 2003 和 ASP.NET 1.1 中的模块化代码模型的详细信息,请参阅 MSDN Library 文章 Web Forms Code Model(英文)。
Public Class WebForm1
Inherits System.Web.UI.Page
#Region " Web 窗体设计器生成的代码 "
'此调用是 Web 窗体设计器所必需的。
_
Private Sub InitializeComponent()
End Sub
'注意:以下占位符声明是
'Web 窗体设计器所必需的。
'请勿删除或改变其位置。
Private designerPlaceholderDeclaration As System.Object
Private Sub Page_Init(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN:此方法调用是 Web 窗体设计器所必需的。
'请勿使用代码编辑器修改它。
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
'此处放置用于初始化该页面的用户代码
End Sub
End Class
为了更好地说明上述操作的实现过程,让我们先来看几个示例。在第一个示例中,我们将看到如何创建一个简单的业务组件,以及如何从 Web 窗体页对其进行访问。
利息计算器
首先,我们打开 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
为了说明现在使用创建的资源文件是多么简单,我们将一个 Web 窗体添加到项目中,方法如下:右击 Web 站点节点,然后单击 Add New Item....(添加新项...)。在 Add New Item(添加新项)对话框中,选择 Web 窗体,将页面命名为 ColorPicker.aspx,然后单击 Open(打开)。修改此页面,使其与以下列表匹配。
请注意,在 ASP.NET Whidbey 中访问资源文件只需要一行代码。因为将资源文件放到 Code 目录中后,即可自动嵌入和引用该资源文件,所以不需要引用任何命名空间或程序集,也不需要为访问资源字符串创建对象。而且 ASP.NET 还可以确定应该使用哪个资源文件(基于用户浏览器的设置),因此我们不需要在运行时对此进行判断并作出相应的响应。ASP.NET 可以帮助我们完成这一切。
预编译支持
ASP.NET Web 窗体的优势之一就是增加动态编译后,您可以很轻松地更改 .aspx 页,保存更改时页面将动态更新,而不需要重新编译(只要不使用模块化代码)。但动态编译并不是对每个应用程序都适合,而且第一次访问某个应用程序时,动态编译会导致浏览器的初始性能降低。另外,很多时候您可能希望部署一个没有源代码的应用程序。
如果您遇到上述情况,您会更高兴地了解到 ASP.NET Whidbey 具有支持预编译 Web 站点的功能。ASP.NET Whidbey 支持两种预编译模式:在位预编译和部署预编译。
在位预编译
在位预编译使您可以对 Web 站点中的所有页面进行手动批编译。这也是用户在您的应用程序中首次单击某个页面后发生的操作(前文提到的后一种情况除外),用户只需坐下来等待批编译完成。
请注意,某些命令行选项要求 Web 站点必须为有效的 Microsoft® Internet 信息服务 (IIS) 应用程序才能正常工作。
如果在 Microsoft® Windows 资源管理器中浏览至目标目录,您会看到预编译 Web 站点后将生成一个包含 bin 目录的站点,bin 目录中包含一些程序集和描述性文件,以及大量与原始页面同名的 Stub 文件,但不包含代码(包括 HTML 和可执行代码)。如果浏览此站点,输出与原始站点的输出相同。请注意,不能在已进行部署预编译的站点上使用在位预编译,原因很简单,因为它已经被预编译过了。
IntelliSense 无处不在!
对于 Visual Studio .NET 2002 和 2003,最令我头痛的问题之一(相信很多开发人员也有同感)就是对 IntelliSense 和其他用于提高生产率的功能的支持不一致。希望在 HTML 视图中将控件从工具箱中拖到页面上吗?还做不到。事实上,在 HTML 视图中根本看不到工具箱的 Web 窗体面板!要在 .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 文件中的开发人员的欢迎。
预编译功能使开发人员可以轻松地提高其站点的初始性能,如果需要,还可以通过提供功能完备的 Web 应用程序(不包含源代码或 HTML)为重要的知识产权信息添加保护措施。
最后,集所有功能于一身的 Visual Studio .NET Whidbey 无疑会为开发人员带来非凡的体验,他们不仅能从内嵌代码模型和模块化代码模型中获得完全的 IntelliSense 支持,还能查看给定页面的所有视图,开发工作不会再因工具限制而局限于某一种样式。
作者简介
G. Andrew Duthie 是 Graymad Enterprises, Inc.(英文)的创始人和负责人,该公司提供 Microsoft Web 开发技术的培训和咨询服务。自从 Active Server Pages 问世以来,Andrew 一直从事多层 Web 应用程序的开发工作。他编写了大量有关 ASP.NET 的书籍,包括《Microsoft ASP.NET Programming with Microsoft Visual Basic》、《Microsoft ASP.NET Programming with Microsoft Visual C#》和《ASP.NET in a Nutshell》(第二版)。Andrew 经常在一些重大活动中发表演讲,这些活动包括“Software Development”、“Dev-Connections family of conferences”、“Microsoft Developer Days”以及“VSLive!”。他还作为 International .NET Association (INETA)(英文)Speaker's Bureau 成员在 .NET 用户组上发表了演讲。您可以从其公司的 Web 站点 http://www.graymad.com/(英文)上了解到有关 Andrew 的更多信息。