轉載在以下兩篇博客:
http://www.cnblogs.com/yongtaiyu/archive/2011/05/13/2045746.html
http://www.cnblogs.com/Fooo/archive/2009/08/19/1549908.html
今天寫ajax程序時,需要重新從后台加載數據,所以用了__doPostBack方法。 __doPostBack並不是我自己寫的方法,是由asp.net 自己加入頁面中的方法。我們運行Asp.net程序后,會在生成的html源碼中看到__doPostBack方法,其代碼如下:
<script type="text/javascript"> //<![CDATA[ var theForm = document.forms['aspnetForm']; if (!theForm) { theForm = document.aspnetForm; } function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); } } //]]> </script>
__doPostBack說明: __doPostBack可以實現客戶端控件調用服務器端控件的響應。 __doPostBack方法的格式為: __doPostBack(eventTarget,eventArgument) 參數: eventTarget:是要觸發的服務器控件的客戶端ID eventArgument:參數
這個兩個值在后台可以通過下邊方法得到: Request["__EVENTTARGET"] :獲取得到引發頁面PostBack的控件ID Request["__EVENTARGUMENT"]: 獲取參數。
例子,回發UpDataPanel,通過參數獲取資料。 1)首先調用doPostBack觸發回發:
說明:
ctl00_ContentPlaceHolder1_upModulePower:是加了母版頁后的生成的客戶端ID。
jsPostback:用於判斷是不是通過js控件觸發的回發。因為UpDatePanel中會有其它服務器控件解發的回發,所以用此參數加以區分。
2) 在后台PageLoad中得到參數,並取數據。
其它問題: 但是在我們調用__doPostBack函數時,有些時候調用這個函數會出現"對象不存在"的腳本錯誤? 那是因為Html里面沒有__doPostBack函數體,一般在拖放那些有自動回傳功能的控件時,當把他的autoPostback屬性設為True,在運行的時候系統會自動添加__doPostback函數體。當然最直接的辦法就是添加一個LinkButton。在頁面中加如 LinkButton ,頁面就會在頁面中加載POSTBACK所需的JS,然后把其Text屬性設為空,切記不要設 Visible屬性,因為如果Visible=false,在翻譯成Html時,直接就忽略LinkButton的存在了
在.NET中,所有的服務器控件提交到服務器的時候,都會調用__doPostBack這個函數,所以靈活運用這個函數對於我們的幫助還是很大的.
比如,在我們寫程序的時候經常會需要動態的生成一些控件,最簡單的方法就是通過一個字符串,比如string strButton = <input type =”button” ID=”button1”>,然后輸出到頁面,但是如果我們需要這個控件來執行一些服務器的功能,就比較困難了.這里我們就可以用過借用__doPostBack這個函數來完成.接下來我覺個例子來說明一下具體如何調用.
既然要在服務器端運行那么,我們可以聲明一個不可見的LinkButton控件,那通常,我們希望一個控件不可見,通常都是把visible屬性設為false.但是在這里我們把LinkButton的Text屬性設置為空,來是這個LinkButton不可見(為什么要這么設置,而不是直接設置visible屬性,我會在下面說明),接下來我們可以在LinkButton里面寫一些服務器端的代碼.然后就是如何通過我們動態生成的客戶端控件來調用LinkButton里面的功能,我們可以通過一個JavaScript函數來實現
function ExcuteOnServer()
{
//第一個參數是你希望提交到服務器的控件的ID號,第二個參數是事件參數
__doPostBack('LinkButtonID','');
}
接下去我們只需要在動態生成的這個Button控件的onclick事件中寫上onclick=”JavaScript:ExcuteOnServer();",這樣當我們點擊這個動態生成的客戶端控件的時候,他便會執行LinkButton中的代碼.
這樣便實現了動態生成的客戶端控件提交到服務器端的功能.
最后要說一下的就是為什么希望LinkButton控件不可見的時候,不是通過visible屬性來完成的.因為當我們把visible屬性設置為false的時候,瀏覽器在解析的時候,根本不會把這個控件放在頁面上,也就是說這個控件是不存在的,所以我們在調用__doPostBack函數的時候,便會找不到控件.
這里介紹一個常用的函數_doPostBack,這個函數如果如果是ASP.Net render出來的頁面就是自動產生這個函數,比如有帶autopostback屬性的控件,且其屬性為true的頁面,帶編輯列的datagrid頁面。
__doPostBack 是通過__EVENTTARGET,__EVENTARGUMENT兩個隱藏控件向服務端發送控制信息的,__EVENTTARGET為要調用控件的名 稱,如果要調用的控件是子控件,用''$'或':'分割父控件:子控件,__EVENTARGUMENT是調用事件時的參數
下面演示下如何調用后台事件:
1.新建工程
2.拖入一個服務端Button1,一個DropDownList1和一個客戶端Button
3.設置DropDownList1的AutoPostBack屬性為True,Button1的Visible為False
4.雙擊Button1,在事件里寫下Response.Write("hello:" );
5.頁面的HTML里找到客戶端Button,寫入onclick="__doPostBack('Button1','')"
6.編譯,運行,點擊Button是不是出現了"Hello"
7.查看源代碼,發現里面多了下面行
<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="" />