asp.net中的回送技术含义
1、 ASP.NET允许使用事件驱动的编程模型,这就像Windows本身一样,除非Windows响应了某个事件(如:单击图标、按“开始”菜单等),否则不会发生其他事件
2、 在ASP.NET中,web表单依赖事件触发特定函数中代码的运行,这些代码称为事件处理程序。JavaScript等也可由事件来触发,但它们是在用户浏览器端运行的,ASP.NET与之不同的是它使用“回送”技术,把信息传送回服务器上处理,而不是在浏览器上处理。这种回送(Postback)表示用户触发了一个事件时,信息可以传送回服务器
3、 利用回送技术,我们可以完成:在页面提交的过程中,记住在列表中选择了哪个选项,或者用户在文本框中输入了什么信息
4、 ASP.NET允许把代码与“只在某种需要引发函数的情况下运行的函数”分隔开,使代码的效率提高
二、 事件的概念
1、 可以把事件驱动的环境分为三个按时间顺序的部分:时间发生(用户单击“开始”按钮)、系统检测到事件(Windows检测到用户单击了“开始”按钮)、系统响应事件(Windows弹出“开始”菜单)
三、 什么是事件驱动的编程技术
1、 以前的过程式编程:代码是自上而下(顺序)执行的,即使执行了函数,执行的顺序也没有改变,如第二行由一组函数组成,则一旦执行完函数,主程序就会继续执行第三行,即执行的顺序没有被破坏
2、 事件驱动的编程技术:Windows在等待一个事件的发生,只要发生一个事件,它就会执行相应的操作,处理该事件
四、 ASP.NET中的事件
1、 ASP.NET中的任何事件都要涉及到对象
2、 有对象(如Page)才有——事件(如Page_Load),事件对应(调用)——函数(如Page_Load函数)
3、 每个Web表单都是一个Page对象,每次调用一个页面时,Page对象都会经历“初始化——处理——删除信息”的过程
4、 Page_Init()事件,在页面初始化时完成,与之相关联的是Page_Init()函数,它的工作方式与Page_Load()相同,但要早于Page_Load()
5、 Page_Load()事件在页面第一次可见的时候发生,但在Page_Init()事件之后发生。
6、 一旦加载了ASP.NET服务器控件,它们就可以响应一系列的(用户)页面事件,如单击事件,列表或复选框的改变等等。这些只在表单传送回服务器时处理。
7、 Page_Unload()事件在处理了页面上的控件事件之后发生,是切断数据库连接的理想位置
8、 当Page对象第一次实例化时,它是完全空白的,每次提交页面时,都要实例化Page对象的一个新版本。
9、 每个Page对象都是完全独立的,在页面之间没有连续性,必须用其他方式(如session)处理。ASP.NET可以使用ASP.NET控件的某些功能,记住存储在控件中的信息状态。
10、 澄清概念:对象触发事件,事件调用函数!
11、 把代码放在Page_Load()函数中,它将在页面第一次加载时触发;如果把同一段代码放在另一个函数中,它将只在另一个事件触发该函数时运行;若此函数与任何事件都不相关,则此段代码将永远不会运行。
12、 将各事件处理函数中“公用”的功能提取出来,写成一个函数,以便在各事件处理函数中进行调用,而不需要在每个事件处理函数中都编写相同的代码。
13、 Page_Unload()事件是在是在页面上所有的ASP.NET代码执行完,完成任务之后才发生。如果要在用户移动到另一个页面之前执行特定的操作,就应该把这些操作放在这个事件当中。不能在相关的Page_Unload()函数中使用控件或ASP.NET语句来显示代码。
14、 Page_Init()事件的特性:在页面初始化后,重新加载页面时,Page_Init()函数仍被触发,但在第一次调用之后,就不改变服务器控件中的文本了。
五、 HTML中的事件
1、 HTML中的事件就是由客户端(技术)来响应事件,一般HTML会组合使用表单和一小部分客户端脚本来达到这个目的
2、 几乎每一个HTML元素都支持下面的事件:onmouseup,onmousedown,onmouseover,onmousemove,onclick,onkeyup,onkeypress,onkeydown,等等。可以用任何一种语言编写响应此事件的代码,即事件处理程序。
六、 ASP.NET中的服务器控件事件
1、 ASP.NET允许在服务器控件上是使用事件,例如onclick和onload,然后用任何一种.NET语言编写响应这些事件的ASP.NET代码,即事件处理程序
2、 在ASP.NET中,事件由Web服务器处理,并把纯HTML发送回浏览器
3、 按钮控件onclick事件示例:
<asp:button id=”button1” text=”Click Me” onclick=”ClickEventHandler” runat=”server” />
<script language=”c#” runat=server>
Void ClickEventHandler(object sender,EventArgs e)
{
//C# codes here
}
</script>
其中,参数sender提供引发事件的对象的引用(即哪个对象发生的事件)(因为同一个事件可以是由不同的对象引发的),参数e捕获与要处理事件的状态相关的信息(即发生了什么事件)(记录服务器控件的状态,如“是否被选中”等)
4、 如果没有提供同名的函数,当触发事件时什么都不会发生;只有当服务器控件属性中的函数名称匹配于代码中的函数名称时,函数才会运行。
5、 ASP.NET服务器控件所提供的事件如下:onload,onunload,onclick,oninit,onprerender等
6、 HTML和ASP.NET最大的区别是他们的处理方式不同。HTML表单控件,当引发事件时,由浏览器处理事件;对于服务器控件,事件仍由浏览器引发,但不是由浏览器处理它,而是由服务器处理事件。浏览器只生成一个表单回送事件,当单击ASP.NET按钮控件时,该事件就会发生。在页面上执行的其他操作都会封装到这个事件当中,例如填充文本框,选择单选按钮,或从列表框中选择一个项。在发送表单时,将记录这些信息。
7、 无论发生什么类型的事件,客户机总是会给服务器返回一个“回送事件”,但是一些事件不能在服务器上处理,如keypress和mouseover等,没有对应的ASP.NET事件可以处理这些事件,他们不是由服务器来处理,而是由客户机来处理。
8、 整个事件集对应于我们对页面进行的修改,必须在一个离散的操作中完成。
9、 过程:初始化Page对象(Page_Init())——加载页面(Page_Load())——(一系列事件发生)——把控件事件都绑定到一个回送事件上并处理——卸载页面(Page_Unload())
10、 按钮控件是ASP.NET服务器控件中专门用于响应事件的,它执行和HTML控件中input type=button相同的功能。见示例rm225.aspx
11、 每个生成的事件都会生成关于自己的信息,例如它是由哪个控件生成的。要在函数中使用此信息,必须用两个参数传送(接收)它们。第一个参数的类型是object,命名为sender,第二个参数的类型为EventArgs,命名为e。这两个参数都传送给可由ASP.NET触发的任一服务器端事件(如onclick等)。它们是标准参数,所有的事件处理程序都必须有。如果在使用服务器端事件时没有指定它们,就会产生一个错误。
七、 事件驱动的编程和回送(行为)
1、 这里指的不是简单地将表单中填写的数据传送回服务器端处理,而是类似于将服务器端控件的状态信息(EventArgs e)传送回服务器
2、 “回送”的过程:浏览器把信息传送回服务器,让服务器处理事件,服务器处理事件后,再把得到的HTML返回给浏览器。
3、 “回送”只在web表单中发生(而非服务器端);只有ASP.NET服务器控件才能把信息“回送”给服务器
4、 在服务器端处理事件的优点是不用依赖用户浏览器来识别客户端脚本,而且浏览器可以发送回额外的信息,如ASP.NET服务器控件的状态等,以帮助做出决策。
5、 查看经web服务器解释过的ASP.NET文件时,会发现最大的变化是增加了隐藏的_VIEWSTATE控件,关于表单(初始)状态的信息会在此控件中发送回来。实际上,包含在_VIEWSTATE控件value属性中的信息就是加密的原始(初始)表单的版本。ASP.NET查看旧(初始)版本,并与(此次)提交的表单版本做比较。从比较中可以确定如何在页面提交的过程中保留ASP.NET服务器控件的状态。如果它们有区别,例如选择了不同的单选按钮,ASP.NET就会生成内部事件,响应这个区别,并处理该事件,创建表单的“当前”版本。这样就可以记录页面提交过程中ASP.NET控件的状态,而无须使用额外的技术或者维持HTTP连接通信。
6、 _VIEWSTATE控件的value记录了页面上一次提交时的状态,也就是此次页面载入时候显示的状态,被ASP.NET用来与本次表单提交时的状态作对比用,以确定是否发生了一个事件,以及发生了什么事件。(即通过增加额外的数据量来达到类似于维护页面间的关联的目的)
八、 改变Web上的编程方式
1、 Page_Load()函数与其他函数略有不同,因为ASP.NET会自动调用该函数。
2、 所有的ASP.NET代码都必须放在函数中!
3、 为了让ASP.NET响应其他事件,必须创建自己的事件处理程序,使用自己的函数。这些函数由HTML服务器控件的事件属性来调用,如onclick。在调用这些函数时,可以使用事件参数传送被调用事件的信息。
4、 现在,“引用由表单传送的信息(数据)的方式(如post数据)”可以被“引用由服务器控件捕获的数据的方式”彻底改变了
5、 If(Request.Form[“ExtraInfoBox”]==”on”)可以替换为
if(ExtraInfoBox.Checked),因为所有的HTML服务器控件都创建为单独的对象,可以在调用函数中访问它们。这些对象可以引用服务器控件的任何属性
6、 在C#中进行的所有编程都是事件驱动的,只有一点区别,ASP.NET自动引发事件,如Page_Init和Page_Load,而用户可以通过单击可引发事件的按钮,来引发事件。无论哪种情况,它们的执行方式都一样,使程序暂停目前的行为,去执行请求的函数
7、 现在需要的不是将表单数据提交(post)给服务器端处理程序(ASP时代的思路),而是用一个按钮去触发一个事件(如onclick),事件对应一个事件处理程序(如onclick=”Add”),由此事件处理程序去找表单服务器控件的某个属性(如Text或checked等),将此属性(的结果)进行(程序预置的)处理