__doPostBack作為在asp.net中一個很重要的部分,有必要深入瞭解一下__doPostBack的來龍去脈的.其實,__doPostBack是一個很簡單的JS function.代碼如下:
__doPostBack
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
因為最終呈現給瀏覽器的內容都是html內容,採用asp.net技術也不能例外.要實現webcontrol的postback機制.只能在原來的submit上做文章.ms呈現給我們的,就是這種精巧的思維!
我看到,asp.net現在頁面上添加了兩個hidden input,這兩個input分別用來存放觸發postback的control的ID和參數.這就是我們大部分人認識到的:
__doPostBack(obj1,obj2)的第一個參數是控制項ID,第二個參數是postback的參數.然後就可以在後台用Request.Form["__EVENTTARGET"]和Request.Form["__EVENTARGUMENT"]取得控制項ID和參數.
很簡單就實現了看似很神奇,以為內部有什麼高深的處理的過程!如此輕巧的實現了asp.net的postback機制,佩服佩服!只要我們看懂了上邊的代碼,對__doPostBack的使用就應該不是什麼難事了.可以說__doPostBack就是這麼簡單的一回事.-_-||
不過,另外要注意的就是asp.net的webcontrols中,Button和ImgButton是異類,它們不是利用__doPostBack來實現postback的.為什麼這樣,可能因為Button在html中本來就是有觸發submit事件的功能吧.asp.net不過是要令原來html中一些不能觸發submit的東西submit,才弄出了__doPostBack來實現.對於原來就能submit的Button,又何必多此一舉呢.(僅個人理解,未經驗證!)
所以如果是Button的postback,在後台是不能用Request.Form["__EVENTTARGET"]和Request.Form["__EVENTARGUMENT"]取得控制項ID和參數的.那麼,怎麼取呢?看代碼:
取Button
foreach (string str in Request.Form)
{
Control c = Page.FindControl(str);
if (c is Button)
{
control = c;
break;
}
}
如上寫法可以在後台找到Button.為什麼這樣? 不知道,呵呵. 在Button的提交過程中,Button會將Button本身的ID作為Request.Form的一個Key,它的Value是Button的Text屬性值,回傳給伺服器.所以可以在後台迴圈Form.Keys取到所提交的Button,以執行相應的函數.ImgButton也差不多,不同就在於,它不是用ImageButton的ID作為Request.Form的Key,它是用ImageButton的ID加上.x和.y作為Key,在Request.Form添加兩上索引值對,這兩個索引值應該是對應ImageButton的圖片大小的,瞭解了這個規律後,我們仍然可以通過一定的方式得到是否是由ImageButton引發的PostBack.
瞭解Postback機制對我們理解asp.net的事件觸發過程有很大的協助,好好利用__doPostBack更能靈活的使用戶端和伺服器端進行互動,獲得更好的客戶體驗.