Share via


ASP.NET 网页代码模型

更新:2007 年 11 月

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>
<%@ Page Language="C#" %>
<script runat="server">
void Button1_Click(Object sender, EventArgs e){    Label1.Text = "Clicked at " + DateTime.Now.ToString();}
</script>
<html>
<head>
  <title>Single-File Page Model</title>
</head>
<body>
  <form runat="server">
    <div>
       <asp:Label id="Label1" 
         runat="server" Text="Label">
       </asp:Label>
       <br />
       <asp:Button id="Button1" 
         runat="server" 
         onclick="Button1_Click" 
         Text="Button">
      </asp:Button>
    </div>
  </form>
</body>
</html>

script块可以包含页所需的任意多的代码。代码可以包含页中控件的事件处理程序(如该示例所示)、方法、属性及通常在类文件中使用的任何其他代码。在运行时,单文件页被作为从 Page 类派生的类进行处理。该页不包含显式类声明。但编译器将生成将控件作为成员包含的新类。(并不是所有的控件都作为页成员公开;有些控件是其他控件的子控件。)页中的代码成了该类的一部分;例如,创建的事件处理程序将成为派生的 Page 类的成员。

有关更多信息,请参见 ASP.NET 页类概述

代码隐藏页模型

通过代码隐藏页模型,可以在一个文件(.aspx 文件)中保留标记,并在另一个文件中保留编程代码。代码文件的名称会根据所使用的编程语言而有所变化。

015103yb.alert_note(zh-cn,VS.90).gif说明:

并非所有的 .NET 编程语言都可用于为 ASP.NET 网页创建代码隐藏文件。必须使用支持分部类的语言。例如,J# 不支持分部类,因此也不支持为 ASP.NET 页创建代码隐藏文件。

例如,如果您正在处理名为 SamplePage 的页,则对应的标记位于 SamplePage.aspx 文件中,而代码位于 SamplePage.aspx.vb (Visual Basic)、SamplePage.aspx.cs (C#) 等文件中。

015103yb.alert_note(zh-cn,VS.90).gif说明:

.NET Framework 2.0 版中使用的代码隐藏模型与早期版本中使用的模型不同。

在代码隐藏模型中,前面部分中使用的单文件页示例分成两个部分。标记位于一个文件中(在本示例中为 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" 
         onclick="Button1_Click" 
         Text="Button" >
       </asp:Button>
    </div>
  </form>
</body>
</html>
<%@ Page Language="C#" CodeFile="SamplePage.aspx.cs" 
    Inherits="SamplePage" AutoEventWireup="true" %>
<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" 
         onclick="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
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class SamplePage : System.Web.UI.Page
{
    protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = "Clicked at " + DateTime.Now.ToString();
    }
}

代码隐藏文件包含默认命名空间中的完整类声明。但是,类是使用 partial 关键字进行声明的,这表明类并不整个包含于一个文件中。而在页运行时,编译器将读取 .aspx 页以及它在 @ Page 指令中引用的文件,将它们汇编成单个类,然后将它们作为一个单元编译为单个类。

分部类文件从 Page 类页继承。有关更多信息,请参见 ASP.NET 页类概述

选择页模型

单文件页模型和代码隐藏页模型功能相同。在运行时,这两个模型以相同的方式执行,而且它们之间没有性能差异。因此,页模型的选择取决于其他因素,例如,要在应用程序中组织代码的方式、将页面设计与代码编写分开是否重要等等。

015103yb.alert_note(zh-cn,VS.90).gif说明:

本文档中提供的示例通常为单文件页。这主要是为了读者方便阅读,因为这样就不必为每个示例展示两个文件。尽管该文档提供的是单文件示例,但是并不说明单文件页优于代码隐藏页,或单文件页存在一些其他的内在优势。

单文件页的优点

通常,单文件模型适用于特定的页,在这些页中,代码主要由页中控件的事件处理程序组成。

单文件页模型的优点包括以下几点:

  • 在没有太多代码的页中,可以方便地将代码和标记保留在同一个文件中,这一点比代码隐藏模型的其他优点都重要。例如,由于可以在一个地方看到代码和标记,因此研究单文件页更容易。

  • 因为只有一个文件,所以使用单文件模型编写的页更容易部署或发送给其他程序员。

  • 由于文件之间没有相关性,因此更容易对单文件页进行重命名。

  • 因为页自包含于单个文件中,故而在源代码管理系统中管理文件稍微简单一些。

代码隐藏页的优点

代码隐藏页的优点使它们适用于包含大量代码或多个开发人员共同创建网站的 Web 应用程序。

代码隐藏模型的优点包括以下几点:

  • 代码隐藏页可以清楚地分隔标记(用户界面)和代码。这一点很实用,可以在程序员编写代码的同时让设计人员处理标记。

  • 代码并不会向仅使用页标记的页设计人员或其他人员公开。

  • 代码可在多个页中重用。

编译和部署

单文件页和代码隐藏页的编译和部署非常相似。最简单的方法是将页复制到目标服务器中。如果使用代码隐藏页,则要复制 .aspx 页和代码文件。首次请求该页时,ASP.NET 会对其进行编译然后运行。注意,在这两种方案中都应将源代码与标记一同部署。

或者,可以预编译网站。在这种情况下,ASP.NET 将为页生成目标代码,可以将其复制到目标服务器中。预编译对单文件模型和代码隐藏模型都有效,且两种模型的输出相同。有关更多信息,请参见 ASP.NET 预编译概述

请参见

概念

ASP.NET 页生命周期概述

ASP.NET 编译概述