一个ASP.NET页面由两部分组成:一是使用静态文本和服务器控件的用户界面定义,二是用户界面行为和服务器端代码形式的Web应用程序逻辑的实现。
ASP.NET提供了全新的代码模型,使得网页开发者和开发工具能够更清晰、更容易地把代码与表示分开。对比ASP来说,这个特征是一个重要的改进,ASP需要代码遍布在整个页面的静态内容之中。ASP.NET代码模型使得开发和设计团队中的分工更加容易,并增加了代码和内容的可读性和可维护性。
这个全新的代码模型通常使用两种形式之一。第一种形式仅仅是在.aspx页面文件内的< script runat=”server”></script>脚本代码块中嵌入代码,这种形式被称为行内代码(inline code), ASP.NET Web Matrix、DreamweaverMX等软件采用的就是这种代码编写模型。第二种形式包含实现从Page中派生的类,在独立的文件中保存代码并且通过Page指令把它与.aspx文件联系起来。这种形式一般称为代码分离(code-behind),有时也成为代码隐藏技术,Visual Studio.NET采用是这种模型。无论采用那种编程模型,性能是一样的,只是不同的编程工具,又不同的编写方法和使用习惯,重要的一点就是在使用ASP.NET的类之前,必须引入类所在的命名空间。
同时Web窗体的返回处理过程是基于事件驱动型的,提交页面为自身,因此在每个Web窗体的控件布局代码必须放在<body><form runat=server></from></body>HTML代码块中的。
在下面两节中,我们通过实例来演示行内代码模型和在Visual Studio.NET2003实现的分离模型编。
4.2.1 利用行内代码模型编写Web应用程序
行内代码编程模型更近似与ASP的升级,HTML代码和应用程序的逻辑代码一同保存在.aspx页面文件中,在第一次被访问时编译成Page基类,以后每次访问都是直接有该Page类生成Web页面。在第一章的第5节中,我们引用了一个显示“Hello,ASP.NET!”的实例,就是采用的行内代码编程模型编写的。下面时NewFile.aspx的全部代码:
<%@ Page Language="VB" %>
<!-- 逻辑代码部分开始 ->
<script runat="server">
' Insert page code here
sub page_load(sender as object ,e as eventargs)
Response.Write("Hello, ASP.NET!")
End Sub
</script>
<!-- 逻辑代码部分结束->
<html>
<head>
</head>
<body>
<FORM runat="server">
<!-- Insert content here -->
</FORM>
</BODY>
</HTML>
通过浏览器浏览效果如图4.3所示:
图4.3 NewFile.aspx运行结果
行内代码的好处较之与Visual Studio.NET来说,代码比较简洁,同时,一个Web应用程序中的每个ASP.NET页面可以采用不同的语言编写,比如NewFile.aspx可以采用VB.NET ,NewFile2.aspx可以采用C#,NewFile3.aspx可以采用J#。但是,每一个ASP.NET页面必须只使用一种语言。
4.2.2 利用代码隐藏技术编写Web应用程序
Visual Studio.NET就是典型的利用代码隐藏技术编写Web应用程序的工具软件, VS.NET为Web应用程序中的每个Web窗体提供了三个不同的窗口:
(1)设计窗口:采用所见即所得的方式,可以用鼠标直接干预控件或是其他可视效果的位置。窗口的切换按钮图标是 ;
(2)HTML代码窗口:可以查看Web窗体的HTML代码,并且可以修改、编写。编写HTML代码的时候,Visual Studio.NET系统提供智能提示的功能。窗口切换按钮图标;
(3)逻辑代码窗口:即是代码隐藏技术中逻辑代码窗口,每个Web窗体都有一个对应的逻辑代码文件,有VS.NET自动把Web窗体的逻辑代码源引用到.aspx页面文件中。每个逻辑代码文件的名称是在对应的ASP.NET页面文件名称后再加后缀名.vb(C#语言编写的源文件加后缀名.cs)。如,WebForm1.aspx的逻辑代码文件为WebForm1.aspx.vb。如果要进入Web窗体的逻辑代码,只需要在设计窗口中双击Web窗体界面就进入了逻辑代码窗口。
我们用VS.NET2003打开在第三章中建好的Web项目――MyFirst应用程序,打开后,系统默认进入了WebForm1.aspx的设计窗口,如图4.4所示。
图4.4 WebForm1.aspx的设计窗口
单击按钮图标 ,就进入了WebForm1.aspx的HTML代码窗口,如图4.5所示。
图4.5 WebForm1.aspx的HTML代码窗口
下面是WebForm1.aspx的所有HTML代码:
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" Inherits="MyFirst.WebForm1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title>WebForm1</title>
<meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" content="Visual Basic .NET 7.1">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<FONT face="宋体"></FONT>
</form>
</body>
</HTML>
在<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" Inherits="MyFirst.WebForm1"%>中,声明了Page类使用的编程语言,Codebehind="WebForm1.aspx.vb"指明该页面的逻辑代码保存在WebForm1.aspx.vb文件中。
在WebForm1.aspx的设计窗口中,我们对窗体界面双击,就进入了WebForm1.aspx的逻辑代码窗口,即:WebForm1.aspx.vb。WebForm1.aspx.vb是系统自动生成的,在它的代码中包括对WebForm1.aspx中引用控件的声明和窗体设计器自动生成的代码。在WebForm1.aspx.vb窗口中编写代码时,系统提供了智能填充的功能,例如如果你不知道使用类的具体名字而只知道类所在的命名空间,你只要敲出命名空间和“.”,智能填充就会给出该命名空间中所有类名称,这对于初学者很有帮助,对提高别称效率也很有帮助。WebForm1.aspx.vb的窗口如图4.6所示。
图4.6 WebForm1.aspx的逻辑代码窗口
在WebForm1.aspx.vb中,包含了Web窗体编译时必须的一些函数。下面是WebForm1.aspx.vb文件的全部代码:
Public Class WebForm1
Inherits System.Web.UI.Page
#Region " Web 窗体设计器生成的代码 "
'该调用是 Web 窗体设计器所必需的。
<System.Diagnostics.DebuggerStepThrough()> 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
上面代码中的注释部分也是系统自动添加的,并且系统也自动生成了WebForm1.aspx窗体的Page_Load事件过程。
我们在这个事件过程中添加代码:
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此处放置初始化页的用户代码
'下面是要显示的内容
Response.Write("I Love China! I Love The Great Wall!")
End Sub
然后按F5,Visual Studio.NET会自动编译整个MyFirst应用程序,然后调用IE了浏览器打开WebForm1.aspx(本实例中WebForm1.aspx为默认启动窗体),也可以在WebForm1.aspx的设计窗体中右击鼠标,在弹出菜单中选择【在浏览器中查看】,就可以直接在Visual Studio.NET的集成环境中查看WebForm1.aspx编译后的运行效果,如图4.7所示,这个方法适合预览非默认启动窗体。当然,可以编译整个Web应用程序,然后在IE浏览器中直接输入地址也可以预览运行效果。
图4.7 非默认启动窗体的预览方式
无论采用那一种方式预览Web窗体,都是必须经过编译的。Visual Studio.NET会把编译后生成的Page基类存放于应用程序根目录下的bin文件夹中,以后每次访问直接调用该基类。本实例中生成的类为MyFirst.dll。我们编译后通过浏览器查看WebForm1.aspx,结果如图4.8所示。
图 4.8 WebForm1.aspx的运行结果
采用代码隐藏技术编写的Web应用程序逻辑上比较明朗,一方面减少了.aspx页面的文件长度,另一方面,Web应用程序正式发布到服务器后,逻辑代码文件经过编译生成基类文件(DLL文件)后,就可以删除掉,从而做到对源代码的保护。