Asp.net页面事件引发后台程序处理原理
以前在ASP中,不存在事件处理,传统的处理方法是通过隐藏文本框来提交不同的参数进行区别用户的不同动作,或则用不同的URL查询字符串来区别。ASP.NET中出现了事件处理,让开发人员区分用户动作方便并简单了许多。
实际上,ASP.NET中区别用户动作引发的事件处理同样也是采用了传统方式,不过,MS将其封装了起来,让开发人员用起来更贴近于软件开发中的事件驱动方式。
在ASP.NET中,几乎每一个控件都带有多种事件,开发人员可以在后台通过编写事件捆绑和事件处理来完成不同的工作。并且,可以在传统方式中无法引发事件的控件中使用事件,如超链接、图片、纯文本。
ASP.NET中辨别用户动作关联事件的方法总体来看可以分成两种。
一、在只存在BUTTON按钮控件的情况下,ASP.NET辨别用户动作并关联事件不需要其他辅助方式。
ASP.NET将所有的BUTTON在生成HTML代码的时候都生成为SUBMIT的提交按钮,当多个提交按钮在同一个FORM内时,通过SUBMIT按钮提交的FORM集合中不会包含其他SUBMIT类型的提交按钮,这样,ASP.NET在预处理的前就将所有SUBMIT提交按钮记录下来,用户执行提交后ASP.NET挨个的检查FORM集合中的SUBMIT按钮,因为只可能存在一个SUBMIT,所以检查出的唯一的一个SUBMIT就是用户动作触发提交的按钮,然后再对应的执行这个按钮的后台事件处理。
二、在存在传统中并不能直接执行FORM提交的控件时。ASP.NET通过使用两个隐藏的文本表单控件来辨别用户执行的提交动作。
当在ASPX文件中使用了LINKBUTTON或则其他不是传统的SUBMIT提交按钮来执行后台事件处理的时候,ASP.NET生成的HTML代码中在FORM内的最前面会生成出两个隐藏的文本筐控件
<input type="hidden" name="__EVENTTARGET">
<input type="hidden" name="__EVENTARGUMENT">
并生成一段JAVASCRIPT代码
<script language="javascript">
<!--
function __doPostBack(eventTarget, eventArgument) {
var theform;
if (window.navigator.appName.toLowerCase().indexOf("netscape") > -1) {
theform = document.forms["Form1"];
}
else {
theform = document.Form1;
}
theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
theform.__EVENTARGUMENT.value = eventArgument;
theform.submit();
}
// -->
</script>
然后在每个加有事件处理的控件的事件属性中都加上了__doPostBack('控件ID','参数值')这个JAVASCRIPT方法,__doPostBack这个JAVASCRIPT处理方法的作用就是将调用这个方法的控件ID记录下来,如果是在模板类型的控件中还需要一些组合转换,然后记录执行参数。最后,将这两个值分别赋给在FORM内最前面的那两个隐藏文本筐中,最后,执行FORM的SUBMIT方法将页面提交。
页面提交后,ASP.NET会首先检查两个隐藏表单中的值,然后根据这两个值首先执行控件中的处理方法,然后控件内部的处理再将事件委托给页面的相关事件进行处理。
这样ASP.NET就完成了通过用户动作触发关联事件处理程序的过程。