2011年2月20日 星期日

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"%>

然後參照該位置的Code Behind程式碼,執行Page_Load部分:
0001:    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
0002:        '在此加入要初始化頁面的使用者程式碼
0003:    End Sub

        執行完Page_Load後,繼續讀取ASPX檔案中的HTML碼,並且輸出至緩衝區,如果是單純的HTML碼,會被直接傳回Client端,如果是<asp:…>或有Runat=Server等標記的HTML碼,會被.NET加工處理。

        因此,當執行到<asp:TextBox id="txtAccount"…>runat="server"此類的標記時,則會利用ID找到Code Behind程式碼中相關ID的程式碼位置,並且執行它,執行完後的結果(如果有程式碼影響到網頁內容的話…)則一併傳至緩衝區,和原先的純HTML碼結合,最後回傳到Client端,形成我們在Browser上看到的結果。

        底下這段程式就是當ASPX網頁呈現到Client端之後,User按下網頁上的Button,表單Submit回去伺服器端時,執行到的部分。
0005:    Private Sub Button_Submit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_Submit.Click
0006:        If Me.txtAccount.Text = "Milk_Lin" And Me.txtPassword.Text = "good" Then
0007:            '設定 session 表示使用者已經 login
0008:            Session("isLogin") = True
0009:
0010:            '轉到實際被保護的網頁
0011:            Response.Redirect("Process.aspx")
0012:        End If
0013:    End Sub

        整個Submit回伺服器端的資訊會由.NET Framework透過Web Form物件來進行Request.From(“Button_Submit”)的動作,取得使用者按下按鈕時傳回的資料,這是由於我們在ASPX網頁中有建立一個<asp:Button id="Button_Submit" runat="server"…>,以及其他兩個<asp:TextBox…>物件之故。

4-1-1 Submit給別人?還是給自己?

        如果您回過頭看這個例子中的ASPX網頁,該Web Form網頁被.NET解析後傳回到Client端的HTML碼,會覺得更加有趣,我們先略過HTML表頭的部分不看,直接看網頁中的<Body>部分:
這是Login.aspx傳回Client端的HTML
0011:    <body>
0012:               <form name="Form1" method="post" action="login.aspx" id="Form1">
0013:<input type="hidden" name="__VIEWSTATE" value="dDwtMzg4MDA0NzA7Oz7+5JiY4g+nxakLdGPglDp4i212hw==" />
0014:
0015:                          <P><FONT face="新細明體">帳號:
0016:                                               <input name="txtAccount" type="text" id="txtAccount" DESIGNTIMEDRAGDROP="14" /></FONT></P>
0017:                          <P><FONT face="新細明體">密碼:
0018:                                               <input name="txtPassword" type="password" id="txtPassword" />
0019:                                               <input type="submit" name="Button_Submit" value="提交" id="Button_Submit" /></FONT></P>
0020:               </form>
0021:    </body>
0022:</HTML>

注意在第12行,網頁中宣告的<FORM>標籤:
<form name="Form1" method="post" action="login.aspx" id="Form1">

        只要Web Form中有包含任何的Web控制項,您一定會看到Web Form傳回Client端的HTML碼包含了一個(也應該只會有唯一的一個)<form…>標記,且該<form…>標記中,定義的action="login.aspx"對象,會永遠是該表單自己,形成自己Submit給自己的情況。

但我們對比Login.aspx,看看實際上在Login.aspx網頁中的HTML碼是怎麼寫的呢?
<form id="Form1" method="post" runat="server">

實際上該網頁的寫法僅有上面這樣,被.NET解析完之後便加上了:
name="Form1" action="login.aspx"

        我們再看一般控制項的部分,記得我們在ASPX網頁中拖曳了兩個TextBox物件,和一個Button物件,這兩個物件都是Web控制項,因此在Login.aspx網頁中,會看到底下這樣的HTML碼:

帳號:<asp:TextBox id="txtAccount" runat="server" DESIGNTIMEDRAGDROP="14"></asp:TextBox>
密碼:<asp:TextBox id="txtPassword" runat="server" TextMode="Password"></asp:TextBox>
<asp:Button id="Button_Submit" runat="server" Text="提交"></asp:Button>

        和過去ASP設計時不同,上面這些HTML都不是標準的HTML碼,若直接拿瀏覽器開啟根本不會呈現任何我們想要的結果。這些特殊的HTML(<asp:…>)是給.NET看的,透過.NET Framework的機制解析之後,真正傳到Client端的HTML碼變成:
Login.aspx.NET Framework執行後傳回Client端的結果:
0001:<form name="Form1" method="post" action="login.aspx" id="Form1">
0002:<input type="hidden" name="__VIEWSTATE" value="dDwtMzg4MDA0NzA7Oz7+5JiY4g+nxakLdGPglDp4i212hw==" />
0003:<P><FONT face="新細明體">帳號:<input name="txtAccount" type="text" id="txtAccount" DESIGNTIMEDRAGDROP="14" /></FONT></P>
0004:<P><FONT face="新細明體">密碼:<input name="txtPassword" type="password" id="txtPassword" />
0005:<input type="submit" name="Button_Submit" value="提交" id="Button_Submit" /></FONT></P>
0006:</form>

        上面這些HTML碼,在瀏覽器上就會真的呈現出我們想要的結果,對比之後,您會發現<asp:TextBox>變成了<<input name="…" type="text">,而<asp:Button>則變成了:<input type="submit">

        由此可知,Web Form物件上的Web控制項,其實是『虛擬的物件』,並不是真的有該物件的存在,該物件也不可能原封不動的傳到Client端就可以在瀏覽器上呈現或執行。

        我們在Visual Studio.NET中看到的Web控制項,只是.NETWeb Form中模擬出和Windows Form類似的物件架構,這些所謂的Web控制項,在真的傳到Client端之前,還是得透過.NET Framework將其轉換成標準且通用的HTML碼,才能夠在全世界不同的瀏覽器(除了IE,還有其他各種瀏覽器)上呈現與執行。

沒有留言:

張貼留言