ASP.NET中包含了一種新方法:將商業(yè)邏輯代碼從表達(dá)代碼中分離出來。這通常被稱為背后的代碼,功能非常強(qiáng)大,并且非常容易執(zhí)行。實(shí)現(xiàn)步驟就是:向ASP.NET 頁面中增加用戶界面元素,并為它們指定屬性“runat=server”。然后,用.NET語言創(chuàng)建一個(gè)類文件來操作這些用戶界面元素。最后,在ASP.NET 頁面頂部增加一個(gè)指令,將用戶界面與操作它的類文件附著在一起。
用一個(gè)簡單的例子就能展示它是如何完成的。下面創(chuàng)建一個(gè)名叫WebPage.aspx的ASP.NET頁面,在其中粘貼以下代碼:
<%@ Page Language="VB" Inherits="dotNet101.MySample.WebPage" %> <html> <head> <title>Code-Behind Demo</title> </head> <body> <form id="messageForm" runat="server"> <asp:TextBox id="message" runat="server" /> <asp:Button id="submit" OnClick="submit_OnClick" Text="Send Message" runat="server" /> </form> </body> </html>
請注意增加到“Page”指令中的“Inherits”屬性,它負(fù)責(zé)通知ASP.NET頁面應(yīng)該為其商業(yè)邏輯使用“dotNet101.MySample.WebPage”類。我們已經(jīng)向這個(gè)頁面增加了兩個(gè)ASP.NET服務(wù)器控件,并且為它們和Form控件本身指定了“runat=server”屬性。這些都是背后的代碼類將要操作的控件。當(dāng)用戶點(diǎn)擊“submit”(提交)按鈕時(shí),指定給Button服務(wù)器控件的“OnClick”屬性就會(huì)告訴ASP.NET引擎激活背后代碼類中的submit_OnClick事件處理器。
下面,我們需要?jiǎng)?chuàng)建一個(gè)背后代碼類文件來操作ASP.NET頁面。創(chuàng)建一個(gè)名為CodeBehind.vb的文件,類的Visual Basic.NET 代碼如下:
Imports System Imports System.Web Imports System.Web.UI Imports System.Web.UI.WebControls Imports System.Web.UI.HtmlControls Namespace dotNet101.MySample Public Class WebPage : Inherits Page Protected messageForm As HtmlForm Protected message As TextBox Public Sub submit_OnClick(sender As Object, e As EventArgs) Dim output As Label = New Label output.Text = "You just typed: " & message.Text messageForm.Controls.Add(output) End Sub End Class End Namespace
在這個(gè)類文件中,我們引入了許多名稱空間,從而幫助背后代碼的處理。如果我們沒有引入這些名稱空間的話,就無權(quán)使用適當(dāng)?shù)?NET對象來使背后代碼工作。然后我們要指定自己的定制名稱空間。這樣以來,如果我們愿意的話,就可以在一個(gè)文件中包含一個(gè)以上的背后代碼類。否則,每個(gè)背后代碼都需要存在于它自己的文件中,你就需要在ASP.NET頁面“Page”指令的“Src”屬性中指定這個(gè)文件。
我們的WebPage類是從普通的Page(頁面)對象中繼承來的,因此它有權(quán)使用它的固有服務(wù)。這樣,就可以與ASP.NET 頁面相互作用,并且如果必要的話,可以在Page (頁面)層事件,如Page_Init 和 Page_Load中放置事件。在這個(gè)例子中,我們只是想對ASP.NET頁面上的提交按鈕的點(diǎn)擊做出響應(yīng),所以我們執(zhí)行以前在ASP.NET 頁面中引用過的submit_OnClick 事件處理器。在事件處理器內(nèi)部,我們聲明并且初始化一個(gè)新的Label(標(biāo)簽)服務(wù)器控件。然后我們抓取“message”TextBox (信息文本框)服務(wù)器控件的內(nèi)容,并將其分配給新的Label(標(biāo)簽)服務(wù)器控件。最后,我們向Form(表單)服務(wù)器控件的Controls(控件)集合中增加Label(標(biāo)簽)服務(wù)器控件。這樣,當(dāng)頁面重新裝載時(shí),信息就會(huì)被顯示在頁面上。
要注意我們聲明受保護(hù)的變量“messageForm”和“message”來存放在ASP.NET頁面上對它們相應(yīng)控件的引用,正是這些聲明使我們能夠從背后代碼類中看到和操作控件。實(shí)際上,背后代碼類在遺傳層次上比ASP.NET 頁面本身的位置還要高,因此在ASP.NET 頁面上相應(yīng)的控件只是通過遺傳在簡單地“執(zhí)行”背后代碼類中的聲明。
例子的最后一步是編譯背后代碼類,這可以通過在命令行執(zhí)行使用下面的指令完成:
vbc /t:library /out:dotNet101.MySample.dll /r:System.dll,System.Web.dll CodeBehind.vb
運(yùn)行了這個(gè)指令后,一個(gè)名為“dotNet101.MySample.dll”的文件就會(huì)出現(xiàn)在目錄中,然后將這個(gè)文件放在ASP.NET站點(diǎn)的 “bin”
|