ASP.NET的工作原理
在多数场合下,可以将ASP.NET页面简单地看成一般的HTML页面,页面包含标记有特殊处理方式的一些代码段。当安装.NET时,本地的IIS Web服务器自动配置成查找扩展名为.aspx的文件,且用ASP.NET模块(名为aspnet_isapi.dll的文件)处理这些文件。
从技术上讲,ASP.NET模块分析ASPX文件的内容,并将文件内容分解成单独的命令以建立代码的整体结构。完成此工作后,ASP.NET模块将各命令放置到预定义的类定义中(不需要放在一起,也不需要按编写顺序放置)。然后使用这个类定义一个特殊的ASP.NET对象Page。该对象要完成的任务之一就是生成HTML流,这些HTML流可以返回到IIS,再从IIS返回到客户。简言之,在用户请求IIS服务器提供一个页面时,IIS服务器就根据页面上的文本、HTML和代码(这对我们来说是最重要的)建立该页面。
注意:
本书将介绍此过程的各方面细节,第7章将详细介绍Page对象,讨论该对象所能完成的一些工作。
现在我们要把重点放在页面的生成和运行。第一步是学习如何创建页面,并让Web服务器将它们识别为ASP.NET页面。
2.2.1 将ASP.NET文件以.aspx扩展名保存
前一章已经将适当代码保存到扩展名为.aspx的文件,这定义了一个ASPX.NET页面。这个扩展名把页面标识为由ASP.NET模块来处理。没有它,IIS只是将页面传送给用户,但不执行代码。
虽然可以在.htm文件中使用<script>标识符,但在该标识符之间放置的任何内容均不会作为ASP.NET代码解释。这些内容会被送到客户端浏览器执行,但它们不可能工作,因为只有HTML和客户端脚本才能在浏览器上执行。
学生和初学者在使用Notepad时常常对扩展名有一个问题。他们会在扩展名的后面加上.txt,使文件名变成MyFile.aspx.txt。在Notepad的“保存”对话框中把文件类型设置为All Files,就可以避免这个问题。也可以在保存文件后在Windows资源管理器中修改文件扩展名。在使用Web Matrix时不会有这个问题,因为Web Matrix会使用正确的扩展名。
2.2.2 在Web页面中插入ASP.NET代码
如果要将任一种服务器端代码(不仅是ASP.NET代码)插入到自己的Web页面源代码中,则需要对其进行标注,以使服务器能将它识别为服务器端代码,这样才能正确处理它们。在HTML页面中插入ASP.NET代码有3种方式:
● 内联代码块。
● <script>标记。
● 服务器控件。
以前使用过ASP的开发人员很熟悉内联代码块(<% %>界定符),但在ASP.NET中这不是首选技术。后两种技术提供了更健壮、性能更好、更容易维护的代码。
1. <script>标记
在HTML代码中区分ASP.NET代码和页面文本的最好方法是使用<script>标记,并将runat属性设成server。当采用<script>标记时,脚本默认在浏览器(客户端)执行。如果要编写服务器端脚本,则必须使用双引号指定runat=“server”。
我们知道,ASP.NET本身不是语言,而是创建动态页面的技术。它允许在页面上使用各种编程语言。在ASP.NET中编写代码的默认语言是VB.NET。用VB.NET定义页面,只要将Page指令包括在页面的顶部即可,如下所示:
<%@ Page language="VB" %>
为定义一段代码,可采用以下格式(注意VB的双引号):
<script language="VB" runat="server">
... Visual Basic.NET statements go here ...
</script>
由于<%@ Page language>标记已经将VB.NET确定为编程语言,因此上面代码中的language属性不是必不可少的,可以省略掉。但是language属性清晰地说明目前正在使用哪一种语言,使代码的维护更加简单。这样的代码段可以位于ASPX页面的任何地方,但本书把代码放在页面的顶部。代码行可以位于ASPX页面的任何地方,只要把它们放在<script>标记内即可;本书把代码放在页面的顶部,是因为这是ASP.NET Web Matrix的工作方式。
为使用其他语言定义页面,如使用C#,可以用下面的代码来实现:
<%@ Page language="C#" %>
<script language="C#" runat="server">
... C# declarations go here ...
</script>
在上面两个例子中,<script>元素内的所有代码必须是用指定的语言编写的。一个应用程序(多个页面)的各个部分可以用多种语言编写,但不能在一个页面上混合使用多种语言。
虽然可以在页面中放置代码,但这些代码不一定会执行。每个代码块都必须位于一个声明中,一般称为Sub过程。在其他代码触发Sub时,Sub就会执行。它也许会触发一次,也许触发多次,也许永远不触发。后面几章将详细解释这一内容。
于是,就出现了一个逻辑问题:如何在第一次建立页面时让某种类型的触发器自动运行代码?换言之,无论事件是否发生,都执行某些代码?在创建页面时,ASP.NET模块会执行位于一个特定Sub过程即Page_Load()中的所有代码,如下面的结构所示:
<script language="VB" runat="server">
sub Page_Load(source As Object, e As EventArgs)
... Location for Visual Basic.NET code to be run when the page is started
end sub
</script>
这段代码的作用是(在此不准备细述其功能)当加载页面时,标记为sub Page_Load的声明块被自动激活。当启动页面时希望运行的任何代码,均可直接放到该位置。