以前寫asp的程序的時候,知道只有type設置為submit的按鈕,才能觸發表單提交數據給服務器端。
如:Asp.Net中的Button就是等於<input type="submit">.
但是現在Asp.Net的好多控件都可以任意的和服務器端交互,如:LinkButton.
這是怎麼實現的呢?
難道是一種全新的方式嗎?
其實,這只是微軟的一種變通的方式。
我們先來看看客戶端的代碼是如何的.
我這裡是一個帶有LinkButton的頁面,
其實LinkButton在客戶端就等於html裡的A.
我們來看看LinkButton為什麼也能和服務器端交互?
當我們點擊右鍵查看該頁面的源代碼時,看到:
<script type="text/javascript">
<!--
var theForm = document.forms['ctl00'];
if (!theForm) {
theForm = document.ctl00;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
// -->
</script>
<a id="simpleLinkButton1" href="javascript:__doPostBack('simpleLinkButton1','')">Click Me</a>
從上面的代碼中就可以看出simpleLinkButton1是一個鏈接,通過客戶端代碼來提交所在的表單。
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
而其中兩個隱藏域,則用來交換數據的,就是把__doPostBack的兩個參數值賦給這兩個隱藏域。
這就是為什麼LinkButton也具有提交數據的最直觀的原因。
那麼這上面的代碼是怎麼生成的呢?
我們看LinkButton的源代碼就可以清楚地知道:
protected internal override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
if ((this.Page != null) && this.Enabled)
{
this.Page.RegisterPostBackScript();
if ((this.CausesValidation && (this.Page.GetValidators(this.ValidationGroup).Count > 0)) || !string.IsNullOrEmpty(this.PostBackUrl))
{
this.Page.RegisterWebFormsScript();
}
}
}
以上只是把自己在學習工作過程中的一些體會記錄如此,防止自己忘記了。
也望和大家多多交流