今天看到GetCallbackEventReference的函数,然后想试一下。
先是找到这种说法http://tech.sina.com.cn/s/2006-04-20/1522911788.shtml。但在aspx中用<%=ClientScript.GetCallbackEventReference(this, ......)%>,老是不成功,这种写法到底是什么时候被支持,什么时候不被支持,我也不想搞清楚了。
后来找到另一种表达方法:http://hi.baidu.com/analyzecode/blog/item/b5fdf1110a5be2c6a7ef3fb1.html,这可以成功,这下才能了解一下。
程序运行后,页面被多加了以下内容:
<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTI1ODcyNDQxMmRkT2Aj0VhN7+7C5M18riIUFQnBHIQ=" />
</div>
<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
//]]>
</script>
<script src="/WebResource.axd?d=ZQ2twBFhD9k59lqjqvMlNA2&t=633661865561421920" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
function ReceiveServerData1(arg, context){context.innerHTML = arg;}
function ProcessCallBackError(arg, context){alert('An error has occurred.');}
function CallTheServer1(arg, context) {WebForm_DoCallback('__Page',arg,ReceiveServerData1,context,ProcessCallBackError,false); }//]]>
</script>
<div>
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAgKc/oPPAwLp06QgRFoiATcn2oduty9HnpFvP0qeO1I=" />
</div>
执行过程如下:点击按钮时,执行CallTheServer1,里面又跑到WebForm_DoCallback,这里面,有明显的
xmlRequest = new XMLHttpRequest();
……
xmlRequest.open("POST", theForm.action, true);
xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
xmlRequest.send(postData);
原来还是xmlHttp。
比较一下,如果使用这种方法,要增加接口System.Web.UI.ICallbackEventHandler以及它的两个方法GetCallbackResult、RaiseCallbackEvent,其中GetCallbackResult为处理程序。然后在Page_Load中至少要用GetCallbackEventReference生成一个脚本注册上去。然后系统还附加了一堆其它代码,以及一个复杂的JS文件。不划算!
而用自己的方法则是代码中直接使用xmlHttp,带参数传递到服务器,然后服务器的Page_Load中进行区分,服务器一般只要一个处理程序即可。还是先用自己的方法吧。