__dopostback的用法
在.NET中,所有的服務器控件提交到服務器的時候,都會調(diào)用__doPostBack這個函數(shù),所以靈活運用這個函數(shù)對于我們的幫助還是很大的.
?????? 比如,在我們寫程序的時候經(jīng)常會需要動態(tài)的生成一些控件,最簡單的方法就是通過一個字符串,比如string strButton = <input type =”button” ID=”button1”>,然后輸出到頁面,但是如果我們需要這個控件來執(zhí)行一些服務器的功能,就比較困難了.這里我們就可以用過借用 __doPostBack這個函數(shù)來完成.接下來我覺個例子來說明一下具體如何調(diào)用.
?????? 既然要在服務器端運行那么,我們可以聲明一個不可見的LinkButton控件,那通常,我們希望一個控件不可見,通常都是把visible屬性設為 false.但是在這里我們把LinkButton的Text屬性設置為空,來是這個LinkButton不可見(為什么要這么設置,而不是直接設置 visible屬性,我會在下面說明),接下來我們可以在LinkButton里面寫一些服務器端的代碼.然后就是如何通過我們動態(tài)生成的客戶端控件來調(diào) 用LinkButton里面的功能,我們可以通過一個JavaScript函數(shù)來實現(xiàn)
?????? function ExcuteOnServer()
?????? {
?????? //第一個參數(shù)是你希望提交到服務器的控件的ID號,第二個參數(shù)是事件參數(shù)
?????? __doPostBack('LinkButtonID','');
?????? }
?????? 接下去我們只需要在動態(tài)生成的這個Button控件的onclick事件中寫上οnclick=”JavaScript:ExcuteOnServer();",這樣當我們點擊這個動態(tài)生成的客戶端控件的時候,他便會執(zhí)行LinkButton中的代碼.
?????? 這樣便實現(xiàn)了動態(tài)生成的客戶端控件提交到服務器端的功能.
?????? 最后要說一下的就是為什么希望LinkButton控件不可見的時候,不是通過visible屬性來完成的.因為當我們把visible屬性設置為 false的時候,瀏覽器在解析的時候,根本不會把這個控件放在頁面上,也就是說這個控件是不存在的,所以我們在調(diào)用__doPostBack函數(shù)的時 候,便會找不到控件.
這里介紹一個常用的函數(shù)_doPostBack,這個函數(shù)如果如果是ASP.Net render出來的頁面就是自動產(chǎn)生這個函數(shù),比如有帶autopostback屬性的控件,且其屬性為true的頁面,帶編輯列的datagrid頁面。
__doPostBack 是通過__EVENTTARGET,__EVENTARGUMENT兩個隱藏控件向服務端發(fā)送控制信息的,__EVENTTARGET為要調(diào)用控件的名 稱,如果要調(diào)用的控件是子控件,用''$'或':'分割父控件:子控件,__EVENTARGUMENT是調(diào)用事件時的參數(shù)
下面演示下如何調(diào)用后臺事件:
1.新建工程
2.拖入一個服務端Button1,一個DropDownList1和一個客戶端Button
3.設置DropDownList1的AutoPostBack屬性為True,Button1的Visible為False
4.雙擊Button1,在事件里寫下Response.Write("hello:" );
5.頁面的HTML里找到客戶端Button,寫入οnclick="__doPostBack('Button1','')"
6.編譯,運行,點擊Button是不是出現(xiàn)了"Hello"
7.查看源代碼,發(fā)現(xiàn)里面多了下面行
<script language="javascript"> <!-- ????function __doPostBack(eventTarget, eventArgument) { ????????var theform; ????????if (window.navigator.appName.toLowerCase().indexOf("netscape") > -1) { ?????????????? theform = document.forms["Form1"]; ?????????? } ????????else { ?????????????? theform = document.Form1; ?????????? } ?????????? theform.__EVENTTARGET.value = eventTarget.split("$").join(":"); ?????????? theform.__EVENTARGUMENT.value = eventArgument; ?????????? theform.submit(); ?????? } // --> </script> <input type="hidden" value="" /> <input type="hidden" value="" />細 心的人會發(fā)現(xiàn),在__doPostBack里,提交調(diào)用的是theform.submit(),這樣就導致對Form的onsubmit事件校驗失效了, 幸好這個問題在asp.net 2.0已經(jīng)修復了。這里提供一個替換的解決辦法,在Form的最下面插入下面的代碼,這段代碼在保證不管是不是render出來的頁面均有效
????????????<script language="javascript">?
<!-- ????function __doPostBack_Ex(eventTarget, eventArgument)??? {
?????? var theform;
?????? if (window.navigator.appName.toLowerCase().indexOf("netscape") > -1)
{?????????????? theform = document.forms[0];
?????????? }
?????? else {
????????????? theform = document.forms[0];
?????????? }
??????? if(!theform.__EVENTTARGET)
??????? {????????????
?????????????? theform.appendChild(document.createElement("<input type='hidden' name='__EVENTTARGET'>"));
?????????? }
??????? if(!theform.__EVENTARGUMENT)
??????? {????????????
?????????????? theform.appendChild(document.createElement("<input type='hidden' name='__EVENTARGUMENT'>"));????????????????????????
?????????? }
?????????? theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
?????????? theform.__EVENTARGUMENT.value = eventArgument;
??????? if ((typeof(theform.onsubmit) == "function"))
??????? {
??????????? if(theform.onsubmit()!=false)
??????????? {
?????????????????? theform.submit();????
?????????????? }
?????????? }
??????? else
??????? {????????????
?????????????? theform.submit();????
?????????? }
??????? function __doPostBack(eventTarget, eventArgument)
??????? {
?????????????? __doPostBack_Ex(eventTarget, eventArgument);
?????????? }
?????? }
總結
以上是生活随笔為你收集整理的__dopostback的用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flex与.NET互操作(九):Fluo
- 下一篇: C# new()约束简单介绍