淺談ASP.NET的Postback 實(shí)例代碼
更新時(shí)間:2009年08月07日 23:07:08 作者:
說(shuō)道ASP.NET的Postback,就得說(shuō)Web Page的生命周期,但是Web Page的生命周期卻不是三言兩語(yǔ)就能夠說(shuō)得清楚的,所以在這里單純站的編程的角度,撇開(kāi)Web Page 的生命周期淺談Postback。
上面的HTMLBody部分大體包括3個(gè)部分:
1. 定義了3個(gè)hidden field:
復(fù)制代碼 代碼如下:
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTA0NDQ2OTE5OWRk281L4eAk7iZT10hzg+BeOyoUWBQ=" />
從他們的命名可以看出他們分別代表的意思:__EVENTTARGET代表觸發(fā)Event的Control的Unique name;__EVENTARGUMENT代表為Event Handler定義的額外的參數(shù);__VIEWSTATE:代表的是Viewstate。
2. 一段script:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
<!--
var theForm = document.forms['form1'];
if (!theForm) {
theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
// -->
</script>
定義了一個(gè)__doPostBack function完成Postback的操作,該function只有區(qū)區(qū)3行代碼,前兩行通過(guò)參數(shù)對(duì)上面定義的兩個(gè)hidden field賦值,然后向Server端提交表單。
3. 一段HTML對(duì)應(yīng)通過(guò)ASP.NET定義的Web Control。
復(fù)制代碼 代碼如下:
<div>
<span id="LabelMessage" style="color:Red;"></span>
</div>
<div>
<input type="submit" name="Button1" value="Button1" id="Button1" />
<input type="button" name="Button2" value="Button2" onclick="javascript:__doPostBack('Button2','')" id="Button2" />
<input type="button" name="Button3" value="Button3" onclick="javascript:__doPostBack('Button3','')" id="Button3" />
div>
我們定義的3個(gè)Button被轉(zhuǎn)化成3個(gè)能向Server端提交表單的<input > Tag, 但是他們提交表的方式卻不一樣,第一個(gè)以<input type="submit">的方式提交,后面兩個(gè)通過(guò)調(diào)用javascript的方式提交表單(<input type="button">)。對(duì)于一個(gè)System.Web.UI.WebControls.Button,默認(rèn)采用第一種提交方式,但是我們通過(guò)設(shè)置UseSubmitBehavior屬性(這個(gè)屬性時(shí)ASP.NET 2.0新加的,1x沒(méi)有相應(yīng)的設(shè)置),改變其表單提交的行為。
當(dāng)用戶Click Button2的時(shí)候,調(diào)用__doPostBack,并傳入兩個(gè)參數(shù):一個(gè)代表出發(fā)Event的對(duì)象的Unique name,也就是Button2的名稱,另一個(gè)描述Event的額外信息的參數(shù),這里不需要,所以這里是空字符串。在__doPostBack中把這兩個(gè)參數(shù)賦值給兩個(gè)Hidden Field:__EVENTTARGET,__EVENTARGUMENT。然后向Server端提交表單,完成Postback。
然后我們來(lái)看看Server如何處理這個(gè)Postback,關(guān)于Web Page的生命周期在這里就不詳細(xì)介紹了。Server端通過(guò)__EVENTTARGET這個(gè)hidden field的值找到對(duì)應(yīng)的Server端的Control,通過(guò)Reflection確定該Control是否實(shí)現(xiàn)了System.Web.UI.IPostBackEventHandler Interface。如果該Control確實(shí)實(shí)現(xiàn)了該Interface,那么調(diào)用Page的RaisePostBackEvent方法,這是一個(gè)Virtual的方法,可以被Override。我們來(lái)看該方法的定義。
復(fù)制代碼 代碼如下:
[EditorBrowsable(EditorBrowsableState.Advanced)]
protected virtual void RaisePostBackEvent(IPostBackEventHandler sourceControl, string eventArgument)
{
sourceControl.RaisePostBackEvent(eventArgument);
}
我們可以看到該方法直接調(diào)用該sourceControl的RaisePostBackEvent,并傳入一個(gè)eventArgument參數(shù),在這個(gè)例子中sourceControl就是__EVENTTARGET對(duì)應(yīng)的Web Control:Button2,eventArgument就是__EVENTTARGET對(duì)應(yīng)的值:一個(gè)空字符串。Button2的類型是System.Web.UI.WebControls.Button。我們來(lái)看看System.Web.UI.WebControls.Button中的RaisePostBackEvent方法是如何定義的:
復(fù)制代碼 代碼如下:
protected virtual void RaisePostBackEvent(string eventArgument)
{
base.ValidateEvent(this.UniqueID, eventArgument);
if (this.CausesValidation)
{
this.Page.Validate(this.ValidationGroup);
}
this.OnClick(EventArgs.Empty);
this.OnCommand(new CommandEventArgs(this.CommandName, this.CommandArgument));
}
這個(gè)方法也很簡(jiǎn)單,先進(jìn)行Validation,然后先后出發(fā)兩個(gè)Event:OnClick 和OnCommand,隨后調(diào)用對(duì)應(yīng)的Event handler,這和我們的輸出結(jié)果是吻合的。
這基本上就是整個(gè)Postback的整個(gè)程序執(zhí)行的過(guò)程,現(xiàn)在我們對(duì)我們的Page作一些小的有趣的改動(dòng),來(lái)驗(yàn)證一下:
Client端和Server端進(jìn)行交互的途徑就是提交表單(Form Submitting),而我們現(xiàn)在有兩種方式來(lái)提交表單:通過(guò)<input type="submit">控件;通過(guò)調(diào)用javascript:__doPostBack?;谶@一點(diǎn)我們?cè)贖tml中加了下面一段javascript:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
function postback()
{
__doPostBack('Button1','');
}
document.getElementById("Button2").onclick = postback;
document.getElementById("Button3").onclick = postback;
</script>
我們override Button2和Button3的onclick event,把'Button1作為參數(shù)傳入__doPostBack方法,可以想象,現(xiàn)在無(wú)論Click那個(gè)Button,程序都將認(rèn)為之Click Button1。有興趣的可以親自試試,無(wú)論Click那個(gè)Button,顯示的效果都將是下面的樣子:

接下來(lái)我們?nèi)∠厦娴母膭?dòng),在Server對(duì)Code作另一方面的嘗試。我們前面說(shuō)過(guò),Server接受到Client的Postback,對(duì)于事件的Web Control(或者Html Server Control),如果實(shí)現(xiàn)了System.Web.UI.IPostBackEventHandler接口,會(huì)調(diào)用Page的virtual方法:RaisePostbackEvent,我們現(xiàn)在來(lái)Override這個(gè)方法:
復(fù)制代碼 代碼如下:
protected override void RaisePostBackEvent(IPostBackEventHandler sourceControl, string eventArgument)
{
sourceControl = this.Button1;
base.RaisePostBackEvent(sourceControl, eventArgument);
}
在上面的Code中,我們把sourceControl設(shè)為Button1,這樣無(wú)論在client端Click的那個(gè)Button,現(xiàn)在都將認(rèn)為是對(duì)Button的Click。運(yùn)行的結(jié)果和上面一樣。
通過(guò)上面的介紹,我們知道了Page的RaisePostBackEvent會(huì)調(diào)用Source Control的RaisePostBackEvent方法,這個(gè)方法是定義在IPostBackEventHandler接口中,很多Control都實(shí)現(xiàn)了這個(gè)方法,對(duì)于Button來(lái)說(shuō),這個(gè)方法是Virtual的,它可以被你Override,如果感興趣的話,可以自己寫一個(gè)Custom Button,并Override該方法,看看執(zhí)行的情況,相信會(huì)使加深你對(duì)Postback的理解。
相關(guān)文章
Asp.Net 5分鐘實(shí)現(xiàn)網(wǎng)頁(yè)實(shí)時(shí)監(jiān)控
在項(xiàng)目開(kāi)發(fā)中經(jīng)常會(huì)用到監(jiān)控功能,下面通過(guò)本篇文章給大家介紹Asp.Net 5分鐘實(shí)現(xiàn)網(wǎng)頁(yè)實(shí)時(shí)監(jiān)控,需要的朋友可以參考下2017-12-12
ASP.NET?Core管理應(yīng)用程序狀態(tài)
這篇文章介紹了ASP.NET?Core管理應(yīng)用程序狀態(tài)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
ASP.NET中CKEditor與CKFinder的配置使用
這篇文章主要介紹了ASP.NET中CKEditor與CKFinder的配置使用的相關(guān)資料,需要的朋友可以參考下2015-06-06
asp.net iis 無(wú)法顯示網(wǎng)頁(yè)的解決方法分析
使用過(guò)IIS的朋友都可能遇到過(guò)這樣的情況:即使您按照教科書(shū)的步驟做好各步設(shè)置以后,仍會(huì)出現(xiàn)“無(wú)法顯示網(wǎng)頁(yè)”的現(xiàn)象。2010-06-06
win8/8.1系統(tǒng)安裝.net framework 3.5出現(xiàn)0x800F0906代碼錯(cuò)誤的解決方法
這篇文章主要為大家詳細(xì)介紹了win8/8.1系統(tǒng)安裝.net framework 3.5出現(xiàn)0x800F0906代碼錯(cuò)誤的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
asp.net ASPxTextBox等控件實(shí)現(xiàn)"回車模擬Tab"的 常用代碼整理
今天我要實(shí)現(xiàn)一些編輯框如ASPxTextBox、ASPxComboBox等控件回車模擬Tab的功能。這沒(méi)辦法,用戶用慣了回車,討厭按Tab來(lái)移動(dòng)焦點(diǎn)(鼠標(biāo)點(diǎn)擊更麻煩)。2010-03-03
.NET?Core中配置Configuration的學(xué)習(xí)指南
.NET中的配置,本質(zhì)上就是key-value鍵值對(duì),并且key和value都是字符串類型,這篇文章主要為大家介紹了.NET?Core配置Configuration的相關(guān)知識(shí),希望對(duì)大家有一定的幫助2025-04-04

