ASP.NET中的事件处理
一、ASP.NET中的事件主要支持3个主要的事件组:
1、包含在asp.net生成页面时自动生成,我们使用这些事件建立页面(如page_load等)
2、包含了用户与页面交互时发生的所有事件(这种最强大)
3、html内部的事件,这些事件在浏览器上执行(主要是由javascript来实现)。
在C#语言中,事件的处理主要有两种方法:
1、委托式事件处理模式(Delegation Event Model) (VS2003中需要手工建立事件的委托关系,VS2005不需要了。)
2、对可重载方法(Event Method)的重载 (在控件代码中重载方法)
二、ASP.NET服务端添加客户端事件:
服务器控件并不是所有的操作都是在服务器端执行的,有的事件是通过客户端脚本来执行的,这样可以大大增强服务器控件的可用性。如ASP.NET验证控件,可以把部分工作放在客户端进行验证。
ASP.NET服务器控件可以发送两种客户端脚本:
1、客户端脚本块:客户端脚本块通常是用JavaScript编写的,其中通常包含在发生特定的客户端事件时执行的函数。
发送脚本块的方法是使用System.Web.UI.Page类包含的两个方法可以将客户端代码发送到由ASP.NET Web页面提供的HTML中:
(1)、RegisterStartupScript(key,script):在Web窗体的结尾处(在</form> 标记之前)发送脚本块。
(2)、RegisterClientScriptBlock(key,script):在Web窗体的开始处(紧接着<form runat="server">标识之后)发送脚本块。
如:
1 protected override void OnPreRender(EventArgs e)
2 {
3 if (!Page.ClientScript.IsClientScriptBlockRegistered("Common"))
4 {
5 Page.ClientScript.RegisterClientScriptBlock(typeof(Page), "Common", ClientJavaScriptCodeScipt("Common.js"));
6 }
7 if (!Page.ClientScript.IsClientScriptBlockRegistered(ScriptKey))
8 {
9 Page.ClientScript.RegisterClientScriptBlock(typeof(Page), ScriptKey, ClientJavaScriptCodeScipt("DateTime.js"));
10 }
11 }
2、客户端HTML属性:客户端HTML属性提供将客户端事件与客户端脚本联系在一起的方法。
这种方法只适用于从System.Web.UI.WebControls.WebControl类导出的服务器控件,因为从这个类导出的控件会发送某些HTML元素。
WebControl类包含一个将HTML元素属性添加到由Web控件发出的HTML元素的方法,该方法称为AddAttributesToRender(),它只有一个输入参数,即HtmlTextWriter的实例。
当然在现在开发控件中,也没必要通过这种方式来为HTML元素添加事件,特别在采用AJAX模式的情况下,完全可以在客户端通过$addHandler来为HTML元素绑定事件。
1 /// <summary>
2 /// 将此控件呈现给指定的输出参数。
3 /// </summary>
4 /// <param name="output"> 要写出到的HTML 编写器</param>
5 protected override void AddAttributesToRender(HtmlTextWriter output)
6 {
7 output.AddAttribute("onmousedown","setday(this);");
8 output.AddAttribute("onkeypress", "EnsureNumeric(event)");
9
10 base.AddAttributesToRender(output);
11 }
下面的例子说明了ASP.NET服务端如何添加客户端事件:
1using System;
2using System.Data;
3using System.Configuration;
4using System.Collections;
5using System.Web;
6using System.Web.Security;
7using System.Web.UI;
8using System.Web.UI.WebControls;
9using System.Web.UI.WebControls.WebParts;
10using System.Web.UI.HtmlControls;
11
12namespace ServerToClientScript
13{
14 public partial class _Default : System.Web.UI.Page
15 {
16 protected void Page_Load(object sender, EventArgs e)
17 {
18 string script = "return confirm('真的要删除吗?');";
19 this.Button1.Attributes.Add("onclick",script);
20
21 if ((!Page.IsStartupScriptRegistered("PopUp")&&(!Page.IsPostBack)))
22 {
23 string scriptBlock = "<script language='JavaScript'>alert('发送客户端脚本!');</script>";
24 Page.RegisterStartupScript("PopUp",scriptBlock);
25 }
26 }
27 }
28}
三、通过客户端事件引发服务端事件:
其实服务端控件的服务端事件是通过客户端的JavaScript模拟出来的,如我在页面上添加了一个服务器控件DropDownList,并设置其AutoPostBack为True,然后设置它的 SelectedIndexChanged事件
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
}
运行页面后发现HTML代码为:可以看出服务端SelectedIndexChanged事件模拟成JavaScript中的onchange事件。
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
3<html xmlns="http://www.w3.org/1999/xhtml" >
4<head><title>
5 无标题页
6</title></head>
7<body>
8 <form name="form1" method="post" action="MNEvent.aspx" id="form1">
9<div>
10<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
11<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
12<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" />
13<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE3ODI0MjgzNjcPZBYCAgMPZBYCAgEPEGRkFgFmZGSYTeyI45LmYps34yPH/GyUwiYstw==" />
14</div>
15
16<script type="text/javascript">
17<!--
18var theForm = document.forms['form1'];
19if (!theForm) {
20 theForm = document.form1;
21}
22function __doPostBack(eventTarget, eventArgument) {
23 if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
24 theForm.__EVENTTARGET.value = eventTarget;
25 theForm.__EVENTARGUMENT.value = eventArgument;
26 theForm.submit();
27 }
28}
29// -->
30</script>
31
32
33 <div>
34 <select name="DropDownList1" onchange="javascript:setTimeout('__doPostBack(\'DropDownList1\',\'\')', 0)" id="DropDownList1">
35 <option selected="selected" value="男">男</option>
36 <option value="女">女</option>
37
38</select></div>
39
40<div>
41
42 <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBALgifCwDwKd5I/lCgKU4aSLBgLQuaSLBtn23paAhgqUhPSsi0GZsi57eadh" />
43</div></form>
44</body>
45</html>
46
47</html>
既然服务器端控件的事件是通过客户端的JavaScript模拟出来,那么我们就可以通过客户端事件来引发服务器事件。
在控件开发中,控件的服务端事件就是通过客户端的JavaScript模拟出来的(__doPostBack)
如例子ClientToServerEvent(附件中有代码)
通过DropDownList的onchange客户端事件来引发服务端控件Button的服务端事件Click事件,如:
1using System;
2using System.Data;
3using System.Configuration;
4using System.Collections;
5using System.Web;
6using System.Web.Security;
7using System.Web.UI;
8using System.Web.UI.WebControls;
9using System.Web.UI.WebControls.WebParts;
10using System.Web.UI.HtmlControls;
11
12namespace ServerToClientScript
13{
14 public partial class ClientToServerEvent : System.Web.UI.Page
15 {
16 protected void Page_Load(object sender, EventArgs e)
17 {
18 string strCMD = Page.GetPostBackClientHyperlink(Button1,"");
19 string script = @"Javacript:ConfirmUpdate(""EVAL_MESSAGE"");";
20 script = script.Replace("EVAL_MESSAGE", strCMD);
21 DropDownList1.Attributes.Add("onchange",script);
22 }
23
24 protected void Button1_Click(object sender, EventArgs e)
25 {
26 Response.Write("我从服务器来,已经保存!");
27 }
28 }
29}
30
在页面上写JavaScript脚本:
1 <script type="text/javascript">
2 function ConfirmUpdate(cmd)
3 {
4 if(confirm("真的要保存吗?"))
5 {
6 eval(cmd); //eval函数调用一个字符串中包含的命令
7 }
8 else
9 {
10 alert("我来自客户端,已经取消!");
11 }
12 }
13 </script>
这样当我的DropDownList选项改变时,触发onchange客户端事件,然后由该事件引发Button服务端事件。
四、ASP.NET事件模型机制
1、ASP.NET之所以对于以前的ASP是一个革命性的巨变,在很大程度上是由于ASP.NET技术是一种基于事件驱动的全新技术。
2、在ASP.NET中时间的触发和处理是在客户端和服务端进行的。
3、ASP.NET中,如果频繁和服务器进行事件信息传递,会大大降低服务器的处理效率和性能,因而有些事件如OnMouseOver没有提供;
4、但提供了Change事件,为了提高效率它们被缓存在客户端,等到再一次事件信息被发送到服务器端时一同发送回去。
如文本框的change事件,下拉框的change事件,
如两个控件的change事件中:
1 protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
2 {
3 Response.Write("DropDownList控件选择改变!<br>");
4 }
5
6 protected void TextBox1_TextChanged(object sender, EventArgs e)
7 {
8 Response.Write("TextBox文本改变!<br>");
9 }
如果控件本身的AutoPostBack设置为false(默认是false)时,文本框和下拉框发生
改变时,不会执行change事件的,而是将事件信息缓存在客户端,
当在页面上点击一个服务器端控件Button,
protected void Button1_Click(object sender, System.EventArgs e)
{
Response.Write("点击了Button按钮!<br>");
}
此时将客户端中的事件信息发送到服务器端,执行所有的事件,返回到客户端的信息为:
TextBox文本改变!
DropDownList控件选择改变!
点击了Button按钮!
具体例子代码见附件。
ServerToClientScript.rar
ASP.NET中的事件处理的更多相关文章
- ASP.NET中常用的优化性能的方法
1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池( ...
- ASP.NET中数据棒图,饼图,柱状图的实现
Web中绘制图形的方法大致有: 1. VML方式:功能强大,但是非常麻烦. 推荐:http://www.elook.net.cn/vml/ 2.使用控件:Dandus, Aspose.chart,Co ...
- asp.net中当服务器出错时显示指定的错误页面
http://blog.csdn.net/helloxiaoyu/article/details/2943537 此篇文章描述了当异常再ASP.NET中发生时怎样使用C#.NET代码去拦截和相应异常. ...
- Asp.net中Postback及Callback
我们知道,在默认的情况下,当我们点击Asp.net Page中的一个服务器Button时(默认其实是Submit Form),会导致Page被Recreated,这个过程我们称之为Postback,它 ...
- MVC架构在Asp.net中的应用和实现
转载自:http://www.cnblogs.com/baiye7223725/archive/2007/06/07/775390.aspx 摘要:本文主要论述了MVC架构的原理.优缺点以及MVC所能 ...
- [ASP.NET]ASP.NET中常用的26个优化性能方法
1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池( ...
- 转:asp.net 中的viewstate
概述 ViewState是一个被误解很深的动物了.我希望通过此文章来澄清人们对ViewState的一些错误认识.为了达到这个目的,我决定从头到尾详细的描述一下整个ViewState的工作机制,其中我会 ...
- Asp.net 中 OnClientClick 与 OnClick 的区别
OnClientClick 是客户端事件处理方法,一般采用JavaScript来进行处理,也就是直接在IE端运行,一点击就运行. OnClick 是服务器端事件处理方法,在服务器端也就是IIS中运行, ...
- ASP.NET中常用的26个优化性能方法
1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多 次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET 中提供了 连 ...
随机推荐
- jquery.unobtrusive-ajax.js单独的用法
(插件本身已经减少了人力,如果开始无脑开发,简直就是无能,@Ajax里面哪里帮助类生成的其实就是jquery.unobtrusive的一些特性) jquery.unobtrusive是MVC中出现的j ...
- LinqToSql和ASP.NET Entity FrameWork 中使用事务
ASP.NET Entity FrameWork中: int flag = -1; if (this.URPmanagementEntities1.Connection.State != System ...
- python学习应用笔记(一)
之前一直用c++写程序 所以考虑程序一般都比较容易往数据结构的方向想 而自己设计数据结构往往要费很大事 昨天看了一下python 发现脚本语言 真是厉害 用来进行模拟运算确实不错 可以先 ...
- word超链接显示HYPERLINK
在word中编辑超链接后显示的并不是正常的超链接 正常的超连接 非正常显示 解决办法: 文件---选项----高级,如下图 将“显示域代码而非值域”前面的勾去掉.
- 【Javascript】: for循环中定义的变量在for循环体外也有效
for循环中定义的变量在for循环体外也有效 <script> (function(){ var a = 111; for(var i=0;i<5;i++){ var carl = ...
- Windows Phone 8.1SDK新特性预览
前言 Windows Phone 8.1的预览版将在近期推送,WP 8.1的SDK也已经进入到RC阶段,可以从这里安装.本次更新的SDK被直接集成到了VS2013Update2里面,不再是单独的 ...
- JavaScript 中怎样判断文本框只能输出英文字母、汉字和数字,不能输入特殊字符!
JS-只能输入中文和英文2008-11-08 10:17在js中用正则表达式对象(RegExp)判断中文 ^[\u0391-\uFFE5]+$英文 ^[A-Za-z]+$中文和英文/^[\u0391- ...
- UI进阶 即时通讯之卸载Openfire
首先,确保你已经关掉了openfire打开终端 (在应用程序-->实用工具-->)输入以下命令sudo rm -rf /Library/PreferencePanes/Openfire.p ...
- ios学习笔记之block在ios开发中的应用
一.什么是Blocks Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从ios4.0开始就很好的支持Block. 二. ...
- Oracle把两个空格以上的空格,替换为两个空格
substr( ,instr(,)),)) ) 解释如下: 1. 去掉原字串左右的空格的字符(STR),2.查找STR中空格出现二次的位置(LOC),3.从STR中的第一位到LOC-1截取STR||L ...