Asp.net 中服务端控件事件是如何触发的
2003-09-12 19:29
537 查看
Asp.net 中在客户端触发服务端事件分为两种情况:
一. [/b]WebControls[/b]中的[/b]Button [/b]和[/b]HtmlControls[/b]中的[/b]Type[/b]为[/b]submit[/b]的[/b]HtmlInputButton[/b]
这两种按钮最终到客户端的表现形式为: <input name="Submit1" id="Submit1" type="submit" value=”Submit”>,这是Form表单的提交按钮,点击以后会作为参数发送到服务端,参数是这样的: 控件的name属性=控件的value值,对应上面的例子就是:Submit1= Submit。 服务端会根据接收到的控件的name属性的这个key来得知是这个按钮被点击了,从而在服务端触发这个按钮的点击事件。
二. [/b]ImageButton[/b]或者[/b]HttpInputImage:[/b]
这些控件到客户端的表现类似这样的: <input type=image id=img1>,点击了这样的控件会直接提交表单,作用同提交按钮。点击了这样的控件传到服务端的参数是这样的:id.x=nn&id.y=nn,对应到上面的例子就是:img1.x=nn&img1.y=nn
三. [/b]HtmlControls [/b]中的[/b] Type[/b]为[/b]button[/b]的[/b]HtmlInputButton [/b]和其它所有的控件事件,比如[/b]LinkButton[/b]点击,[/b]TextBox[/b]的[/b]Change[/b]事件等等:[/b][/b]
这些事件在客户端产生后会经过一个统一的机制发送到服务端。
1. 首先asp.net页框架会使用两个Hidden域来存放表示是哪个控件触发的事件,以及事件的参数:
<!—表示触发事件的控件,一般是这个控件的name -->
<input type="hidden" name="__EVENTTARGET" value="" />
<!—表示触发事件的参数,一般是当某个控件有两个以上的事件时,用来区别是哪个事件 -->
<input type="hidden" name="__EVENTARGUMENT" value="" />
2. 服务端会生成一个jscript的方法来处理所有这些事件的发送,这段代码是:
<script language="javascript">
<!--
function __doPostBack(eventTarget, eventArgument) {
var theform = document.WebForm2;
theform.__EVENTTARGET.value = eventTarget;
theform.__EVENTARGUMENT.value = eventArgument;
theform.submit();
}
// -->
</script>
3. 每个会引发服务端事件的控件都会在响应的客户端事件中调用上面的代码:
比如,HtmlControls 中的 Type为button的HtmlInputButton的点击事件
<!—客户端的点击事件调用__doPostBack,eventTarget 参数为'Button2',表示是name为'Button2’控件触发的事件,eventArgument 为空,表示这个Type为button的HtmlInputButton只有一个客户端触发的服务端事件-->
<input language="javascript" onclick="__doPostBack('Button2','')" name="Button2" id="Button2" type="button" value="Button" />
又比如,TextBox控件的Change事件
<!—客户端的onchange事件调用__doPostBack,eventTarget 参数为’TextBox1’,表示是name为’TextBox1’控件触发的事件,而TextBox控件只有一个客户端触发的服务端事件TextChanged,故服务器就会去触发这个TextBox的TextChanged事件->
<input name="TextBox1" type="text" id="TextBox1" onchange="__doPostBack('TextBox1','')" language="javascript" />
4. 客户端触发事件后调用__doPostBack方法,将表示触发的控件源的eventTarget 和事件参数eventArgument分别付给两个隐藏域__EVENTTARGET和__EVENTARGUMENT,然后提交Form,在服务端根据__EVENTTARGET和__EVENTARGUMENT来判断是哪个控件的什么事件触发了。
一. [/b]WebControls[/b]中的[/b]Button [/b]和[/b]HtmlControls[/b]中的[/b]Type[/b]为[/b]submit[/b]的[/b]HtmlInputButton[/b]
这两种按钮最终到客户端的表现形式为: <input name="Submit1" id="Submit1" type="submit" value=”Submit”>,这是Form表单的提交按钮,点击以后会作为参数发送到服务端,参数是这样的: 控件的name属性=控件的value值,对应上面的例子就是:Submit1= Submit。 服务端会根据接收到的控件的name属性的这个key来得知是这个按钮被点击了,从而在服务端触发这个按钮的点击事件。
二. [/b]ImageButton[/b]或者[/b]HttpInputImage:[/b]
这些控件到客户端的表现类似这样的: <input type=image id=img1>,点击了这样的控件会直接提交表单,作用同提交按钮。点击了这样的控件传到服务端的参数是这样的:id.x=nn&id.y=nn,对应到上面的例子就是:img1.x=nn&img1.y=nn
三. [/b]HtmlControls [/b]中的[/b] Type[/b]为[/b]button[/b]的[/b]HtmlInputButton [/b]和其它所有的控件事件,比如[/b]LinkButton[/b]点击,[/b]TextBox[/b]的[/b]Change[/b]事件等等:[/b][/b]
这些事件在客户端产生后会经过一个统一的机制发送到服务端。
1. 首先asp.net页框架会使用两个Hidden域来存放表示是哪个控件触发的事件,以及事件的参数:
<!—表示触发事件的控件,一般是这个控件的name -->
<input type="hidden" name="__EVENTTARGET" value="" />
<!—表示触发事件的参数,一般是当某个控件有两个以上的事件时,用来区别是哪个事件 -->
<input type="hidden" name="__EVENTARGUMENT" value="" />
2. 服务端会生成一个jscript的方法来处理所有这些事件的发送,这段代码是:
<script language="javascript">
<!--
function __doPostBack(eventTarget, eventArgument) {
var theform = document.WebForm2;
theform.__EVENTTARGET.value = eventTarget;
theform.__EVENTARGUMENT.value = eventArgument;
theform.submit();
}
// -->
</script>
3. 每个会引发服务端事件的控件都会在响应的客户端事件中调用上面的代码:
比如,HtmlControls 中的 Type为button的HtmlInputButton的点击事件
<!—客户端的点击事件调用__doPostBack,eventTarget 参数为'Button2',表示是name为'Button2’控件触发的事件,eventArgument 为空,表示这个Type为button的HtmlInputButton只有一个客户端触发的服务端事件-->
<input language="javascript" onclick="__doPostBack('Button2','')" name="Button2" id="Button2" type="button" value="Button" />
又比如,TextBox控件的Change事件
<!—客户端的onchange事件调用__doPostBack,eventTarget 参数为’TextBox1’,表示是name为’TextBox1’控件触发的事件,而TextBox控件只有一个客户端触发的服务端事件TextChanged,故服务器就会去触发这个TextBox的TextChanged事件->
<input name="TextBox1" type="text" id="TextBox1" onchange="__doPostBack('TextBox1','')" language="javascript" />
4. 客户端触发事件后调用__doPostBack方法,将表示触发的控件源的eventTarget 和事件参数eventArgument分别付给两个隐藏域__EVENTTARGET和__EVENTARGUMENT,然后提交Form,在服务端根据__EVENTTARGET和__EVENTARGUMENT来判断是哪个控件的什么事件触发了。
相关文章推荐
- 将动态aspx页面,保存为静态htm文件
- 使用ASP+jmail进行邮件群发
- 在ASP中使用简单Java类
- asp 中常用的文件处理函数
- 跟我学AspectJ(四)
- ASP->ASP.NET 迁移的Guideline
- 编译 asp 应用程序成为 exe 文件
- 跟我学AspectJ(三)
- 在IIS6中新增可下载文件类型及IIS6中破除ASP上传200KB的限制
- 用ASP.NET开发Web服务的五则技巧
- 学习ASP.NET的体会(一)
- 在ASP.NET下用Microsoft Excel进行数据分析与报表
- 用 Asp.Net 建立一个在线 RSS 新闻聚合器的方法
- 一个ASP版的图片浏览器(和杀手)
- 用ASP将数据读数导出EXCEL文件的四种方法
- 跟我学AspectJ(二)
- AspectJ实现设计模式(七)—装饰模式
- 将ASP写成DLL
- 在ASP程序中打印Excel报表的新方法
- 如何在ASP程序中打印Excel报表(无组件的经典程序)