WebForm前台與后台的關系及運行原理
前台頁面
<% @ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits ="_Default" %> <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> < html xmlns ="http://www.w3.org/1999/xhtml"> < head runat ="server"> <title > 首頁</ title > </ head> < body> <% for ( int i = 0; i < 10; i++){ Response.Write(strHello); } %> <!--前台頁面<%@標記內容都是會在服務器端運行的--> <form id="form1" method="post"> <!--form表單默認發送Get請求--> <input type="text" id="txtBeauty" name="txtBeauty" runat="server" /> <input type="submit" /> <% = strHello %> <!--前台訪問后台非私有成員--> <% Response.Write(strHello);%> </form > </ body> </ html>
后台頁面

1 using System; 2 using System.Web.UI; 3 public partial class _Default : Page { 4 protected string strHello = "Hi~~piziyimao~~" ; 5 //僅從使用上面來看: 6 //ashx和WebForm使用方式都差不多,區別: 7 //1.被請求時,調用的方法名不同:ashx - ProcessRequest , WebForm - Page_Load(他就是頁面生命周期中的事件 頁面生命周期就在PR[ProcessRequest]中執行) 8 //2.WebForm不需要程序員手動的讀取模板頁了~~ 9 //3.訪問Reqeust和Response等ASP.NET內部對象的時候,不需要再通過context點出來了 因為Page類已經包裝了Context 而_Default : Page 10 //當頁面被請求的時候,這個方法會被自動的調用 11 protected void Page_Load(object sender, EventArgs e) { 12 //前台html控件添加 runat=server 它會在程序編譯的時候 成為一個變量存在后台頁面對象中 所以后台可以this.點出 13 //this.txtBeauty.Value = "1243658561";//等價於(this.Controls[0] as HTMLInputText).value=... 14 //Response.Write("不是所有痞子都叫一毛" + strHello);//這里的代碼會輸出在頁面html代碼之前 可見aspx.cs頁面先執行 aspx頁面后執行 15 //補充:前台頁面和后台頁面的關系----------前台頁面繼承於后台 即1.aspx 繼承與1.aspx.cs 前台頁面控件編譯后 會成為后台對象的屬性 16 //this.txtBeauty.RenderControl();//每個Control都包含一個Render方法 此方法返回當前控件所生成的html代碼 17 //且RenderControl內部 並非Response.Write 而是直接寫入HtmlTextWrite中 所以頁面源代碼txtBeauty位置 有value屬性 18 string strName = Request.Form["txtBeauty" ]; //和ashx拿到頁面值做法一樣 19 if (!string .IsNullOrEmpty(strName)) 20 Response.Write( "不是所有痞子都叫一毛" + strName); 21 else 22 Response.Write( "沒有值~~~" ); 23 //反編譯圖片證實 aspx與aspx.cs關系以及頁面控件樹生成過程 24 } 25 }
頁面控件樹生成詳解:
總結:
1、對於asp.net來說 動態頁面aspx或ashx被瀏覽器請求時都是作為類的對象來運行的而不是像處理靜態頁面html或者圖片jpg一樣直接讀取文件里的內容
【他們被請求的時候就是一個頁面類對象 里面有很多的控件屬性(但非html代碼本身) 在執行到頁面ProcessRequest方法內部執行Page_Load事件之后
調用每個控件對象的Render方法生成對應的html代碼】
2、webForm前后台頁面aspx、aspx.cs文件在被訪問時會被編譯成類 前台頁面類繼承與后台頁面類
3、被訪問時服務器會創建【前台頁面類】對象來作為處理瀏覽器請求的對象
4、前台類對象是如何結合后台類的方法 生成整個頁面的html代碼的呢?==》被請求時 生成頁面控件對象樹控件樹負責組合整個頁面的內容(_BuildControlTree--生成控件樹方法)
【打造控件樹的目的就是將頁面html代碼、服務端代碼 runat=server部分代碼整合在一起】
5、繼承關系:前台頁面類-》后台頁面類-》page-》TemplateControl-》Control(包含ControlCollection集合)通過反編譯可以查看到【總結:頁面就是控件】