POSTBACK的問(wèn)題:
    
     Page的IsPostBack屬性用來(lái)解決此問(wèn)題.由于Page_Load在每次頁(yè)面加載時(shí)運(yùn)行,其中的代碼即使在回送
  
(PostBack)的情況下也會(huì)執(zhí)行.這在一般情況下不需要或者不允許的.
    頁(yè)面處理步驟:
    
     1 服務(wù)器往返:
    
     服務(wù)器負(fù)責(zé)動(dòng)態(tài)創(chuàng)建頁(yè)面并把頁(yè)面?zhèn)鬟f給客戶端.而客戶端負(fù)責(zé)給出信息和從用戶那里獲取信息,同時(shí)
  
    有選擇的執(zhí)行某個(gè)客戶端腳本.在asp.net中將信息在服務(wù)器客戶端之間傳遞是依靠http請(qǐng)求實(shí)現(xiàn).
    
     2 ViewState:
    
     Web Forms的核心是無(wú)狀態(tài)的HTTP通信.這意味著服務(wù)器并不保留有關(guān)以前客戶請(qǐng)求的任何信息.這也
  
意味著每次在往返執(zhí)行的過(guò)程中重新創(chuàng)建頁(yè)面時(shí),服務(wù)器往往要做大量的額外工作,而web forms的做法是
使用ViewState. 頁(yè)面在服務(wù)器的兩次請(qǐng)求之間存貯自己的ViewState.ViewState包含了頁(yè)面上所有用戶
控件的狀態(tài).通過(guò)使用System.Web.UI.StateBag 對(duì)象,此信息被存貯成名稱-值對(duì).頁(yè)面中的viewstate被
    存貯為隱藏的表單字段.
    
    例如: <input type="hidden" name="_VIEWSTATE" value="......"/>
    
     web forms讀取viewstate并將該頁(yè)面提交給服務(wù)器時(shí)恢復(fù)服務(wù)器控件的值.有點(diǎn)是頁(yè)面的狀態(tài)與頁(yè)面一
  
起存貯,而不是存貯在服務(wù)器中.缺點(diǎn)是在復(fù)雜的頁(yè)面中viewstate的內(nèi)容可能會(huì)增大以致開始影響頁(yè)面下
    載的速度. 
    
    注:默認(rèn)情況下所有服務(wù)器控件都支持viewstate.當(dāng)然也可以將頁(yè)面級(jí)的viewstate關(guān)閉--不保存頁(yè)面的
  
    任何控件的狀態(tài).實(shí)現(xiàn):
    
     <%@ Page EnableViewState="false" %>
    
     基于逐步控制的思想,對(duì)某個(gè)控件要想實(shí)現(xiàn)viewstate,可以這樣:
    
    <asp:DropDownList id="ship" EnableViewState="false" runat="server"/>
    
     3 頁(yè)面處理步驟
    
     a.配置階段
    
     如果是進(jìn)行回送操作,那么頁(yè)面和控件的viewstate隨后就會(huì)恢復(fù).恢復(fù)之后系統(tǒng)就會(huì)激發(fā)Page_Load
  
    事件.
    
     b. 事件處理階段
    
     c.顯示階段
    
     d.清除階段
    
     此階段首先發(fā)生的事件是Page_Unload,應(yīng)該完成的工作有:關(guān)閉任何打開的數(shù)據(jù)庫(kù)連接,任何已打開
  
    的文件以及刪除任何用于頁(yè)面的對(duì)象(大多情況下是對(duì)象引用).
    
     4 web表單事件
    
     和傳統(tǒng)事件驅(qū)動(dòng)編程模型中所使用的事件不同,盡管仍然可以使用在客戶端中出現(xiàn)并被處理的事件(
  
就像服務(wù)器中出現(xiàn)并被處理的事件一樣),但主要的web form 事件模型適用于出現(xiàn)在客戶端但在服務(wù)器中
    進(jìn)行處理的事件.這種控制轉(zhuǎn)移是通過(guò)使用http post實(shí)現(xiàn)的.
    
     事件出現(xiàn):
    
     有幾個(gè)服務(wù)器控件如:Repeater,DataList和DataGrid這樣的控件都可以包含其它自控件.這些子控
  
件并不會(huì)主動(dòng)產(chǎn)生自己的事件以在頁(yè)面中進(jìn)行處理.實(shí)際情形是,容器(即父控件)將事件打包,并將其作為
    ItemCommand事件傳遞到頁(yè)面中.因此在Repeater中單擊某個(gè)按鈕時(shí)就會(huì)激發(fā)該事件.
    
    例如:
    
     <script language="c#" runat="server">
    
     void "MyRepeater"_ItemCommand(Object Sender,RepeaterCommandEventArgs e)
    
     {
    
     ClickInfo.Text = "You selected the"+((Button)e.CommandSource).Text+"button<br>";
  
}
     </script>
    
    注:第一個(gè)參數(shù)sender是對(duì)產(chǎn)生事件的服務(wù)器控件的引用.也就是說(shuō),根據(jù)sender變量的值可以知道具體是
  
    哪個(gè)控件.
    
     第二個(gè)參數(shù)是一個(gè)包含了一組有關(guān)特定事件的信息的對(duì)象.例中CommandSource屬性表示對(duì)實(shí)際產(chǎn)生事
  
    件的子服務(wù)器控件的引用.
    
     客戶端和服務(wù)器上的事件處理:
    
     基本上,服務(wù)器控件所支持的事件都在服務(wù)器上處理.而所有可由html input控件都需要在客戶端上處
  
    理.但是當(dāng)存在一個(gè)既能在服務(wù)器又能在客戶端處理的事件時(shí),該事件會(huì)優(yōu)先在服務(wù)器上執(zhí)行.
    
     頁(yè)面狀態(tài):
    
     除了隱藏的表單字段ViewState或者Session 對(duì)象中可以存貯信息,State Bag也是另一種選擇:
    
     例如:
    
     void Page_Load(Object Sender,EventArgs e)
    
     {
    
     int viewCount;
    
     if(ViewState["viewCount"]!=null)
    
     {
    
     viewCount = (int) ViewState["viewCount"]+1;
    
     }
    
     else
    
     viewCount = 1;
    
    
     labelView1.Text = "Times page has been viewed"+viewCount.ToString();
    
     ViewCount["viewCount"] = viewCount;
    
     if(!IsPostBack)
    
     {
    
     ArrayList values = new ArrayList();
    
     ......
    
     } 
    
     }
    
     ViewState對(duì)象是一個(gè)由頁(yè)面維護(hù)的狀態(tài)集合.當(dāng)然可以將自己的關(guān)鍵字添加到該集合中,而且該值將和
  
    所有服務(wù)器控件的狀態(tài)一起在頁(yè)面中保留下去.
    
     下面是有關(guān)頁(yè)面指令的內(nèi)容:
    
     1 @Page指令
    
     主要屬性:
    
     AspCompat 將頁(yè)面設(shè)置為在Single-thread Apartment(STA組件??) 中運(yùn)行.(不懂!!)
    
     AutoEventWireup 頁(yè)面事件是否自動(dòng)激發(fā).若為false,則象page_load這樣的事件必須由開發(fā)人員激活
    
     Buffer 激活響應(yīng)緩沖功能
    
     ClassName 派生該頁(yè)面的類名稱
    
     ClientTarget 頁(yè)面所指向的瀏覽器(有點(diǎn)不懂)
    
     ContentType 設(shè)置響應(yīng)的內(nèi)容類型*
    
     Debug 用激活的調(diào)試功能編譯頁(yè)面
    
     Description 頁(yè)面的描述--asp.net將其忽略
    
     EnableSessionState 頁(yè)面有權(quán)訪問(wèn)Session對(duì)象,ReadOnly--頁(yè)面只能對(duì)Session對(duì)象執(zhí)行讀操作,不 
  
     能改變Session變量
    
     EnableViewState 為服務(wù)器控件保持的頁(yè)面級(jí)ViewState(前面已就此問(wèn)題分析過(guò))
    
     EnableViewStateMac 驗(yàn)證viewstate是否被客戶端竄改
    
     ErrorPage 出現(xiàn)錯(cuò)誤時(shí)重定向頁(yè)面
    
     Inherits 該頁(yè)面繼承的代碼后置類
    
     Language 這個(gè)就不說(shuō)了,地球人都知道....
    
     ResponseEncoding 由響應(yīng)發(fā)送的文本的編碼格式
    
     SmartNavigation 這個(gè)不太懂...
    
     Src 該頁(yè)面所使用的代碼后置類的文件名稱
    
     Trace 激活頁(yè)面執(zhí)行的追蹤(默認(rèn)false)
    
     ...
    
     2 @Import 指令
    
     用來(lái)導(dǎo)入一個(gè)名稱空間.
    
     <
    
      %@Import
    
     namespace="value" %>
    
     自動(dòng)導(dǎo)入的空間:
    
     system system.web
    
     system.collection.specialized system.web.security
    
     system.io system.web.ui
    
     system.text.regularexpression system.web.ui.webcontrols
    
     system.collections system.web.caching
    
     system.configuration system.web.sessionstate
    
     system.text system.web.ui.htmlcontrols
    
     3 @Implements指令
    
     用來(lái)在頁(yè)面中實(shí)現(xiàn)一個(gè).NET接口.
    
     注:要確保自定義控件能夠象標(biāo)準(zhǔn)服務(wù)器控件那樣對(duì)事件作出相應(yīng),我們的控件就必須實(shí)現(xiàn)
  
    IPostBackEventHandler 接口!!*
    
     <
    
      %@Implements
    
     Interface="System.Web.UI.IPostBackEventHandler"%>
    
     4 @Register指令
    
     兩種形式:
    
     <
    
      %@Register
    
     tagprefix="tagprefix" Tagname="tagname" Src="pathname"%>
    
     <
    
      %@Register
    
     tagprefix="tagprefix" Namespace="namespace" Assembly="assembly"%>
    
     書看到這,產(chǎn)生一點(diǎn)疑問(wèn):第一種形式針對(duì)用戶控件,第二種針對(duì)自定義控件.那么用戶控件和自定義 
  
     控件到底有何區(qū)別???
    
     5 @Assembly指令(不懂!)
    
     用于直接引用一個(gè)裝配件.
    
     6 @OutoutCache指令(P149)(也不懂)
    
     用來(lái)對(duì)頁(yè)面在服務(wù)器上如何進(jìn)行高速緩存進(jìn)行控制.
    
     7 @Reference 指令
    
     識(shí)別當(dāng)前頁(yè)面在運(yùn)行時(shí)間應(yīng)該動(dòng)態(tài)編譯和鏈接的頁(yè)面或控件.這意味著在運(yùn)行時(shí)允許將用戶控件(?)
  
    動(dòng)態(tài)添加到頁(yè)面中.(應(yīng)該與page對(duì)象的LoadControl方法結(jié)合起來(lái)使用!)
    
     代碼后置:
    
     原來(lái)方法: 代碼內(nèi)聯(lián) (程序代碼與Html代碼混合在一個(gè)文件中) 
    
     原則是為代碼創(chuàng)建一個(gè)類,并從asp.net page對(duì)象中繼承該類.
    
     規(guī)則: a名稱空間--System
    
     System.Web.UI //用于創(chuàng)建一個(gè)繼承自Page對(duì)象的類
    
     System.Web.UI.WebControls //用于引用控件
    
     System.Data.SqlClient //用來(lái)訪問(wèn)SQL Server
    
     ...
    
     b要?jiǎng)?chuàng)建一個(gè)繼承自page的類.在此類中,保證Web控件的變量名與頁(yè)面中asp.net服務(wù)器控件的 
  
     名稱相同!!
    
     在asp.net頁(yè)面中繼承代碼后置類文件:
    
     <
    
      %@Page
    
     Inherits="class_name" Src="path_to_class_file" %>
    
     注:要使用正確的文件擴(kuò)展名!!
    
     另一種形式:
    
     <
    
      %@Page
    
     Inherits="ShipMethodClass" %>
    
     此時(shí),asp.net假設(shè)此類是預(yù)先編譯過(guò)的,而且位于應(yīng)用程序的bin目錄中.
  
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
 
					微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
 
					

