細細品味ASP.NET
最後更新:2017-02-28
來源:互聯網
上載者:User
asp.net ASP現在被從頭到腳地重建了,結果就是ASP.NET。它並不只是ASP 4.0,它是一個用於 Web開發的全新架構,其中包含了許多新的特性。ASP.NET提供了更易於編寫、結構更清晰的代碼,這些代碼很容易進行再利用和共用;ASP.NET使用編譯後的語言,從而提升效能和伸縮性;ASP.NET使用Web表單使開發更直觀,利用物件導向技術促進組件的再利用。另外,ASP.NET中還包括有頁面事件、Web控制項、緩衝技術以及伺服器控制項和對資料捆綁的改進。供 ASP.NET使用的庫以及在Microsoft.NET架構中允許通過Web 使用客戶商用函數,為程式員提供了更多新的開發機會。
ASP.NET的優勢
ASP.NET使代碼更加乾淨。現有的ASP 應用程式中,不管你將它們寫得怎麼樣,結構總是充滿了長長短短的代碼。而ASP.NET的代碼不僅更容易編寫,而且更加乾淨整潔,比ASP代碼更易於閱讀。同時,ASP.NET代碼的結構方式提高了其再利用性和共用性。
ASP.NET 改進了配置、伸縮性、安全性和可靠性。對於簡單的ASP應用程式,配置其實並不算什麼問題,但是當你移植到一個利用組件的N層結構中時就會遇到問題。當你對這些應用程式進行配置和維護時,DLL 陷阱問題(組件註冊、版本、鎖定的DLL等等)就會出現。ASP.NET中則取消了組件註冊以及DLL鎖定,全面使用了XML設定檔,從而解決了這個問題。這樣你只需要執行複製檔案的工作就能配置一個Web應用程式。
ASP.NET對各種不同的瀏覽器提供了更好的支援。對於ASP開發人員來說,瀏覽器安全色問題好象是一個永恒的問題。你或者為低一級的瀏覽器編寫代碼,例如用HTML 3.2,或者限制頁面的瀏覽範圍。無線應用程式協議WAP裝置的引入還會深化這個問題。本文中Web表單這部分描述了ASP.NET是如何解決瀏覽器安全色性問題的。
ASP.NET 造就了一類新的Web應用程式。目前的Web應用程式通常都是同一種模式:一套線性應用程式,然後將邏輯植入其中之一。ASP.NET允許開發人員打破這種單一模式,創造出更加動態而且伸縮性更強的應用程式,這種應用程式能夠更好地滿足公司的商業需求,並提供一個更加豐富的開發環境。
到這裡你可能會想,雖然這些目標都很高尚,但是它們會使編寫應用程式變得困難。然後恰恰相反,用ASP.NET 進行開發要簡單得多!
下面我們就來細細品味一下ASP.NET的強大特徵,包括:
●對編譯語言的支援
●Web表單
●跟隨頁面對象的頁面事件
●Web控制項
●Web Services
●緩衝技術
●調試和跟蹤
●代碼和內容隔離
●名稱空間的通用庫
●配置
使用經過編譯的語言
現有的ASP版本是基於指令碼語言的,如VBScript和JScript 。指令碼語言本身並沒有什麼錯,但是它們有兩大缺陷:它們是解釋型的,並且分類不嚴格。ASP.NET並沒有完全拋棄指令碼語言的概念,它引入了對全編譯語言的支援,使你能夠用Visual Basic編寫自己的伺服器端代碼,例如:
<script language=“vb” runat=“server”>
Visual Basic的一大優勢是其對嚴格分類變數的支援,因此以下的代碼在ASP.NET中是成立的:
Dim FirstName As String
除了Visual Basic和C++,你還可以使用最新的Microsoft語言 C#來編寫伺服器端代碼。C# 將C++ 中不實用的部分都去掉了,它更容易理解。用ASP.NET,編譯動作在頁面第一次裝載時發生。即便代碼是指令碼語言,它也會在執行前被編譯,因此 Jscript字碼頁面的效能也會得到提高。實際上,這是 .NET 架構的一個基本的新特徵。以前版本的語言編譯器對資料類型和對象是區別對待的,這就意味著唯一可以進行跨語言開發的就是建立COM對象。Microsoft .NET架構中的通用語言已耗用時間環境CLR允許對已經用通用已耗用時間支援編譯過的任何代碼進行緊密的互動作用,這就是新的Visual Basic和C# 編譯器將要做的:建立能在已耗用時間中被管理的代碼。
這樣做最大的優點是使得真正的跨語言開發成為可能。有了通用已耗用時間環境CLR,你可以用C#建立對象,並在 Visual Basic中通過繼承功能對它們進行擴充。現在的 Visual Basic .NET支援繼承功能,這樣你就可以在C# 中編寫組件,然後在Visual Basic中將它們設定成子集。雖然 Visual Basic、C#和指令碼語言是在開始的架構結構中被支援的語言,但是稍後其它語言,如Smalltalk、Eiffel、Pascal等等,也將會被支援。Microsoft .NET架構的一個優勢就是擴充非常得容易,因此使用一種新的語言僅僅需要為已耗用時間環境相容的輸出提供編譯器支援。
Web表單
ASP.NET Web Forms就是Web頁面,同現在你用 ASP編寫代碼所做的工作是一樣的。但是還不僅僅如此,ASP.NET Web Forms是在一個物件導向的編程模型上設計的,這樣代碼就能夠再利用,並且使應用程式代碼與頁面內容分隔開。在Visual Basic中,你將一個控制項拖曳到一個表單上,然後執行其下的事件程式。在傳統的 ASP中,這是不可能的,因為在使用者介面控制項和它們的伺服器端代碼之間沒有連結存在。但是在ASP.NET中,這樣的一個連結是存在的。所以,你可以編寫下面表1所示的代碼,而不用手動從變數表中拖出值:
表1 簡單ASP.NET Web Form常式
<html>
<script language=“vb” runat=“server”>
Sub SubmitButton_Click(Source As Object, E As EventArgs)
Response.Write (ÒYou entered Ò & Name.text)
End Sub
</script>
<body>
<form method=“post” runat=“server”>
Name: <asp:textbox id=“Name” runat=“server” /><br>
<asp:Button text=“Enter”
OnClick=“SubmitButton_Click” runat=“server” />
</form>
</body>
</html>
在表1中有兩點值得注意。第一是在表單上 runat=“server” 屬性和 asp:textbox控制項的使用,這可以告訴 ASP.NET 伺服器和客戶都可以使用這些控制項。如此使用的控制項叫做伺服器控制項。asp: 用做控制項名的首碼,它本身就識別了控制項是從哪來的。稍後我將討論這一點。第二個需要注意的細節是OnClick事件。開發DHTML 程式碼時,你經常要用到 OnClick事件,這是為了在瀏覽器中啟用一個事件。因為為控制項設定了runat=“server” 屬性,所以事件只在伺服器上被啟用。要對這個例子進行擴充,可以去掉 Response.Write,然後用一個基於伺服器的控制項來代替它,比如下面的表2代碼:
表2 使用基於伺服器的控制項
<html>
<script language=“vb” runat=“server”>
Sub SubmitButton_Click(Source As Object, E As EventArgs)
YouEntered.Text = ÒYou entered Ò & txtName.text
End Sub
</script>
<body>
<form method=“post” runat=“server”>
Name: <asp:textbox id=“txtName” runat=“server” /><br>
<asp:Button text=“Enter”
OnClick=“SubmitButton_Click” runat=“server” />
<br>
<asp:label id=“YouEntered” runat=“server”></span>
</form>
</body>
</html>
這個代碼運行相當好,很象一個傳統的客戶或Visual Basic表單,代碼也直觀多了。你可以用伺服器控制項來串連事件程序和基於伺服器的代碼。這些基於伺服器的控制項向瀏覽器發送純 HTML內容,其中不再含有用戶端指令碼。實際上,這其中一個重要的設計目的就是要堅持使用固有的 HTML 3.2元素代碼以提供最大可能的瀏覽器安全色性。比如說,表2中的代碼產生了以下HTML:
<html>
<body>
<FORM name=“HtmlForm2" method=“post” action=“Test.aspx” id=“HtmlForm2">
<INPUT type=“hidden” name=“__VIEWSTATE” value=“a0z664351470__x”>
Name: <input name=“txtName” type=“text” id=“txtName”><br>
<input type=“submit” name=“Button5" value=“Enter”>
<br>
<span id=“lblYouEntered”></span>
</FORM>
</body>
</html>
產生的程式碼是符合 HTML 3.2標準的。它執行一個標準投遞,將使用者輸入發送回同一個檔案。這裡沒有對伺服器狀態進行維護,也沒有用戶端指令碼對狀態進行維護。隱含的域執行對控制項狀態的維護,這意味著在頁面的“提交-返回”之間,控制項能自動回復狀態,而不需要任何編程幹預。雖然 ASP.NET Web控制項的預設輸出是符合HTML 3.2標準的內容,但是對於更進階的瀏覽器如Microsoft Internet Explorer 5.0,也可以輸出為DHTML格式。這樣你就能只使用一套伺服器控制項來編寫頁面,允許控制項根據瀏覽器決定發送哪種類型的輸出,從而允許你將發送 DHTML的控制項和用戶端指令碼用到最新版本的Internet Explorer中,將純 HTML 3.2內容發送到其它瀏覽器中。
頁面事件
在此前我提到 ASP.NET已經被從頭到腳地重寫了,但是我並沒有指出它是按照物件導向的思路重建的。在對象樹的頂部是Page對象,即頁面對象,ASP.NET的每個控制項、應用程式和頁面都是從這個對象中繼承來的,也就是說每個頁面都是頁面對象的一個例示。頁面的Load (裝載)事件是一個非常重要的事件,如下面的表3代碼所示:
表3 使用頁面事件
<html>
<script language=“VB” runat=“server”>
Sub Page_Load(Source As Object, E As EventArgs)
‘ code to run when page loads
End Sub
Sub SubmitButton_Click(Source As Object, E As EventArgs)
‘ code to run when button is clicked
End Sub
Sub Page_Unload(Source As Object, E As EventArgs)
‘ code to run when page unloads
End Sub
</script>
<form runat=“server”>
<asp:Button text=“Enter” OnClick=“SubmitButton_Click” runat=“server” />
<asp:label id=“YouEntered”/>
</form>
</html>
在這裡你看到了以前在Visual Basic中經常見到的同樣的 Load/Unload (裝載/卸載)過程。 當頁面被裝載時,Load事件被啟用,這時所有基於伺服器的控制項都可用。在與使用者的互動作用過程中會產生其它事件。最後,當頁面被卸載時啟用 Unload事件。
Web控制項
你可能會擔心,象 <asp:TextBox>這樣的控制項代表了一套需要你熟練運用的全新控制項。不過,它們並不難學,因為它們在HTML中都有對應者。例如,對於一個很簡單的文字框,在HTML 中,你是這樣做的:
<input type=“text” value=“Your Name”></input>
而相應的Web 控制項是這樣的:
<asp:TextBox Text=“Your Name” runat=“server” />
在這兩者中,你立刻就能注意到的是Web 控制項通過代碼“asp:”名稱空間來識別,並且同在XML中一樣,使用斜線來結束元素。你不是必須使用XML的格式,你也可以使用HTML格式,用一個分號來結束標記:</asp:TextBox>。但是你會發現,XML格式被用在許多代碼舉例中,並且代碼字數也較簡潔。名稱空間必須要使用,它負責識別文字框TextBox 控制項來自哪裡。所有的標準Web控制項都是 ASP名稱空間的一部分。當編寫自己的控制項時,這一點變得很重要。
TextBox控制項相對於標準的輸入框好象沒有多少優勢,但是你應該考慮一下面的三個輸入控制項:
<input type=“text” ...>
<input type=“password” ...>
<textarea rows=“5" ...>
它們都是用於HTML輸入的,但是並沒有一致性。但是如果使用下面的,是不是更簡單一些呢?
<asp:TextBox runat=“server” ...>
<asp:TextBox TextBoxMode=“Password” ...>
<asp:TextBox Rows=“5" ...>
你可以看到,一個簡單控制項包含了HTML中三個控制項的功能,而且更易記憶、更易編碼。
ASP.NET攜帶了5大類 Web控制項:
• 與HTML相對應的固有控制項
• 在頁面上提供資料流的清單控制項
•提供更豐富的UI(使用者介面)內容和功能的Rich控制項
• 完成各種表單驗證的確認控制項
• 為 WAP裝置封裝WML的行動控制項
固有的伺服器控制項與 HTML控制項相同,但是更加合理了,可提供更為一致的用途。這些控制項包括LinkButton(連結按鈕)、ImageButton(圖象按鈕)、HyperLink(超級連結)、TextBox(文字框)、CheckBox(複選框)、RadioButton(單選框)、DropDownList(下拉式清單)、ListBox(列表框)、Image(圖象)、Label(標籤)、Panel(面板)、Table(表格)、TableRow(表格行)、TableCell(表格單元)。
清單控制項包括Repeater(轉寄站)、DataList(資料列表)和DataGrid(資料柵格)。清單控制項還包括RadioButtonList(單選框列表)和 CheckBoxList(複選框列表),這樣就使建立單選框和複選框的列表變得簡單。
Rich控制項包括Calendar(日曆)和AdRotator(廣告旋轉)。Calendar控制項為低級的瀏覽器輸出純HTML,為進階瀏覽器輸出DHTML(如 Internet Explorer 5.0)。AdRotator輸出圖象,它有內建的旋轉代碼。
確認控制項包括RequiredFieldValidator(請求域確認)、 Compare Validator(比較確認)、RangeValidator(範圍確認)、RegularExpressionValidator(規範表達確認)、CustomValidator(顧客確認)和ValidationSummary(確認摘要)。這些控制項為開發人員在表單處理中建立確認提供了簡單的途徑。
有關行動控制項的資訊現在還沒有發布,但是可以肯定它們有助於構造啟用WAP的Web網站。
編寫新的控制項
你並不一定只局限於使用這些系統提供的控制項,自己編寫控制項也相當簡單。例如,如果想要一個控制項來封裝兩個文字框(可能是名和姓的輸入欄位),就可以這樣來編寫代碼:
<asp:Panel runat=“server”>
<asp:Textbox id=“txtFirstName” text=“First Name” runat=“server” />
<asp:Textbox id=“txtLastName” text=“Last Name” runat=“server” />
</asp:Panel>
可以把這個代碼儲存在檔案 Name.aspc (注意這個新副檔名)中,並將其作為一個Web表單控制項來對待。接著,就可以向 Web表單中增加以下內容:
<%@ Register TagName=“NameControl” TagPrefix=“Foo” Src=“Name.aspc” %>
<form>
<foo:NameControl runat=“Server”/>
</form>
這樣你就可以很容易地建立可以再利用的控制項了。這真實很美好 ;-) 你還可以直接在Visual Basic或 C#中建立控制項,允許它們成為其它控制項的子類,並且呈現任何它們所要求的輸出。因為控制項是用名稱空間來識別的,因此在控制項之間應該是沒有衝突的。實際上,控制項甚至可以使用同一個名字,只要它們在不同的名稱空間中就行。你會感覺到,這使得 ASP.NET非常具有擴充性,並且使編程環境變得越來越豐富。實際上有一個很大的提供豐富控制項的第三方市場。
資料捆綁控制項
新的Web控制項之一是資料柵格DataGrid,這是用於顯示成套資料的內建支援控制項。為了從SQL產生的資料中產生一個 HTML表格,你只需要建立 ADO+對象,並執行指令來擷取資料以作為柵格的資料來源,比如下面的表4代碼:
表 4 DaveSGrid1.aspx
<%@ Import Namespace=“System.Data.SQL” %>
<html>
<script language=“VB” runat=“server”>
Sub Page_Load(Sender As Object, E As EventArgs)
Dim myCommand As SQLCommand
myCommand = New SQLCommand(Òselect * from products”,
ÒServer=localhost; Database=AdvWorks; UID=sa”)
DataGrid1.DataSource = myCommand.Execute
DataGrid1.DataBind
End Sub
</script>
<body>
<ASP:DataGrid id=“DataGrid1" runat=“server” />
</body>
</html>
所需要做的就是將資料捆綁到資料柵格,然後就產生了一個整潔的HTML表格:
資料捆綁並不局限於來自資料庫的資料,你還可以捆綁到hash表格、數組、其它伺服器控制項、頁面的適當層,幾乎什麼都可以。如果預設的欄目不合適,還可以對其進行定製,讓其顯示你所感興趣的部分:
<asp:DataGrid id=“DataGrid1"
AutoGenerateColumns=“false” runat=“server”>
<property name=“Columns”>
<asp:BoundColumn HeaderText=“ Name” DataField=“ProductName”/>
<asp:BoundColumn HeaderText=“Description”
DataField=“ProductDescription”/>
</property>
</asp:DataGrid>
使用 BoundColumn 控制項選擇一個簡單的欄目,並指定欄的標題和這欄要捆綁到哪裡。 AutoGenerate=“false” 屬性負責確保柵格不會為你建立所有的欄目。如果想更複雜一些,也可以為這個欄目使用一個模板。
此前提到的Repeater和DataList控制項也支援模板,這樣就允許對控制項的外觀進行定製。Repeater實際上並沒有外觀,你必須要提供 UI,這就意味著必須要使用一個模板。相反,DataList控制項是一個捆綁到資料的列表,有一個預設的外觀和豐富的行為。為這兩個控制項添加模板的方法是一樣的:
<asp:DataList is=“DataList1" runat=“server”>
<template name=“HeaderTemplate”>
Here”s your list of titles<br>
</template>
<template name=“ItemTemplate”>
<%# DataBinder.Eval(Container.DataItem, “Title”) %> <br>
</template>
</asp:DataList>
有了這個模板template,你就可以指定用哪些 HTML控制項來組成資料捆綁控制項的每一部分。有5個模板的名字可以與 DataList控制項一起使用:HeaderTemplate用於控制項的最頂端部分,ItemTemplate 用於各個項目,Alternating-Item-Template用於其它項目,SeparatorTemplate用於各個項目之間的地區,FooterTemplate用於控制項的底部。
這個系統的好處在於:對於如何顯示介面,有大量的控制項可以使用。進一步使用產品列表,你就能用表7中的代碼來產生下圖所示的輸出:
表 7 DaveSGrid2.aspx
<asp:DataList id=“MyDataList” RepeatColumns=“2" runat=“server”>
<template name=“itemtemplate”>
<table cellpadding=10 style=“font: 10pt verdana”>
<tr>
<td width=1 bgcolor=“BD8672"/>
<td valign=“top”>
<img align=“top”
src=“<%# DataBinder.Eval(Container.DataItem,“ProductImageURL”) %>“ >
</td>
<td valign=“top”>
<b>Name: </b>
<%# DataBinder.Eval(Container.DataItem,”ProductName”) %><br>
<b>Description: </b>
<%# DataBinder.Eval(Container.DataItem,“ProductDescription”) %><br>
<b>Price: </b>
<%# DataBinder.Eval(Container.DataItem,”ProductPrice”, “$ {0}”) %>
</td>
</tr>
</table>
</template>
</asp:DataList>
這個代碼相當簡單,除了前面顯示的 DataList代碼外,不再需要更多的東西。代碼裡有一點值得注意,就是你可以規定出現的欄數,列表會自動處理欄的封裝。這樣就只需要一點格式化代碼,Web頁面就得到了極大的改進,而不再使用以前Web 頁面上的傳統柵格。
開發Web Services(Web服務)
在Internet上作為服務發布的軟體是 Web Services的核心。 ASP.NET提供了一個 Web Services的基礎構造環境,從而使開發人員能夠為這個服務模型建立服務。
現在我們來跟蹤一個簡單的例子。比如說你要從一個線上書商那裡購買書籍,他們有一個跟蹤系統,使你能夠看到自己定單的狀態。書商用一個陸地運輸公司來運輸你訂的貨。這個運輸公司也有一個跟蹤系統。這樣,為了得到你的定單的確切狀態,你要查看兩個網站。如果書商能夠將它自己的定單狀態和運輸公司的狀態資訊一同顯示出來,就會很方便。
Web Services就允許你在Web上將客戶商用函數暴露給公眾,例如包裹跟蹤細節。編寫一個對象,將其方法作為URI暴露出來,URI返回一個XML資料。現在書商可以調用運輸公司的Tracing Service,並將跟蹤的結果合并到它自己的定單跟蹤應用程式中。以下是運輸公司如何用 C#建立一個服務的代碼:
<%@ WebService language=“c#” %>
using System.Web.Services;
public class Shipping {
[WebMethod]
public String OrderStatus(String OrderNumber) {
// code here to retrieve order details from data store
return Status;
}
}
以上代碼儲存於 Tracking.asmx檔案中,位於運輸公司 Web網站的應用程式目錄中。這樣書商就可以使用多種方法來調用這個 Web Services了。比如使用 HTTP-GET,參數同查詢字串一同被傳遞:
http://orders.ups.com/orders/Tracking.asmx/OrderStatus?OrderNumber=BRU123
書商還可以使用 HTTP-POST,方法的參數作為表單值在post體內傳遞。或者還可以使用HTTP-SOAP,方法的參數被包裹在一個工業標準 XML格式中。
現在使用者只需要在書商那裡查詢他們的定單細節,書商的 Web 應用程式就會從運輸公司那裡收集跟蹤資訊,然後同書的狀態一起返回。書商也可以將它的定單狀態細節作為一個Web Services暴露出來,讓其它人使用它。
Web Services的偉大之處在於,它允許你暴露一個服務而不必暴露資料或所有的商業規則。當自動供應商業服務的同時,代碼和資料都是安全的。在以後幾年裡,隨著B2B方案的可利用,Web Services的市場會得到快速的增長。