2011年2月20日 星期日

4-5 Web Form物件

        經過前面四節摧殘,現在終於可以鬆了一口氣,開始進入ASP.NET程式設計的重點 Web Form 物件』。

        前面提過,『之所以在要花四節的篇幅來介紹整個ASPX運作流程,是因為進入高階的ASP.NET Web應用程式設計領域,得需要瞭解整個ASPX的運作概念,才能夠精準的掌握程式設計的流程,善用Web控制項,並且流利的操作Web Form物件,否則在撰寫Web應用程式的時候,很有可能會循著過去ASP的習慣,把ASP.NET當成ASP來用,這樣將失去ASP.NET的價值,且容易背離Web Form的物件導向程式設計精神。』

        上面這段敘述中,提到了一個在ASP時代和ASP.NET時代相當不同程式設計理念,在ASP中,基本上是以VB Script的程式語言架構來開發,因此實在沒什麼物件導向的架構(也沒有此需要),而且也實在很不容易實作出來。

        但是ASP.NET則是標準的物件導向程式設計架構,我們先看一個空白的Web Form網頁就可以知道。

4-5-1 Web Form網頁的物件導向架構

        當您建立一個Web Form網頁時,標準的空白Web Form頁面會像下面這樣:

4-4 單一的〈Form〉Tag

        在正常情況下, ASP.NET網頁中應該只有單一的一個<Form>標記。而且,在一般的情況下,永遠不要在ASP.NET網頁的HTML碼中手動加入<Form>標記。

        一般而言,ASP.NET網頁的HTML碼應該是這樣:

4-3 Code Behind技術剖析

        事實上Code Behind不是什麼了不得的技術,其實我們在過去ASP程式撰寫時偶爾也會突發奇想的來這麼一下子,我們看下面的網頁片段:
0001:<!--# include file="functions.inc"-->
0002:<html>
0003:
0004:<head>
0005:<meta http-equiv="Content-Type" content="text/html; charset=big5">
0006:<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
0007:<meta name="ProgId" content="FrontPage.Editor.Document">
0008:<title>新網頁1</title>
0009:</head>
0010:<body>
0011:<form method="POST" action="--WEBBOT-SELF--">
0012:  <p><input type="text" name="T1" size="20"></p>
0013:  <p><input type="submit" value="提交" name="B1"><input type="reset" value="重新設定" name="B2"></p>
0014:</form>
0015:</body>
0016:</html>

        我們有時候會利用#includeASP網頁中讀入一段程式,並且執行它,這種感覺就有點像是Code Behind程式碼,我們把ASP程式碼和網頁分開,主要的目的也是方便管理。

        Code Behind 程式碼有那麼一點這樣的感覺。

        可是,當我們試圖發揮這樣的精隨的時候,ASP開始技窮了,我們看下面這段ASP程式碼: 

4-2 Web Form運作概念

        所以透過上面的描述,您會發現,整個Web Form的運作過程大致如下圖:

        我們在上一節的說明中也會發現,Web Form網頁在做Submit動作的時候,一律回傳給自己,而且整個Web Form網頁中永遠只有一個<Form>標記,這是為了Web Form這樣的機制能夠正常的運作而設計的,我們後面會再詳談這樣的技術。

        注意畫面中的步驟三,在這個階段,我們透過.NET Framework來執行我們的ASPX網頁,這時Code Behind程式碼就登場了,所有我們的程式設計,都集中在這一部份,舉凡Web Form的運作,控制項的事件處理、網頁畫面上的調整與呈現都在這裡搞定,我們接下來看看Code Behind部分。

4-1 ASPX和 ASP

        我們前面曾經介紹過ASPASP.NET的不同,這一節我們則將焦點放在『*.ASP檔案』和『*.ASPX檔案』的不同處上。由於我們透過Visual Basic.NET來撰寫程式,因此我們所討論的內容都是以Code-Behind為基本架構。

        首先,我們再回顧第二章中所談過的登入介面做例子,您會發現ASPXASP檔案有著些許的不同:

ASPX
ASP
網頁部分
 在網頁HTML碼部分,除了HTML指令之外,還有<asp:TextBox>…</asp:TextBox >之類的非標準的HTML標記,以及runat="server"標記,這些標記是給.NET Framework看的
在網頁HTML碼部分,僅有單純的HTML指令。
程式部分
ASPX第一行定義了Code Behind程式碼的位置()
程式碼以<%…%>的方式包含並夾雜在ASP網頁裡面。
程式語言
Web Form『物件』為基本架構,使得網頁物件在伺服器端執行時可以有屬性、事件、方法等物件導向特性。
ASP撰寫的網頁,在伺服器端部分的執行運作沒有物件導向特性,僅可用Java Script撰寫Client端事件。

        Code Behind架構下,ASPX檔案的程式碼實際上放置在*.aspx.vb中,而ASPX網頁的第一行,定義了程式碼檔案的位置,當IIS(嚴格說起來是.NET Framework)在執行ASPX網頁時,會先從ASPX網頁的第一行找到程式碼檔案的位置,如下:
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="login.aspx.vb" Inherits="AspxDemo.login"%>

第4章 Web Form 架構

        從上面的章節您大致上可以瞭解在.NET FrameworkASP.NET的運作與檔案之間的關係,從這一章開始,我們將焦點集中在ASP.NET程式設計的核心 Web Form』物件上。

        首先我們探討ASPXASP之間在程式設計概念上的不同,並且介紹Web Form物件的運作概念,然後我們透過實例來實際驗證Web Form執行的過程,最後我們對Web Form物件的操作做完整的介紹。

        讀者可以在此章節中對整個WebFrom有非常完整的認識,但是此章之第1,2,3,4節中的內容,雖說是Web Form.NET Framework中運作的基本流程概念(因此我們放在本章之初),但由於與過去ASP觀念差異相當大,且融入了物件導向概念,若讀者過去不曾利用物件導向語言來開發過Windows應用程式,或是類似的專案,可能一時之間難以會意,則可先跳過前四節,從第五節開始讀起。

        第五節之後即是程式設計的部分,概念部分較少(相對的圖開始比較多…),如果直接從第五節開始讀起,基本上不會影響您設計ASP.NET的開發功力,只是會有點知其然而不知其所以然。但當您開發過一兩支ASP.NET程式之後,可回過頭來看看這四節,融會貫通之後功力大增,將全面掌握Web Form的運作架構。

        之所以在前面要花四節的時間來介紹整個ASPX運作流程,是因為想要進入高階的ASP.NET Web應用程式設計領域,得需要瞭解整個ASPX的運作概念,才能夠精準的掌握程式設計的流程,善用Web控制項,並且流利的操作Web Form物件,否則在撰寫Web應用程式的時候,很有可能會循著過去ASP的習慣,把ASP.NET當成ASP來用,這樣將失去ASP.NET的價值,且容易背離Web Form的物件導向程式設計精神。

        特別是過去在ASP程式設計累積了相當多經驗的讀者,可以透過前面四節,詳細的比較ASPASPX之間的差異,相信能夠有不少的收穫。

2011年2月17日 星期四

ASP.NET Dynamic Data Web Site

前言:
Dynamic Data技術從.NET 3.5時代出現之後,就受到了不少開發人員的關注,其中DataAnnotations機制以及相關的概念,也擴展應用到了MVCSilverlight應用程式的開發當中。它讓我們有機會建構出UI層與後端資料庫徹底隔離的應用程式,有效的降低了開發的成本,並提高程式碼的可重用性。
ASP.NET 4.0版當中,Dynamic Data技術甚至可直接整合進傳統的Web Forms網站當中,這對於需要設計大型資料庫應用系統的開發人員來說,將有相當大的助益,使得Dynamic Data技術成為您不可不知的一環


關於Dynamic Data技術

 

        ASP.NET 4當中的Dynamic Data技術,可以讓我們建立所謂的data-driven applications,其中的DataAnnotations AttributeControl Template、和Field Template…等機制,讓開發人員可以透過模板技術建立出一套面對不同資料庫()依舊可以正常運行的Web應用程式,而不需像過去ASP.NET Web Forms的資料庫存取機制,在面對不同的資料表時常常需要重新截取資料結構或重新設計Template Field的窘境,讓我們得已有機會能夠用同一套模版來建立出可適用於多種不同資料表結構的資料庫應用程式。

        會有這樣的需求是有典故的,舉個簡單的例子,在真實世界的專案中,實務上我們常常會需要針對不同資料表建立CRUD(Create, Read, Update and Delete)等功能,如果能夠用一個模板(僅僅開發一次),在面對不同的資料表時可以完全不需要修改程式碼一樣可以運作,豈不是便利至極?