POSTBACK的問題:
Page的IsPostBack屬性用來解決此問題.由于Page_Load在每次頁面加載時(shí)運(yùn)行,其中的代碼即使在回送
(PostBack)的情況下也會(huì)執(zhí)行.這在一般情況下不需要或者不允許的.
頁面處理步驟:
1 服務(wù)器往返:
服務(wù)器負(fù)責(zé)動(dòng)態(tài)創(chuàng)建頁面并把頁面?zhèn)鬟f給客戶端.而客戶端負(fù)責(zé)給出信息和從用戶那里獲取信息,同時(shí)
有選擇的執(zhí)行某個(gè)客戶端腳本.在asp.net中將信息在服務(wù)器客戶端之間傳遞是依靠http請(qǐng)求實(shí)現(xiàn).
2 ViewState:
Web Forms的核心是無狀態(tài)的HTTP通信.這意味著服務(wù)器并不保留有關(guān)以前客戶請(qǐng)求的任何信息.這也
意味著每次在往返執(zhí)行的過程中重新創(chuàng)建頁面時(shí),服務(wù)器往往要做大量的額外工作,而web forms的做法是
使用ViewState. 頁面在服務(wù)器的兩次請(qǐng)求之間存貯自己的ViewState.ViewState包含了頁面上所有用戶
控件的狀態(tài).通過使用System.Web.UI.StateBag 對(duì)象,此信息被存貯成名稱-值對(duì).頁面中的viewstate被
存貯為隱藏的表單字段.
例如: <input type="hidden" name="_VIEWSTATE" value="......"/>
web forms讀取viewstate并將該頁面提交給服務(wù)器時(shí)恢復(fù)服務(wù)器控件的值.有點(diǎn)是頁面的狀態(tài)與頁面一
起存貯,而不是存貯在服務(wù)器中.缺點(diǎn)是在復(fù)雜的頁面中viewstate的內(nèi)容可能會(huì)增大以致開始影響頁面下
載的速度.
注:默認(rèn)情況下所有服務(wù)器控件都支持viewstate.當(dāng)然也可以將頁面級(jí)的viewstate關(guān)閉--不保存頁面的
任何控件的狀態(tài).實(shí)現(xiàn):
<%@ Page EnableViewState="false" %>
基于逐步控制的思想,對(duì)某個(gè)控件要想實(shí)現(xiàn)viewstate,可以這樣:
<asp:DropDownList id="ship" EnableViewState="false" runat="server"/>
3 頁面處理步驟
a.配置階段
如果是進(jìn)行回送操作,那么頁面和控件的viewstate隨后就會(huì)恢復(fù).恢復(fù)之后系統(tǒng)就會(huì)激發(fā)Page_Load
事件.
b. 事件處理階段
c.顯示階段
d.清除階段
此階段首先發(fā)生的事件是Page_Unload,應(yīng)該完成的工作有:關(guān)閉任何打開的數(shù)據(jù)庫連接,任何已打開
的文件以及刪除任何用于頁面的對(duì)象(大多情況下是對(duì)象引用).
4 web表單事件
和傳統(tǒng)事件驅(qū)動(dòng)編程模型中所使用的事件不同,盡管仍然可以使用在客戶端中出現(xiàn)并被處理的事件(
就像服務(wù)器中出現(xiàn)并被處理的事件一樣),但主要的web form 事件模型適用于出現(xiàn)在客戶端但在服務(wù)器中
進(jìn)行處理的事件.這種控制轉(zhuǎn)移是通過使用http post實(shí)現(xiàn)的.
事件出現(xiàn):
有幾個(gè)服務(wù)器控件如:Repeater,DataList和DataGrid這樣的控件都可以包含其它自控件.這些子控
件并不會(huì)主動(dòng)產(chǎn)生自己的事件以在頁面中進(jìn)行處理.實(shí)際情形是,容器(即父控件)將事件打包,并將其作為
ItemCommand事件傳遞到頁面中.因此在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ù)器控件的引用.也就是說,根據(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í)行.
頁面狀態(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è)由頁面維護(hù)的狀態(tài)集合.當(dāng)然可以將自己的關(guān)鍵字添加到該集合中,而且該值將和
所有服務(wù)器控件的狀態(tài)一起在頁面中保留下去.
下面是有關(guān)頁面指令的內(nèi)容:
1 @Page指令
主要屬性:
AspCompat 將頁面設(shè)置為在Single-thread Apartment(STA組件??) 中運(yùn)行.(不懂!!)
AutoEventWireup 頁面事件是否自動(dòng)激發(fā).若為false,則象page_load這樣的事件必須由開發(fā)人員激活
Buffer 激活響應(yīng)緩沖功能
ClassName 派生該頁面的類名稱
ClientTarget 頁面所指向的瀏覽器(有點(diǎn)不懂)
ContentType 設(shè)置響應(yīng)的內(nèi)容類型*
Debug 用激活的調(diào)試功能編譯頁面
Description 頁面的描述--asp.net將其忽略
EnableSessionState 頁面有權(quán)訪問Session對(duì)象,ReadOnly--頁面只能對(duì)Session對(duì)象執(zhí)行讀操作,不
能改變Session變量
EnableViewState 為服務(wù)器控件保持的頁面級(jí)ViewState(前面已就此問題分析過)
EnableViewStateMac 驗(yàn)證viewstate是否被客戶端竄改
ErrorPage 出現(xiàn)錯(cuò)誤時(shí)重定向頁面
Inherits 該頁面繼承的代碼后置類
Language 這個(gè)就不說了,地球人都知道....
ResponseEncoding 由響應(yīng)發(fā)送的文本的編碼格式
SmartNavigation 這個(gè)不太懂...
Src 該頁面所使用的代碼后置類的文件名稱
Trace 激活頁面執(zhí)行的追蹤(默認(rèn)false)
...
2 @Import 指令
用來導(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指令
用來在頁面中實(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)疑問:第一種形式針對(duì)用戶控件,第二種針對(duì)自定義控件.那么用戶控件和自定義
控件到底有何區(qū)別???
5 @Assembly指令(不懂!)
用于直接引用一個(gè)裝配件.
6 @OutoutCache指令(P149)(也不懂)
用來對(duì)頁面在服務(wù)器上如何進(jìn)行高速緩存進(jìn)行控制.
7 @Reference 指令
識(shí)別當(dāng)前頁面在運(yùn)行時(shí)間應(yīng)該動(dòng)態(tài)編譯和鏈接的頁面或控件.這意味著在運(yùn)行時(shí)允許將用戶控件(?)
動(dòng)態(tài)添加到頁面中.(應(yīng)該與page對(duì)象的LoadControl方法結(jié)合起來使用!)
代碼后置:
原來方法: 代碼內(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 //用來訪問SQL Server
...
b要?jiǎng)?chuàng)建一個(gè)繼承自page的類.在此類中,保證Web控件的變量名與頁面中asp.net服務(wù)器控件的
名稱相同!!
在asp.net頁面中繼承代碼后置類文件:
<
%@Page
Inherits="class_name" Src="path_to_class_file" %>
注:要使用正確的文件擴(kuò)展名!!
另一種形式:
<
%@Page
Inherits="ShipMethodClass" %>
此時(shí),asp.net假設(shè)此類是預(yù)先編譯過的,而且位于應(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ì)您有幫助就好】元
