2022年2月8日 星期二

序 - 2011年 - 感言[置頂]

        時間一直在走,世界一直在變,程式設計的世界,也是如此。

        2003年,我出版了第一本ASP.NET書籍,時間過得很快,現在回頭看,已經快10年前的事情了,那時候的世界和現在似乎有著相當大的不同。當時,市場上充斥的面對新技術的強大學習需求,因此我們在有限的資源下,很努力的生出了『ASP.NET程式設計徹底研究』這本書。
        2005年底,微軟將ASP.NET從1.1升級到2.0,面對更多的機制、更強大的功能、更豐富的控制項,我們出版了『ASP.NET 2.0深度剖析範例集』這本書,很快的,數年時間過去了。
        現在,微軟的.NET已經到4.0,同樣的ASP.NET也升級到了4.0,增加了許多新玩意兒,像是MVC、ORM、DynamicData...etc,這些企業級的新功能出現,可能您不常用,但是將ASP.NET帶到了另一個新的Level上。
        不過,我們也深深感受到,2008年之後,開發人員學習的方式有著相當大的改變,同時間市場上也對平均每1.5年就天翻地覆的改變有所倦怠,反倒回歸基本面,希望能夠學習到真正實用(用的久、用的廣)的技術和知識。以Blog呈現最新的技術,對於學習者來說相當的便利,但是卻往往無法掌握全面性的概念,所獲得的知識過於零碎,長期來說,能夠發揮到的學習與成長效果相當有限,且容易忽略一些重要的基礎概念。
        因此,我們想做一些嘗試,我們將會在這裡,重新整理過去這兩本書籍的內容,並加上最新的ASP.NET 4.0相關技術,同時以支援VB和C#的面貌,呈現在學習者的面前。除了持續更新最新的技術資訊之外,我們也將會每一篇文章加上目錄,讓讀者能夠以最便利的方式(不管是循序或隨機)閱讀,以獲得最大的學習效果。
        我們要謝謝過去這10年來,陪伴我們一起走過這段歲月的讀者,您們的支持我們銘記在心,也希望不管您是新的學習者,或是舊的讀者,都能夠在這邊找到您需要的知識。

        畢竟,在充滿競爭的年代,持續的學習永遠是確保領先的重要關鍵。

        May God bless you~

2011年2月20日 星期日

4-11 Web Form的其他重要屬性與方法

透過這一章的介紹,讀者應已完整的了解整個Web From的架構,以及在程式設計時所需注意之處。Web Form物件是整個ASP.NET程式設計的主角,在命名空間上的物件層級是System.Web.UI.Page


何謂命名空間(Namespace)
其實Namespace翻譯成『命名空間』本身就相當值得商榷,但是這個翻譯是.NET Framework SDK中統一的說法,因此我們也順著這個方式來稱呼它。
所謂的命名空間實際上就是物件的階層,在物件導向程式設計概念中,因為物件可以被繼承,而物件在設計時是由基底物件開始,一層一層的繼承下來,因此物件會有階層的架構。例如,我們的Web From物件的層級就是System.Web.UI.Page,而Web From上面的Web控制項則是System.Web.UI.WebControls。透過命名空間這個方式,開發人員比較容易知道物件歸屬的層級以及物件之間的繼層關係。


Web From即是Page物件,而該物件的重要屬性如下:

4-10 Try…End Try錯誤處理程序

        在過去ASP時代,程式碼中只有On Error可用來捕捉或處理錯誤,而ASP.NET中,除了On Error可用之外,還可以利用Try …End Try來進行錯誤處理。

        Try…End Try』這個新玩意兒,看起來好像很有學問的樣子,其實用起來相當的簡單,基本的指令架構如下:
Try
   [ tryStatements ]
[ Catch [ exception [ As type ] ] [ When expression ] 
   [ catchStatements ] ]
[ Exit Try ]
...
[ Finally
   [ finallyStatements ] ]
End Try

        上面是『Try…Catch…Finally』在.NET Framework中完整的定義,對於程式設計師,它的內涵就是:
Try
   可能發生錯誤的程式
[ Catch [ exception [ As type ] ] [ When expression ]
   發生錯誤時,要執行的指令
[ Exit Try ]若下了Exit Try 指令,則跳出Try…End Try結構
[ Catch [ exception [ As type ] ] [ When expression ]
   Catch 可以有很多個,程式會依照 When 後面的expression來決定執行哪一個Catch敘述
[ Finally
   只要一進入Try敘述中,不管有沒有錯誤或從Try敘述中的哪一部份離開都執行的程式
End Try

底下是實例:

4-9 Web Form 中的執行與單步執行偵錯

        當您在Web From上面佈置好了控制項,並且撰寫好相關的程式之後,就可以開始執行該Web應用程式。Visual Basic.NET提供了一個相當好的偵錯環境,您可以在需要時設定中斷點,以利程式的執行。

        您在程式設計環境中,可以在需要中斷的程式碼位置,以滑鼠游標按下視窗最左邊的位置,將會出現一個『紅點』,如下圖所示:

        這樣,當您按下[F5]或是建置執行這個方案時,依舊會跳出Browser執行視窗:


        因為我們將中斷點設定在第26行的『Calendar1_SelectionChanged』事件中,因此當您在Calendar控制項上,點下某個日期之後,就會發現瀏覽器中的顯示內容停留在上面這個畫面。

        系統會跳回Visual Basic.NET環境,這時您會看到如下圖的畫面:

        程式暫停在上面這個位置,這時您可以單步執行或是繼續執行此程式。另外,在左下角的『自動變數』視窗中,還會有目前記憶體內程式執行中使用到的變數之現行值,以方便您追蹤偵錯。

        您甚至可以在右下角的命令視窗中,輸入指令讓Visual Basic.NET來執行,動態的改變記憶體內變數的值,如下圖所示:
        這些功能都是過去ASP開發環境中所沒有的,因此,若您利用Visual Basic.NET來開發ASP.NET應用程式,將會如虎添翼,不僅增加開發的效率,更讓整個過程比起過去ASP時代輕鬆了不少。

4-8 在Web Form中佈置與使用Web控制項

        接下來我們要看ASP.NET中的重頭戲了,那就是Web From上面的Web控制項。這是物件導向網頁設計不可或缺的重要議題,先前我們其實已經使用過很多次Web控制項來建構網頁了。

        我們開啟一般的Web應用程式專案之後,畫面上會是底下這樣,您可按下滑鼠右鍵選擇『屬性』,將屬性頁視窗叫出來,將頁面從GridLayout改為FlowLayout
        Web From提供這兩種方式來決定物件的擺置方式,如果是採FlowLayout,則頁面上的HTML碼會是比較單純的設定,在指定物件時,不會利用Style指令來進行設定(比較像一般的網頁配置方式)。反之,若是採用GridLayout,則會將每一個物件預設為使用Style格式來指定物件在Web From上面佈置的位置(比較像Windows程式設計)

        如果是以FlowLayout方式來佈置物件,則HTML碼會是:

FlowLayout方式來佈置物件
<form id="Form1" method="post" runat="server">
   <FONT face="新細明體">
   <asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
   <asp:Button id="Button1" runat="server" Text="Button" ></asp:Button>
   </FONT>
</form>




        注意當您拖曳Button放在TextBox物件後面時,FlowLayout模式將會把物件緊連著上個物件佈置,這是由於HTML碼本身就是以這樣連接著的方式來呈現網頁。

        若使用GridLayout方式來佈置物件,HTML碼則是:
GridLayout方式來佈置物件
<form id="Form1" method="post" runat="server">
   <FONT face="新細明體">
   <asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
   <asp:Button id="Button1" runat="server" Text="Button" style="Z-INDEX: 101; LEFT: 146px; POSITION: absolute; TOP: 56px"></asp:Button>
   </FONT>
</form>


        注意上面的HTML碼中的Style部分,因為HTML碼的不同,所以在畫面呈現上也有不同:

4-7 Response物件

        如果您曾經撰寫過VB程式,比較起來,Response.write就像過去VB時代的Print指令,能夠在表單上顯示一段文字,卻無法任意的輸出在某個物件上或將文字顯示在我們需要的特定位置,因此,才會需要有Label物件的產生。

        您可以在Web From上面佈置Label物件,這樣當您使用『Label.Text=”要顯示的文字』時,文字就會呈現在網頁上您佈置Label物件的位置。

        但是這樣,我們ASP.NET中的Response物件又用來幹麻呢?和Request物件一樣,Response物件也被擴充來進行其他更複雜的任務。諸如直接在網頁上輸出圖檔或二進位元格式的資料(Response.BinaryWrite)、將文字檔的內容整個輸出至網頁(Response.WriteFile)檔案網頁上檔案的輸出、增加Http Header的處理(AppendHeader)、附加IIS Log項目(AppendToLog)…等,這些都是高階ASP.NET程式設計會探討的部分,我們在後面會詳細的說明。

4-6 Request物件

        在物件化的Web應用程式設計概念下,我們越來越少透過Request.form(“物件名稱”)之類的程式碼取得Submit回來的值,因此request物件的應用越來越偏向伺服器端資訊的取得,而非過去ASP參數接收的功能。


        但是我們依舊來看一下Request.Form(“變數名稱”)這樣的語法在ASP.NET上的應用。

        我們建立一個Web應用程式,在Web From上面佈置一個TextBox和一個Button