ASP.NET的客户端事件是如何映射成服务器端事件的

在所有ASP.NET服务器控件中,只有Button和ImageButton能直接引发回传,当在这两种控件上触发事件时,控件的ID会作为参数传给服务器,从而使服务器得知该映射到哪个后端事件;其他控件则全部使用名为__doPostBack的javascript方法来触发回传。

__doPostBack方法定义如下:

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /> <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}

其中,__EVENTTARGET和__EVENTARGUMENT两个隐藏域会被自动声明,分别指向触发事件的控件ID和相应的附加参数(比如,该控件可触发多个事件,则附加参数会指明是哪个事件被触发而引起回传)ASP.NET正是通过这两个隐藏域的值来判断该如何将客户端事件映射为对应的服务器端事件的。

例如:

向页面中添加一个TextBox控件,并将其AutoPostBack属性设为true:

<aspextBox ID="TextBox1" runat="server"  AutoPostBack="true"></aspextBox>

浏览页面并查看页面源码,会看到该TextBox控件被生成为类似如下的代码:

<input name="TextBox1" id="TextBox1" type="text"/>

可以看到TextBox在浏览器端的onchange事件与__doPostBack()进行了关联,eventTarget传入实参为'TextBox1',eventArgument传入实参为''(因为只有这一个事件引发回传,无需指定附加参数)。

相应的,在服务器端,可以以编码方式获得引发本次回传的控件的信息:

protected void Page_Load(object sender, EventArgs e)
{
  string scontrolName = Request.Params.Get("__EVENTTARGET");
}

posted @ 2012-01-18 14:35  ^_^肥仔John  阅读(285)  评论(0编辑  收藏  举报