ASP.NET 网页由两部分组成:
-
可视元素,包括标记、服务器控件和静态文本。
-
页的编程逻辑,包括事件处理程序和其他代码。
ASP.NET 提供两个用于管理可视元素和代码的模型,即单文件页模型和代码隐藏页模型。这两个模型功能相同,两种模型中可以使用相同的控件和代码。
本主题说明每个模型的工作方式,并提供如何选择模型的建议。
单文件页模型
在单文件页模型中,页的标记及其编程代码位于同一个物理 .aspx 文件中。编程代码位于 script 块中,该块包含 runat="server" 属性,此属性将其标记为 ASP.NET 应执行的代码。
下面的代码示例演示一个单文件页,此页中包含一个Button 控件和一个Label 控件。突出显示的部分显示的是 script 块中 Button 控件的Click 事件处理程序。
<%@ Page Language="VB" %>
<script runat="server">
Protected Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs)
Label1.Text = "Clicked at " & DateTime.Now.ToString()
End Sub
</script>
<html>
<head id="Head1" runat="server">
<title>Single-File Page Model</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1"
runat="server" Text="Label">
</asp:Label>
<asp:Button ID="Button1"
runat="server" OnClick="Button1_Click" Text="Button">
</asp:Button>
</div>
</form>
</body>
</html>
script 块可以包含页所需的任意多的代码。代码可以包含页中控件的事件处理程序(如该示例所示)、方法、属性及通常在类文件中使用的任何其他代码。在运行时,单文件页被作为从 Page 类派生的类进行处理。该页不包含显式类声明。但编译器将生成将控件作为成员包含的新类。(并不是所有的控件都作为页成员公开;有些控件是其他控件的子控件。)页中的代码成了该类的一部分;例如,创建的事件处理程序将成为派生的 Page 类的成员。
代码隐藏页模型
通过代码隐藏页模型,可以在一个文件(.aspx 文件)中保留标记,并在另一个文件中保留编程代码。代码文件的名称会根据所使用的编程语言而有所变化。
并非所有的 .NET 编程语言都可用于为 ASP.NET 网页创建代码隐藏文件。必须使用支持分部类的语言。例如,J# 不支持分部类,因此也不支持为 ASP.NET 页创建代码隐藏文件。 |
例如,如果您正在处理名为 SamplePage 的页,则对应的标记位于 SamplePage.aspx 文件中,而代码位于 SamplePage.aspx.vb (Visual Basic)、SamplePage.aspx.cs (C#) 等文件中。
在代码隐藏模型中,前面部分中使用的单文件页示例分成两个部分。标记位于一个文件中(在本示例中为 SamplePage.aspx),并且与单文件页类似,如下面的代码示例所示。
<%@ Page Language="VB" CodeFile="SamplePage.aspx.vb"
Inherits="SamplePage" AutoEventWire="false" %>
<html>
<head runat="server" >
<title>Code-Behind Page Model</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label id="Label1"
runat="server" Text="Label" >
</asp:Label>
<br />
<asp:Button id="Button1"
runat="server"
οnclick="Button1_Click"
Text="Button" >
</asp:Button>
</div>
</form>
</body>
</html>
在单文件模型和代码隐藏模型之间,.aspx 页有两处差别。在代码隐藏模型中,不存在具有 runat="server" 属性的 script 块。(如果要在页中编写客户端脚本,则该页可以包含不具有 runat="server" 属性的 script 块。)第二个差别是,代码隐藏模型中的@page指令包含引用外部文件(SamplePage.aspx.vb 或 SamplePage.aspx.cs)和类的属性。这些属性将 .aspx 页链接至其代码。
代码位于单独的文件中。下面的代码示例演示一个与单文件页的示例包含相同 Click 事件处理程序的代码隐藏文件。
Partial Class SamplePage
Inherits System.Web.UI.Page
Protected Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Label1.Text = "Clicked at " & DateTime.Now.ToString()
End Sub
End Class
代码隐藏文件包含默认命名空间中的完整类声明。但是,类是使用 partial 关键字进行声明的,这表明类并不整个包含于一个文件中。而在页运行时,编译器将读取 .aspx 页以及它在 @ Page 指令中引用的文件,将它们汇编成单个类,然后将它们作为一个单元编译为单个类。
单文件页的优点
通常,单文件模型适用于特定的页,在这些页中,代码主要由页中控件的事件处理程序组成。
单文件页模型的优点包括以下几点:
-
在没有太多代码的页中,可以方便地将代码和标记保留在同一个文件中,这一点比代码隐藏模型的其他优点都重要。例如,由于可以在一个地方看到代码和标记,因此研究单文件页更容易。
-
因为只有一个文件,所以使用单文件模型编写的页更容易部署或发送给其他程序员。
-
由于文件之间没有相关性,因此更容易对单文件页进行重命名。
-
因为页自包含于单个文件中,故而在源代码管理系统中管理文件稍微简单一些。
代码隐藏页的优点
代码隐藏页的优点使它们适用于包含大量代码或多个开发人员共同创建网站的 Web 应用程序。
代码隐藏模型的优点包括以下几点:
-
代码隐藏页可以清楚地分隔标记(用户界面)和代码。这一点很实用,可以在程序员编写代码的同时让设计人员处理标记。
-
代码并不会向仅使用页标记的页设计人员或其他人员公开。
-
代码可在多个页中重用