內聯(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" onclick="button1_click" 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>
?。糵orm runat="server">
<h1>welcome to asp.net 2.0!</h1>
<b>enter your name:</b>
?。糰sp:textbox id="textbox1" runat="server"/>
?。糰sp:button id="button1" text="click me" onclick="button1_click" runat="server"/>
?。糱r />
<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">
?。糷1>welcome to asp.net 2.0!</h1>
?。糱>enter your name:</b>
<asp:textbox id="textbox1" runat="server"/>
?。糰sp:button id="button1" text="click me" onclick="button1_click" runat="server"/>
?。糱r />
?。糱r />
?。糰sp:label id="label1" text="hello" runat="server" />
</form>
</body>
</html>
在默認情況下,app_code目錄只能包含相同語言的文件。但是,為了在app_code目錄中包含多種語言的文件,你可以把app_code目錄劃分為多個子目錄(每個子目錄包含相同語言的文件)。為了實現這個目標,你必須在應用程序的web.config文件中注冊每個子目錄。
<configuration>
<system.web>
<compilation>
?。糲odesubdirectories>
?。糰dd 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 customclass
label1.text = c.getmessage(textbox1.text)
dim c2 as new customclass2
label2.text = c2.getmessage(textbox1.text)
end sub
</script>
<html>
<head>
<title>asp.net inline pages</title>
</head>
<body>
<form id="form1" runat="server">
?。糷1>welcome to asp.net 2.0!</h1>
?。糱>enter your name:</b>
?。糰sp:textbox id="textbox1" runat="server"/>
?。糰sp:button id="button1" text="click me" onclick="button1_click" runat="server"/>
?。糱r />
?。糱r />
?。糰sp:label id="label1" runat="server" />
?。糱r />
?。糰sp:label id="label2" runat="server" />
</form>
</body>
</html>
bin目錄
asp.net第一版本就支持bin目錄,它與code目錄類似,只不過它能包含預編譯的部件。當你需要使用他人的一些代碼的時候,它就非常有用了。在這種情況下,你不需要訪問源代碼(vb或c#文件),而是使用編譯過的dll文件。簡單地把部件放在bin目錄中就可以使用它了。在默認情況下,bin目錄中的所有部件都會被自動地載入應用程序并供頁面訪問。你需要使用頁面頂部的@import指令導入bin目錄中的部件的名字空間。
<@ import namespace="mycustomnamespace" >
全局部件緩存
.net框架組件2.0包含了大量的表現框架組件不同部分的部件。這些部件都存儲在全局部件緩存中,它是一個可供計算機上所有應用程序(不是供特定的應用程序使用)使用的部件倉庫??蚣芙M件中的幾個部件會自動地供asp.net應用程序使用。你可以在應用程序的web.config文件中注冊額外的部件。
<configuration>
<compilation>
<assemblies>
?。糰dd assembly="system.data, version=1.0.2411.0, culture=neutral,
publickeytoken=b77a5c561934e089"/>
?。?assemblies>
</compilation>
</configuration>
請注意,你還是必須使用@import指令,讓單獨的頁面可以使用這些部件。