欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談ASP.NET的Postback 實(shí)例代碼第2/2頁(yè)

 更新時(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,如果感興趣的話,可以自己寫(xiě)一個(gè)Custom Button,并Override該方法,看看執(zhí)行的情況,相信會(huì)使加深你對(duì)Postback的理解。

相關(guān)文章

最新評(píng)論