ASP.NET自动回发的内幕
使用自动回发,需要将webcontrol的AutoPostBack属性设置为True(默认为false)。设置完后,ASP.NET使用javascript的将客户端代码和服务端代码联系起来。
具体细节如下:如果创建了一个包含一个或多个web控件的页面,这些控件都使用了AutoPostBack,ASP.NET向HTML页面添加了一个_doPostBack()的javascript函数。被调用时,它就触发回发,将所有的form信息回发给web服务器。
ASP.NET还添加了两个隐藏文本,_doPostBack()函数用它们两个来把信息提交到服务器。这些信息包括触发事件的控件的ID以及其它一些相关信息。这两个隐藏文本刚开始时空的,就像这样:
1 <div class="aspNetHidden">
2 <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
3 <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
4 </div>
_doPostBack()函数负责将和事件有关的信息设置为它们的值,然后提交form。_doPostBack函数如下:
1 function __doPostBack(eventTarget, eventArgument) {
2 if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
3 theForm.__EVENTTARGET.value = eventTarget;
4 theForm.__EVENTARGUMENT.value = eventArgument;
5 theForm.submit();
6 }
7 }
_doPostBack()函数是ASP.NET自动生成的。这段代码的长度会随着页面中使用AutoPostBack控件的增多而变长,因为必须为每个控件设置事件数据。
最后,任何将AutoPostBack属性设置为True的控件会使用onclick或onchange属性和_doPostBack()联系起来。这些属性表示浏览器应该怎么响应客户端javascript的onclick和onchange事件。
下边是一个DropDownList的HTML代码,它的AutoPostBack属性为True。每次用户改变列表中的选项时,客户端的onchange事件都会触发。然后浏览器调用_doPostBack()函数将页面回发到服务器:
1 <select name="DropDownList1" onchange="javascript:setTimeout('__doPostBack(\'DropDownList1\',\'\')', 0)" id="DropDownList1">
换句话说,ASP.NET自动将客户端的javascript事件转变为服务器端ASP.NET事件,将_doPostBack()作为中介。
注意:ASP.NET包含两种控件类型:一个是HTML服务器控件,一个是web控件。只有web控件才能自动回发。
出自 Pro ASP.NET 4 In C# 2010