内联(Inline)代码的分离
下面的例子演示了一个简单的带有三个服务器控件(分别是文本框、按钮和标签)的ASP.NET页面。最初这些控件呈现的内容与HTML形式是相同的。但是,当你在客户端的文本框中输入值并点击按钮的时候,该页面会发回服务器并且在该页面的代码中处理这个点击事件,动态地更新标签控件的Text属性。接下来这个页面会重新呈现以反映更新过的文本。这个简单的例子演示了服务器控件模型背后的基本原理,它使ASP.NET成为最容易学习和掌握的Web编程模型之一。
<%@ page language="VB" %>
<script runat="server">
Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Label1.Text = "Hello " & TextBox1.Text
End Sub
</script>
<html>
<head>
<title>ASP.NET Inline Pages</title>
</head>
<body>
<form id="Form1" runat="server">
<h1>Welcome to ASP.NET 2.0!</h1>
<b>Enter Your Name:</b>
<asp:TextBox ID="TextBox1" Runat="server"/>
<asp:Button ID="Button1" Text="Click Me" Runat="server"/>
<br />
<br />
<asp:Label ID="Label1" Text="Hello" Runat="server" />
</form>
</body>
</html>
请注意:上面的例子中的按钮事件处理程序位于包含服务器控件的同一个页面中的<script></script>标记之内。ASP.NET把这种情况称为页面编程代码内联(code-inline),当你希望在同一个文件中处理代码和显示逻辑的时候,它是非常有用的。但是,ASP.NET还支持另外一种用于存放你的代码和显示内容的方法,称为后台代码(code-behind)模型。使用后台代码的时候,处理事件的代码位于与服务器控件和标记的页面文件分离的另一个物理上独立的文件之中。当你需要维护这些独立的文件(例如多个人一起建立应用程序)的时候,代码和内容之间的这种清晰的分离是非常有用的。在小组项目中,设计者处理应用程序的UI部分,开发者处理行为或代码是很常见的,后台代码模型适合于这种情况。
简化的后台代码模型 ASP.NET 2.0为后台代码页面引入了一个改良的运行时(runtime),它简化了页面和代码之间的连接。在新的后台代码模型中,页面被声明为局部(partial)类,允许在运行时把页面和代码文件编译到一个类中。页面代码引用CodeFile属性和<%@ Page %>指令中的后台代码文件,在Inherits属性中指定类的名称。请注意,后台代码类的成员必须是公共的(public)或受保护的(protected),不能是私有的(private)。
<%@ page language="VB" CodeFile="CodeBehind_vb.aspx.vb" Inherits="CodeBehind_vb_aspx" %>
<html>
<head>
<title>ASP.NET CodeBehind Pages</title>
</head>
<body>
<form runat="server">
<h1>Welcome to ASP.NET 2.0!</h1>
<b>Enter Your Name:</b>
<asp:TextBox ID="TextBox1" Runat="server"/>
<asp:Button ID="Button1" Text="Click Me" Runat="server"/>
<br />
<br />
<asp:Label ID="Label1" Text="Hello" Runat="server" />
</form>
</body>
</html>
简化的后台代码模型的优势在于,你不必单独地在后台代码类中声明服务器控件变量。使用局部类(2.0中的新特性)允许ASPX页面中的服务器控件ID直接被后台代码文件访问。这极大地简化了后台代码页面的维护工作量。
在页面之间共享代码
尽管可以在站点的每个页面中放置代码(使用内联或者后台代码分离模型),还是可能遇到希望在站点的多个页面之间共享代码的情况。把代码复制到需要它的每个页面是一种低效率的和难于维护的方法。幸运的是,ASP.NET提供了几个让代码供应用程序的所有页面访问的方法。
代码目录
页面可以在运行时动态的编译,代码文件(例如.cs和.vb文件)也可以。ASP.NET 2.0引入了App_Code目录,它可以包含那些含有代码的独立的文件,而这些代码可供应用程序的多个页面访问。ASP.NET 1.x要求这些共享文件预编译到Bin目录中,然而App_Code目录中的代码文件将在运行时动态地编译,并供应用程序使用。把多种语言建立的代码文件放在App_Code目录中是可行的,这时候应该把它们放在不同的子目录中(在Web.config中注册具体语言)。下面的例子演示了使用App_Code目录包含一个类文件,页面会调用它。
<%@ page language="VB" %>
<script runat="server">
Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim c As New CustomClass
Label1.Text = c.GetMessage(TextBox1.Text)
End Sub
</script>
<html>
<head>
<title>ASP.NET Inline Pages</title>
</head>
<body>
<form id="Form1" runat="server">
<h1>Welcome to ASP.NET 2.0!</h1>
<b>Enter Your Name:</b>
<asp:TextBox ID="TextBox1" Runat="server"/>
<asp:Button ID="Button1" Text="Click Me" Runat="server"/>
<br />
<br />
<asp:Label ID="Label1" Text="Hello" Runat="server" />
</form>
</body>
</html>
在默认情况下,App_Code目录只能包含相同语言的文件。但是,为了在App_Code目录中包含多种语言的文件,你可以把App_Code目录划分为多个子目录(每个子目录包含相同语言的文件)。为了实现这个目标,你必须在应用程序的Web.config文件中注册每个子目录。
<configuration>
<system.web>
<compilation>
<codeSubDirectories>
<add directoryName="Subdirectory"/>
</codeSubDirectories>
</compilation>
</system.web>
</configuration>
下面的例子演示了一个划分过的App_Code目录,它同时包含了VB和C#语言的文件。
<%@ page language="VB" %>
<script runat="server">
Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim c As New Cu