我們前面曾經介紹過ASP和ASP.NET的不同,這一節我們則將焦點放在『*.ASP檔案』和『*.ASPX檔案』的不同處上。由於我們透過Visual Basic.NET來撰寫程式,因此我們所討論的內容都是以Code-Behind為基本架構。
首先,我們再回顧第二章中所談過的登入介面做例子,您會發現ASPX和ASP檔案有著些許的不同:
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端就可以在瀏覽器上呈現或執行。
沒有留言:
張貼留言