- 新手學(xué)ASP.NET 3.5網(wǎng)絡(luò)開發(fā)
- 孔琳俊 陳松等編著
- 2940字
- 2018-12-27 20:32:14
1 走進(jìn)ASP.NET 3.5
ASP.NET 3.5是基于.NET 3.5框架的動態(tài)頁面開發(fā)技術(shù),秉承了ASP.NET 2.0的組件開發(fā)技術(shù),提供Web開發(fā)所需要的大部分組件,如登錄、驗證、數(shù)據(jù)源管理、數(shù)據(jù)顯示、網(wǎng)頁導(dǎo)航設(shè)計等。開發(fā)人員使用ASP.NET 3.5,不僅可以開發(fā)出美觀的界面,還可以通過后臺技術(shù),實現(xiàn)數(shù)據(jù)管理、動態(tài)頁面更新等。
本章主要介紹最基本的Web開發(fā)技術(shù),包括頁面的前臺設(shè)計和后臺實現(xiàn)、服務(wù)器控件的使用和動態(tài)響應(yīng)等,通過本章的學(xué)習(xí),可以開發(fā)簡單的網(wǎng)站,實現(xiàn)網(wǎng)站的前后臺交互和基本界面設(shè)計。
1.1 ASP.NET 3.5概述
本節(jié)從基本的網(wǎng)站設(shè)計入手,介紹如何使用ASP.NET 3.5方便快捷地開發(fā)網(wǎng)站。主要從全局入手,介紹網(wǎng)站設(shè)計的一些注意事項和基本配置。
1.1.1 ASP.NET 3.5——動態(tài)頁面開發(fā)利器
ASP.NET 3.5是基于C#開發(fā)語言的一種動態(tài)頁面開發(fā)技術(shù),因為其提供了一系列網(wǎng)站開發(fā)所需要的組件,開發(fā)人員只需輕松拖曳就可以完成界面的設(shè)計和實現(xiàn),所以被稱為動態(tài)頁面開發(fā)利器。
評判一種開發(fā)技術(shù),需要從開發(fā)速度和運行效率來考慮。因為ASP.NET 3.5提供豐富的組件,所以其開發(fā)速度是普通Web開發(fā)技術(shù)無法比擬的,在ASP.NET 3.5中,共提供了9類組件,如圖1.1所示。最后的“常規(guī)”組件為空,不算入其中。

圖1.1 ASP.NET 3.5提供的組件
其中各類組件的基本功能如下所示。
○ 標(biāo)準(zhǔn):提供頁面最基本的服務(wù)器控件,如按鈕、標(biāo)簽、文本框等,這是常用的頁面控件。
○ 數(shù)據(jù):包括數(shù)據(jù)顯示控件和數(shù)據(jù)源控件,數(shù)據(jù)顯示控件就是常用的網(wǎng)格控件GridView等,數(shù)據(jù)源控件就是方便讀取數(shù)據(jù)源的控件,如讀取SQL Server數(shù)據(jù)庫的SqlDataSource、支持LINQ查詢的LinqDataSource。
○ 驗證:用來檢查頁面上用戶的輸入。比如有些文本框必須填寫、兩個密碼是否相等的檢查。
○ 導(dǎo)航:用來實現(xiàn)頁面上的各種導(dǎo)航組件。如常見的菜單、目錄樹等。
○ 登錄:常用的注冊、登錄、密碼找回等控件,方便用戶的注冊和管理。
○ WebParts:常稱為Web部件,可在網(wǎng)頁上設(shè)計不同的區(qū)域,用戶也可以自定義網(wǎng)頁的區(qū)域,效果類似于現(xiàn)在比較流行的Blog。
○ AJAX Extensions:最新的AJAX組件,可支持動態(tài)局部刷新頁面,還可以從微軟的AJAX網(wǎng)站上,下載更多的AJAX組件,實現(xiàn)最新的Web 2.0功能。
○ 報表:封裝了最流行的水晶報表組件,可方便地定制各種財務(wù)報表。
○ HTML:最普通而又最常用的客戶端組件,一般只出現(xiàn)在客戶端,而不與服務(wù)器交互,如果要與服務(wù)器交互,盡量使用標(biāo)準(zhǔn)類中的組件,因為在ASP.NET 3.5中,削弱了HTML控件的服務(wù)器處理功能,所以盡量把HTML控件和標(biāo)準(zhǔn)控件區(qū)分開。
說明
HTML控件就是常說的客戶端控件,標(biāo)準(zhǔn)控件就是常說的服務(wù)器端控件。客戶端控件通常不與服務(wù)器交互,這樣可以提高頁面運行效率。
1.1.2 創(chuàng)建網(wǎng)站
前面介紹過,網(wǎng)站需要有一個網(wǎng)站地址,這樣方便用戶查找。本章從一個網(wǎng)站的地址和類型入手,學(xué)習(xí)創(chuàng)建網(wǎng)站的過程。
打開VS2008,單擊“文件|新建|網(wǎng)站”菜單,打開新建網(wǎng)站窗口,如圖1.2所示。其中圖中標(biāo)注的兩部分需要特別注意:一是ASP.NET 3.5提供的網(wǎng)站模板,另一個是網(wǎng)站的虛擬地址。

圖1.2 新建網(wǎng)站窗口
網(wǎng)站模板是一些已經(jīng)加載好程序集的模板,如果用戶創(chuàng)建一個“ASP.NET Web服務(wù)”,則會自動生成一個Web服務(wù)文件,并且在web.config文件中,加載Web服務(wù)所需要的基本程序集。
網(wǎng)站虛擬地址就是用戶在瀏覽器中瀏覽網(wǎng)站需要輸入的地址,本例為“localhost/WebSite”。在瀏覽器中如果要訪問百度網(wǎng)站,只需要輸入“www.baidu.com”就可以,如果要訪問本例創(chuàng)建的網(wǎng)站,就輸入“localhost/WebSite”。
提示
localhost表示服務(wù)器在本機。
在圖1.2中,還有兩個地方需要注意:網(wǎng)站所使用的.NET框架和網(wǎng)站的后臺語言。VS2008中提供了3種框架版本:.NET 2.0、.NET 3.0和.NET 3.5,通過圖1.2右上方的下拉框選擇具體版本。在圖的左下方,還提供一個語言下拉框,提供兩種網(wǎng)站開發(fā)語言:Visual C#和Visual Basic。本書所有實例都選擇Visual C#完成。
配置好網(wǎng)站的框架、開發(fā)語言和地址后,單擊“確定”按鈕,就可以創(chuàng)建一個新的網(wǎng)站了。
1.1.3 設(shè)計網(wǎng)站
設(shè)計網(wǎng)站,包括配置網(wǎng)站的各種屬性,管理網(wǎng)站的各個文件夾,設(shè)計網(wǎng)站需要的數(shù)據(jù)等。因為目前學(xué)習(xí)的網(wǎng)站都比較簡單,所以本小節(jié)只簡單的介紹設(shè)計網(wǎng)站所需要的4個方面。
(1)網(wǎng)站安全的設(shè)計。
ASP.NET提供了一個可視化工具來管理網(wǎng)站的安全。單擊“網(wǎng)站|ASP.NET配置”菜單,會打開一個“應(yīng)用程序管理”,如圖1.3所示。其中“安全”鏈接就是用來設(shè)置網(wǎng)站的相關(guān)安全屬性,包括網(wǎng)站的用戶管理、角色管理和管理規(guī)則。

圖1.3 應(yīng)用程序管理
提示
如果要正確使用“安全”鏈接,必須已經(jīng)配置好web.config中有關(guān)“數(shù)據(jù)提供者”的信息,這個會在后面介紹Web開發(fā)詳細(xì)知識的時候涉及。
(2)網(wǎng)站個性的設(shè)計。
網(wǎng)站個性化設(shè)計主要就是Profile的設(shè)計,用來保存用戶的一些個人信息,如當(dāng)前用戶的購物籃,再如為你自己的Blog定義的樣式。這些是Web 2.0時代的特征,即用戶個性的體現(xiàn)。要使網(wǎng)站支持個性設(shè)計,必須在web.config中啟用profile屬性“<profile enabled=true”/>。具體的使用會在第18章介紹。
(3)網(wǎng)站數(shù)據(jù)庫的設(shè)計。
一個完整的網(wǎng)站,需要保存網(wǎng)站需要的一些數(shù)據(jù),如當(dāng)前網(wǎng)站的用戶、當(dāng)前論壇的所有帖子、當(dāng)前Blog的所有文章,這些數(shù)據(jù)都需要一個地方存儲。ASP.NET 3.5提供了兩類數(shù)據(jù)存儲方案:數(shù)據(jù)庫和文件。其中數(shù)據(jù)庫包括SQL Server和Access,文件主要是XML文件。ASP.NET 3.5中也提供了訪問這些數(shù)據(jù)所需要的控件和類庫,開發(fā)人員可以非常方便的實現(xiàn)各種數(shù)據(jù)操作。
(4)網(wǎng)站布局(主題)的設(shè)計。
從ASP.NET 2.0開始,就支持母版頁和主題的設(shè)計,ASP.NET 3.5修訂了以前版本中的一些錯誤,同時提高了母版頁的一些嵌套調(diào)用功能。因為ASP.NET 3.5提供了母版和主題的模板,開發(fā)人員只需要添加簡單內(nèi)容,就可以為網(wǎng)站設(shè)計統(tǒng)一的布局,并允許用戶自定義各種主題樣式,這些詳細(xì)的內(nèi)容會在第15~17章介紹。
1.1.4 網(wǎng)站的前臺和后臺
新網(wǎng)站創(chuàng)建后,默認(rèn)只有3個文件:web.config、Default.aspx和Default.aspx.cs。其中web.config是網(wǎng)站必需的配置文件,此處不講,Default.aspx是網(wǎng)站的前臺文件,Default.aspx.cs是網(wǎng)站的后臺文件。
前臺文件其實就是網(wǎng)頁的界面設(shè)計,一般用于呈現(xiàn)各種網(wǎng)頁布局,后臺文件用來處理用戶與服務(wù)器的各種交互,可以處理非常復(fù)雜的功能,如讀取數(shù)據(jù)、保存用戶的操作等。
1.前臺文件
打開“Default.aspx”文件,如圖1.4所示,主要分為3部分。

圖1.4 前臺文件
(1)設(shè)置當(dāng)前網(wǎng)頁的開發(fā)語言和關(guān)聯(lián)的后臺文件?!癓anguage”屬性用來設(shè)置開發(fā)語言是“C#”,“CodeFile”用來設(shè)置與當(dāng)前前臺文件關(guān)聯(lián)的后臺文件是“Default.aspx.cs ”。
(2)前臺文件的3種模式:設(shè)計、拆分和源。在設(shè)計模式下,以所見即所得的樣式,顯示當(dāng)前頁面的設(shè)計,即程序員看到的樣式就是將來網(wǎng)頁的最終樣式。在源模式下,就是圖1.4的顯示樣式,顯示的是當(dāng)前頁面的HTML源代碼。在拆分模式下,當(dāng)前界面被分為上下兩部分:一部分是“設(shè)計”模式的內(nèi)容,一部分是“源”模式的內(nèi)容,這種可以在修改源代碼后,立刻顯示頁面最終布局。
(3)頁面的HTML源代碼,可以看到被“<html></html>”封裝的內(nèi)容,其中會包含一個窗體“form”,默認(rèn)名為“form1”,開發(fā)人員如果要在頁面中添加控件和內(nèi)容,必須添加在此窗體內(nèi)。
提示
前臺文件,不一定必須是.aspx擴展名的文件,可以是.html擴展名。
2.后臺文件
打開“Default.aspx.cs”文件,如圖1.5所示,主要包括3部分。

圖1.5 后臺文件
(1)命名空間的引用。.NET 3.5提供了多個命名空間,用來分類封裝一些Web開發(fā)的類庫,開發(fā)人員可以直接調(diào)用這些類庫中的方法,通過幾行代碼就實現(xiàn)復(fù)雜的功能。應(yīng)用命名空間使用“using”關(guān)鍵字,分號結(jié)束。其中“System”命名空間是最基礎(chǔ)的類庫,所有的頁面和窗體都必須先引用它。
(2)當(dāng)前頁面所屬的類。默認(rèn)類名為“ Default”,可以看到在類定義時,用到了關(guān)鍵字“partial”,其表示這個類定義是整個類的一部分,也就是在其他地方還有此類的其他定義。其他定義被隱藏起來,主要是對頁面中相關(guān)控件的一些定義,那些定義自動生成,不需要開發(fā)人員關(guān)注。
(3)默認(rèn)生成的頁面事件“Page Load”,此事件發(fā)生在頁面被加載的時候,即用戶打開頁面的時候。所有的事件都必須有兩個參數(shù):“sender”和“e”。sender表示事件的發(fā)起者,e用來設(shè)置事件中需要的一些參數(shù)。
用戶看到的是前臺文件,操作前臺文件后,才會調(diào)用后臺文件的內(nèi)容,如果當(dāng)前的界面只是用來顯示一些內(nèi)容,則后臺文件不需要定義。如果要調(diào)用其他一些類庫,如要使用XML文件的類,只需要在“1”標(biāo)記的地方,使用“using”引用相關(guān)的命名空間即可。
1.2 ASP.NET 3.5動態(tài)網(wǎng)頁剖析
既然是動態(tài)網(wǎng)頁,那就需要實現(xiàn)網(wǎng)頁和用戶交互的功能,這就是常說的“事件”處理。事件是一件事情的發(fā)生過程,觸發(fā)事件就是用戶操作網(wǎng)頁引起的網(wǎng)頁和服務(wù)器的交互。因為網(wǎng)頁一般分為前臺和后臺,所以本節(jié)介紹事件時,分別介紹了前臺事件和后臺事件。
1.2.1 前臺客戶端的事件處理
客戶端的事件一般在客戶端就可以完成,不需要與服務(wù)器進(jìn)行交互,這樣就能提高頁面的響應(yīng)能力。要使用客戶端事件,就需要使用客戶端控件,這些控件包含在工具箱的HTML組件中。本節(jié)通過一個實例來演示前臺客戶端的事件處理。
新建一個測試網(wǎng)站,在Default.aspx前臺文件中,設(shè)計如下所示的代碼。在界面中添加了兩個HTML控件:文本框和按鈕。其中為按鈕添加了單擊事件“onclick”,事件必須調(diào)用一個JavaScript方法。
1. <html xmlns="http://www.w3.org/1999/xhtml"> 2. <head runat="server"> 3. <title>無標(biāo)題頁</title> 4. <script type="text/javascript"> 5. function test() 6. { 7. alert("您輸入的是:"+document.getElementById("Text1").value); 8. } 9. </script> 10. </head> 11. <body> 12. <form id="form1"runat="server"> 13. <div> 14. <input id="Text1"type="text"/> 15. <input id="Button1"type="button"value="提交"onclick="test()"/> 16. </div> 17. </form> 18. </body> 19.</html>
為了測試用戶單擊后是否向服務(wù)器返回數(shù)據(jù),需要在后臺文件的“Page Load”事件中,添加一個測試項,顯示當(dāng)前的時間,代碼如下所示。
1. protected void Page_Load(object sender,EventArgs e) 2. { 3. //顯示當(dāng)前時間 4. Response.Write(DateTime.Now.ToString()); 5. }
運行這個網(wǎng)頁,效果如圖1.6所示。在文本框中輸入內(nèi)容,單擊“提交”按鈕,如圖1.7所示,這個時候可以看到時間并沒有發(fā)生變化,即沒有觸發(fā)后臺事件,沒有與服務(wù)器交互。

圖1.6 客戶端事件實例效果

圖1.7 客戶端按鈕單擊后效果
1.2.2 后臺服務(wù)器端的事件處理
后臺服務(wù)器端的事件,就會與服務(wù)器進(jìn)行交互。這種事件一般通過服務(wù)器控件完成,除HTML控件外,其他的各類組件都是服務(wù)器控件,常用的就是“標(biāo)準(zhǔn)”控件組的內(nèi)容。本節(jié)通過對上面實例的擴展,實現(xiàn)一個后臺事件的處理。
在Default.aspx下設(shè)計與圖1.6相似的布局,不同的是前面使用的是HTML控件,本例使用服務(wù)器端控件,代碼如下所示。這里按鈕事件同樣是使用“onclick”屬性指定,不同的是指定的內(nèi)容不再是一個JavaScript方法,而是存在于后臺文件中的一個事件“Button1 Click”。
1. <html xmlns="http://www.w3.org/1999/xhtml"> 2. <head runat="server"> 3. <title>無標(biāo)題頁</title> 4. </head> 5. <body> 6. <form id="form1"runat="server"> 7. <div> 8. 9. <asp:TextBox ID="TextBox1"runat="server"></asp:TextBox> 10. <asp:Button ID="Button1"runat="server"onclick="Button1_Click"Text="提交"/> 11. 12. </div> 13. </form> 14. </body> 15. </html>
事件“Button1 Click”的代碼如下所示,同樣是顯示一個提示窗口,提示用戶的輸入內(nèi)容。
1. protected void Button1_Click(object sender,EventArgs e) 2. { 3. Response.Write("<script language='javascript'> alert('您輸入的是:"+ TextBox1.Text+"')</script>"); 4. }
為了明顯的查看是否與服務(wù)器進(jìn)行了交互,還要在后臺文件的“Page Load”事件中,顯示當(dāng)前的時間,代碼參考上一小節(jié)的介紹。
運行當(dāng)前網(wǎng)頁,默認(rèn)運行效果如圖1.8所示,這個與圖1.6相似。在文本框內(nèi)輸入內(nèi)容,然后單擊“提交”按鈕,此時可以看到,時間發(fā)生了變化,如圖1.9所示。因為只有與服務(wù)器交互,時間才會發(fā)生變化,從此處可以看出,后臺事件處理一定會與服務(wù)器進(jìn)行交互。

圖1.8 服務(wù)器端事件實例效果

圖1.9 服務(wù)器端按鈕單擊后效果
1.2.3 網(wǎng)站處理網(wǎng)頁的順序和原理
既然網(wǎng)頁分為前臺和后臺,那么就會有一個處理順序的問題,況且前臺和后臺也不僅僅是只有一個事件。本節(jié)介紹一個網(wǎng)頁的完整處理過程,其實就是一個事件處理的順序,整個事件的完整處理過程,就是一個頁面的生命周期。
網(wǎng)頁的生命周期主要分為10步,也就是10個需要處理的事件。從用戶打開網(wǎng)頁開始,到網(wǎng)頁從服務(wù)器獲取數(shù)據(jù),再到網(wǎng)頁的完全顯示,總共經(jīng)歷10個事件,下面有序的介紹這10個事件,介紹順序就是網(wǎng)頁的處理順序。
(1)初始化對象:頁面的控件(包括頁面本身)的初始狀態(tài)。通過在后臺文件的構(gòu)造函數(shù)中聲名所有對象完成,聲明對象后,頁面就知道要創(chuàng)建多少對象,以及這些對象的類型。頁面通過“OnInit”事件完成此操作。
(2)導(dǎo)入ViewState數(shù)據(jù):在頁面初始化事件后,所有控件就可以通過其ID被程序訪問。在LoadViewState這個事件中,所有的控件將獲得它們的第一個屬性:ViewState屬性。這個屬性最終將被返回給服務(wù)器,以判斷這個頁面是已經(jīng)被用戶訪問完畢,還是仍在被用戶訪問。其實就是一個緩存控件的功能,在被服務(wù)器返回數(shù)據(jù)的頁面中,查看其源代碼可以看到一個名為“ VIEWSTATE”的隱藏控件。
(3)用LoadPostData處理Postback數(shù)據(jù):在頁面創(chuàng)建的這個階段,服務(wù)器對頁面上的控件所提交的數(shù)據(jù)進(jìn)行處理。當(dāng)一個頁面被提交時,框架就在每個控件上執(zhí)行一個IPostBackDataHandler接口操作。然后頁面執(zhí)行LoadPostData事件解析頁面,找到每個執(zhí)行了IpostBackDataHandler接口操作的控件,并用postback數(shù)據(jù)更新這些控件狀態(tài)。
(4)導(dǎo)入對象:導(dǎo)入對象是在Load事件中,在這里所有對象都被實例化了。所有的對象第一次被布置在DOM頁面里。這樣,對象就可以從客戶端獲得各種屬性,如寬度、高度、值、可見性等。
(5)RaisePostBackChanged事件:這個事件發(fā)生在所有的控件執(zhí)行了IPostBackDataHandler接口操作,并被正確的postback數(shù)據(jù)更新后。在這一步中,每個控件都被賦予一個布爾值,來標(biāo)志該控件有沒有被更新。
(6)處理客戶端PostBack事件:由postback(回發(fā))數(shù)據(jù)在服務(wù)器端引起的事件處理完后,產(chǎn)生postback數(shù)據(jù)的對象,就會執(zhí)行RaisePostBackEvent事件。
(7)預(yù)先呈遞對象:可以改變對象,并將改變后的對象保存,此時就是這一步——預(yù)先呈遞對象??梢栽谶@一步對控件的屬性、控件樹等結(jié)構(gòu)作出最后的修改。在這一步之后,對對象的所有修改將最終被鎖定。此步通過OnPreRender事件來完成。
(8)保存ViewState:所有對頁面控件的修改完成后viewstate就被保存了。所有對象的狀態(tài)數(shù)據(jù)還是保留在一個隱藏控件里,呈現(xiàn)頁面的對象狀態(tài)數(shù)據(jù),也是從這一步中獲取。在SaveViewState事件中,其值被保存到viewstate對象中,然而這時不允許再在頁面對控件進(jìn)行修改。
(9)呈遞給頁面:給瀏覽器輸出頁面的時候觸發(fā)的是Render事件。在Render事件中,頁面調(diào)用其中的對象并將它們呈遞給瀏覽器。這一步仍然可以做一些修改動作,不過已經(jīng)與服務(wù)器無關(guān),只是客戶端的一些顯示上的變化而已。
(10)銷毀對象:服務(wù)器把頁面呈現(xiàn)給瀏覽器后,所有的對象都應(yīng)該被銷毀,這通過Dispose事件完成。此時應(yīng)該銷毀所有在建立這個頁面時創(chuàng)建的對象。此步驟中,所有的處理已經(jīng)完畢,所以銷毀任何對象都不會產(chǎn)生錯誤,包括銷毀頁面對象。
承上啟下
■ 學(xué)完本章后,讀者需要回答:
1.動態(tài)網(wǎng)頁是如何“動”起來的?
2.作為一種開發(fā)動態(tài)網(wǎng)頁的技術(shù)ASP.NET有什么優(yōu)點?
3.如何創(chuàng)建網(wǎng)站?
4.ASPX頁面由哪幾部分元素構(gòu)成?
5.網(wǎng)頁的前臺和后臺分別指什么?
6.如何利用事件對ASPX頁面作出動態(tài)響應(yīng)?
7.一個網(wǎng)頁的生命周期有多少個事件?
■ 在下一章中,讀者將會了解:
1.類和對象的概念。
2.在C#中實現(xiàn)類。
3.用VS.NET管理類。
4.類的屬性和方法詳述。
5.類的繼承和重載機制。
6.接口的相關(guān)概念和定義。
- Oracle Database In-Memory(架構(gòu)與實踐)
- HTML5游戲開發(fā)案例教程
- Mastering LibGDX Game Development
- Ext JS 4 Web Application Development Cookbook
- Android移動應(yīng)用開發(fā)項目教程
- Python物理建模初學(xué)者指南(第2版)
- Mastering Unreal Engine 4.X
- Mastering Drupal 8
- Visual FoxPro數(shù)據(jù)庫程序設(shè)計
- TensorFlow 2.0深度學(xué)習(xí)應(yīng)用實踐
- Mastering High Performance with Kotlin
- Java入門經(jīng)典
- WebRTC Cookbook
- 零基礎(chǔ)學(xué):微信小程序開發(fā)
- Node Cookbook