VB.NET開發互聯網應用
盡管在Visual Basic 6中也有一些有關互聯網功能的組件,例如WebClasses、Winsock和 WebBrowser控制,但也僅此而已,它再也沒有其他更令人激動的功能了。尤其是WebClasses,更象是后來添上去的,簡直可以說是沒有一點用處。
但在VB.NET中,網絡功能則扮演著重要的角色。首先,VB.NET中有Web Services,它將是DCOM的取代者。其次,VB.NET中還有Web Forms。Web Forms可以使用戶無需使用古老的ASP或者CGI就能有效地建立全交互的互聯網網站。(僅僅是理論上是如此,我并不希望你真的這樣作。)
理論
在介紹Web Forms的具體細節之前,讓我們先抽出一點時間來介紹一些理論方面的基礎知識。
那么我們現在使用的互聯網開發工具有什么不足之處呢?對于任何比較重要的開發活動,一般都需要用到ASP,但我必須說明的是,我并不喜歡它。
首先,它會使我們所編寫的代碼顯得凌亂。我們必須將表示層(實際的HTML代碼)與ASP代碼混在一塊兒。我們應該將所有代碼都隱藏在窗體的后面,盡管有幾種方法能夠解決這一問題,但并不是十分理想。
其次,必須浪費時間對所有使用老式計算機的用戶提供支持,如果這些用戶的瀏覽器不支持JavaScript,我們就需要發現這一問題,并通過修改網頁,滿足用戶的需求。
此外,還存在狀態管理問題。如果有人登錄了網站,而我們希望知道有關它的基本情況,就需要使用Session對象。當有多臺機器需要訪問Session對象時,網站的負荷就會很大,這時我們又會遇上麻煩。
令人不可思議的是,VB.NET中的Web Forms將能夠使所有這些問題迎刃而解。Web Forms是全新的ASP.NET(不再是ASP+),它們可以使用我們在VB.NET中有效地創建交互式互聯網網頁,而且這一工作還非常地輕松。
我們只要簡單地在VB.NET中創建一個Web Form即可。這一過程與設計一個WebClass有點類似,但令人遺憾的是,我們只能在FrontPage中設計好網頁,然后把生成的HTML代碼傳送給VB.NET中的Web Form。
提示:盡管可以將在FrontPage中生成的HTML代碼傳送給VB.NET中的Web Form,但這與事實有一定的出入。在我的多次試驗中,似乎在網頁比較簡單時沒有什么問題,但如果網頁的輸出變得復雜時,就會出錯。在以后的版本中這一問題應該得到修正。
因此,我們可以通過Web Form創建基本的網頁,然后在VB.NET中添加交互性元素━━例如文字框或提交按鈕,此外,還可以在其中添加不需要進行獨立下載的更高級的HTML功能━━Web Controls。這樣設計出來的網頁可以兼容所有的瀏覽器。
提示:VB.NET中捆綁有許多Web Controls,例如,我們在稍后會使用到的Calendar控制。
在設計出網頁和添加上交互性元素后,還需要再添加一些代碼使得二者能夠更好地融合在一塊兒。也就是說,我們在Web Form上有了一個文本框和按鈕,但還需要編寫一段代碼,獲得在文本框中輸入的數據并在標簽中顯示它,或者把它添加到數據庫中、或者在一個用戶列表中進行校驗,然后把用戶定期導向到成員區中。
這里的關健問題是我們可以將整個網頁和對象當作一個對象來處理。你再也無需象在原來的ASP中那樣請求一些窗體字段,而只需象在Windows Form中那樣調用對象即可。
在把ASP.NET與ASP進行比較后,我們再來看看我在上面提出的問題,并找出如何解決它們的辦法。
首先,是HTML、ASP代碼混用的問題。在VB.NET中不會遇到這一問題,HTML網頁與所使用的代碼是完全分離的,在Web Form上只有一行代碼與所使用的代碼模塊有關,其他的工作有互聯網服務器來完成。
提示:象ASP文件有.ASP后綴那樣,Web Forms有一個.ASPX后綴。當互聯網服務器向用戶提交這一網頁時,.NET Framework首先自動地對它進行處理,例如,Web Controls被轉換為HTML代碼,編譯代碼等,我們在后面會更詳細地談到這一問題。
第二,使用原來的ASP,我們必須在檢查用戶的瀏覽器并對內容進行適當的修改使它的兼容性更好方面花費一定的時間。在VB.NET中,它可以為我們完成所有的處理,.NET Framework只能產生可以被目標瀏覽器所識別的HTML代碼。
那么狀態管理如何呢?對于大多數的ASP開發人員而言,這都是個難以處理的問題。在ASP.NET中,狀態是被存儲在發給用戶的網頁中的(以一種隱藏字段的方式。)。在下次再發送該網頁時,就可以讀取和使用其中的數據。
提示之一:我們可以把ASP.NET中的狀態管理認為與使用Property Bags類似,它會自動地在Property Bags中添加信息,例如文本框信息。此外,我們還可以自己添加相關的信息,然后再使用它們。
提示之二:測試表明,與傳統的ASP中的Session對象相比,使用這種狀態管理的方法在性能上有較大的提升。
提示之三:安全仍然是個問題,數據編碼的標準化程度非常高,如果在實際的操作中需要真正有效的安全,還需要根據具體的情況,將狀態管理與現有的數據庫口令記錄等類似的東西結合起來。
好了,這就是ASP.NET,它是一種嶄新的工具,它所提供的功能是ASP開發人員所夢寐以求的。如果你使用Visual Basic作為開發工具,并希望涉足互聯網應用開發,這將是一個理想的機會。
實例之一
ASP.NET應用開發是一件相當簡單的事兒,為了說明這一點兒,我們把空洞的理論放到一邊兒,首先來看一個實際的例子:
·啟動VB.NET。
·創建一個新的Web應用。
![]() 圖:Working the Web1 |
注意:其中的位置已經不再是文件路徑,而是一個HTTP地址了,但也許是運行IIS的本地機器上的地址。在本例中,我在http://ABYDOS地址上創建了GroovyWeb工程,意味著我最終的工程地址是http://ABYDOS/GroovyWeb/。
在經過適當的處理后,就會出現WebForm1.aspx文件,計算機的屏幕應該顯示如下所示的狀態:
![]() 圖:Working the Web2 |
現在,我們創建一個應用程序,它能夠接受在文本框中的名字,并將該名字顯示在窗體上的標簽中。盡管這個應用程序很簡單,但卻展示了一種全新的理念。
·采用拖放方式在Web Form上創建Label、TextBox和Button,如果有可能,將它們布置在不同的行上。
提示:需要注意的是,在設計時不能象在Win Forms中那樣將一個控制拖出窗體。但這并不會影響到對控制的其他操作,我們仍然可以通過Properties窗口修改名字和風格等相關的屬性。
生成的窗體應當如下圖所示:
![]() 圖:Working the Web3 |
在添加代碼前,我們可以首先來通覽組成我們剛生成的網頁的HTML代碼:
·通過點擊窗體底部合適的按鈕,將Web Form模式由Design改為HTML。
![]() 圖:Working the Web4 |
我們首先來看第一行用黃色高亮度顯示的代碼,它說明.ASPX網頁代碼的存儲地址,在本例中是Codebehind=“WebForm1.vb”,隨后我們還會看到這一文件。
象標簽、文本框等這些我們以往都使用HTML代碼定義的控制現在都有了 標記,這也正是這些控制能夠被識別為ASP.NET控制的原因。
提示:即使它們都帶有標記,在發送給瀏覽器之前,這些控制也會被轉換為正常的HTML代碼。
其中大多數代碼與正常的HTML代碼類似,如果以前對HTML比較熟悉,應該能夠毫不費力地理解它們。
·返回到Design模式。
好了,下面我們在工程中添加一些代碼。
·雙擊窗體上的按鈕
我們將看到Web Form代碼窗口。一些預先生成的代碼會使你感到困惑,其中一些是非常有用的,例如Load事件的代碼。
·輸入下面的代碼:
當我第一次這么作的時候,感到非常的不安,這是因為在正常的Visual Basic應用中書寫ASP和CGI等代碼的原因。
好了,下面讓我來給你一個小驚喜。
·擊F5鍵“運行”新生成的互聯網網頁。
提示:在我按F5鍵后,我看到了一條有關安全權限設置不恰當的信息,這一信息是錯誤的,安全權限的設置一切正常。如果你也碰到了這一問題,可以簡單地點擊OK按鈕,別理它。然后運行IE,并訪問新生成的網頁,在本例中,網頁的地址為http://ABYDOS/GroovyWeb/WebForm1.aspx。
第一次運行時可能需要幾秒鐘進行加載,原因是互聯網服務器需要對代碼進行編譯,在網頁第一次被訪問時,它會自動進行這一處理。如果網頁有所變化,則還需要再次進行編譯,當然,這也是自動進行的。
·輸入你喜歡的Web Form上的顏色,然后點擊那個按鈕。
![]() 圖:Working the Web6 |
幾乎是同時,窗體就能夠接收到數據并進行適當的處理,窗體會變成如下所示:
![]() 圖:Working the Web7 |
哇!僅僅通過一行代碼,我們就完成了一個ASP開發人員需要好長時間才能完成的工作。
提示:看一下網頁的源代碼(點擊View->Source)。注意一下隱藏的__VIEWSTATE字段,這是我剛才調用時產生的編碼數據,現在,它包含有控制的值等一些信息。隨著完成的復雜操作越來越多,它的尺寸也會不斷增長,但性能仍然會優于以前的使用Session對象的方法。
好了,至此我們已經完成一個非常簡單的例子,下面我們再通過一個比較復雜的例子來學習Web控制和Web Form事件。
實例之二
下面我們將創建一個網頁讓用戶與他的醫生預約一次見面。他們只要輸入姓名并選擇一個日期,如果遺漏了姓名,就會得到一個出錯信息。我們再來添加一個新的Web Form:
·添加一個Web Form。(依次選擇Project->Add Web Form,并使用缺省的WebForm2.aspx名字。)
然后,我們將修改現有的網頁,使它與新的工程連接起來。
·重新回到WebForm1.aspx。
·在Web Form上添加一個CheckBox控制。
·將其Text屬性改為:Move baby move!。
缺省情況下,在點擊CheckBox時,該網頁不會被送回到服務器進行處理,但為了證明它能夠被處理(同時也為了巧妙地說明另一個概念)我們可以覆蓋掉這一缺省的操作。
·將AutoPostBack屬性的值改為:True。
![]() 圖:Working the Web8 |
現在我們來添加一些代碼,在CheckBox被點擊時對網頁進行重定向。
·雙擊WebForm1.aspx上的CheckBox。
·輸入下面的代碼:
Navigate("WebForm2.aspx")
提示:如果不使用Navigate關健字,我們也可以使用與ASP格式類似的Response.Redirect("WebForm2.aspx")。這是因為我們仍然可以使用Response、Server 、Request、Session和Application等對象。當然,如果有時間,你也可以再試試ClientTarget、ErrorPage、IsValid、User和Validators等關健字。
現在我們來設計WebForm2.aspx:
·返回到WebForm2.aspx。
·在Form窗口中輸入Name -
·在Name之后用拖放方式添加一個TextBox控制。
·在下一行上輸入:Pick a date -
·在所有控制的下方添加Button控制。
·把Button控制的Text屬性改變為:Make Appointment。
然后,我們將添加一個控制,檢查TextBox中是否包含一個姓名,如果沒有包含姓名,這個控制將變為可見的,并顯示“raises an error”的出錯信息。
·最后,在Form的底部添加RequiredFieldValidator控制。
·將Validator的ErrorMessage屬性改為:Oi, u forget ur name!。
·將Validator的ControlToValidate屬性改為:TextBox1。
我們設計的Form應當如下所示:
![]() 圖:Working the Web9 |
現在,我們再添加“Make Appointment”按鈕的一些代碼:
·為按鈕添加如下所示的代碼:
| Button1.Text = "Appointment for " & TextBox1.Text & " booked on " & Calendar1.SelectedDate |
就是這么簡單,通過簡單的幾步,我們就建立了一個要求用戶輸入姓名(如果沒有輸入姓名,就會顯示出錯信息。)并選擇日期的應用程序,當點擊“Make Appointment”時,Text就會驗證輸入的數據。
提示:可以通過使用IsValid屬性檢查控制確認是否已經成功。
·擊F5鍵對設計的網頁進行測試。
我們來檢查一下我們的設計。首先,檢查WebForm1.aspx、WebForm2.aspx上的文本框,并試著在沒有輸入姓名的情況下點擊按鈕。然后輸入姓名并選擇一個日期,注意Calendar互聯網控制是如何自動處理這些事情的,然后,點擊Button,看看你的成果吧。
提示:如果CheckBox不進行重定向,WebForm2.aspx就會發生問題。當我直接訪問網頁時,就會收到“Invalid Base Class”的錯誤信息。我發現解決這一問題的方法是在VB.NET中編譯網頁,這似乎是一種常見問題。
當然,我們還可以在Button的代碼中執行其他任意的操作。在數據庫中添加用戶細節,根據用戶的輸入獲得資料,驗證用戶的資料并進行登錄。
結論
在本篇文章中,我們主要探討了Web Forms的使用問題。首先,從理論上說明了它的工作原理,然后再使用Web控制創建了二個交互式網頁。







