一、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.  
  2.  1        protected override void OnPreRender(EventArgs e)
  3.  2                {
  4.  3            if (!Page.ClientScript.IsClientScriptBlockRegistered("Common"))
  5.  4            {
  6.  5                Page.ClientScript.RegisterClientScriptBlock(typeof(Page), "Common", ClientJavaScriptCodeScipt("Common.js"));
  7.  6            }
  8.  7            if (!Page.ClientScript.IsClientScriptBlockRegistered(ScriptKey))
  9.  8            {
  10.  9                Page.ClientScript.RegisterClientScriptBlock(typeof(Page), ScriptKey, ClientJavaScriptCodeScipt("DateTime.js"));
  11. 10            }
  12. 11                }

2、客户端HTML属性:客户端HTML属性提供将客户端事件与客户端脚本联系在一起的方法。
   这种方法只适用于从System.Web.UI.WebControls.WebControl类导出的服务器控件,因为从这个类导出的控件会发送某些HTML元素。
   WebControl类包含一个将HTML元素属性添加到由Web控件发出的HTML元素的方法,该方法称为AddAttributesToRender(),它只有一个输入参数,即HtmlTextWriter的实例。
当然在现在开发控件中,也没必要通过这种方式来为HTML元素添加事件,特别在采用AJAX模式的情况下,完全可以在客户端通过$addHandler来为HTML元素绑定事件。

  1.  
  2.  1                /// <summary>
  3.  2                /// 将此控件呈现给指定的输出参数。
  4.  3                /// </summary>
  5.  4                /// <param name="output"> 要写出到的HTML 编写器</param>
  6.  5                protected override void AddAttributesToRender(HtmlTextWriter output) 
  7.  6                {
  8.  7                    output.AddAttribute("onmousedown","setday(this);");
  9.  8                    output.AddAttribute("onkeypress", "EnsureNumeric(event)");
  10.  9
  11. 10                    base.AddAttributesToRender(output);
  12. 11                }

下面的例子说明了ASP.NET服务端如何添加客户端事件

  1.  
  2.  1using System;
  3.  2using System.Data;
  4.  3using System.Configuration;
  5.  4using System.Collections;
  6.  5using System.Web;
  7.  6using System.Web.Security;
  8.  7using System.Web.UI;
  9.  8using System.Web.UI.WebControls;
  10.  9using System.Web.UI.WebControls.WebParts;
  11. 10using System.Web.UI.HtmlControls;
  12. 11
  13. 12namespace ServerToClientScript
  14. 13{
  15. 14    public partial class _Default : System.Web.UI.Page
  16. 15    {
  17. 16        protected void Page_Load(object sender, EventArgs e)
  18. 17        {
  19. 18            string script = "return confirm('真的要删除吗?');";
  20. 19            this.Button1.Attributes.Add("onclick",script);
  21. 20
  22. 21            if ((!Page.IsStartupScriptRegistered("PopUp")&&(!Page.IsPostBack)))
  23. 22            {
  24. 23                string scriptBlock = "<script language='JavaScript'>alert('发送客户端脚本!');</script>";
  25. 24                Page.RegisterStartupScript("PopUp",scriptBlock);
  26. 25            }
  27. 26        }
  28. 27    }
  29. 28}


三、通过客户端事件引发服务端事件:

其实服务端控件的服务端事件是通过客户端的JavaScript模拟出来的,如我在页面上添加了一个服务器控件DropDownList,并设置其AutoPostBack为True,然后设置它的 SelectedIndexChanged事件
       protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {

}

运行页面后发现HTML代码为:可以看出服务端SelectedIndexChanged事件模拟成JavaScript中的onchange事件。

  1.  
  2.  1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3.  2
  4.  3<html xmlns="http://www.w3.org/1999/xhtml" >
  5.  4<head><title>
  6.  5        无标题页
  7.  6</title></head>
  8.  7<body>
  9.  8    <form name="form1" method="post" action="MNEvent.aspx" id="form1">
  10.  9<div>
  11. 10<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
  12. 11<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
  13. 12<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" />
  14. 13<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE3ODI0MjgzNjcPZBYCAgMPZBYCAgEPEGRkFgFmZGSYTeyI45LmYps34yPH/GyUwiYstw==" />
  15. 14</div>
  16. 15
  17. 16<script type="text/javascript">
  18. 17<!--
  19. 18var theForm = document.forms['form1'];
  20. 19if (!theForm) {
  21. 20    theForm = document.form1;
  22. 21}
  23. 22function __doPostBack(eventTarget, eventArgument) {
  24. 23    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
  25. 24        theForm.__EVENTTARGET.value = eventTarget;
  26. 25        theForm.__EVENTARGUMENT.value = eventArgument;
  27. 26        theForm.submit();
  28. 27    }
  29. 28}
  30. 29// -->
  31. 30</script>
  32. 31
  33. 32
  34. 33    <div>
  35. 34        <select name="DropDownList1" onchange="javascript:setTimeout('__doPostBack(\'DropDownList1\',\'\')', 0)" id="DropDownList1">
  36. 35        <option selected="selected" value="男">男</option>
  37. 36        <option value="女">女</option>
  38. 37
  39. 38</select></div>
  40. 39    
  41. 40<div>
  42. 41
  43. 42        <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBALgifCwDwKd5I/lCgKU4aSLBgLQuaSLBtn23paAhgqUhPSsi0GZsi57eadh" />
  44. 43</div></form>
  45. 44</body>
  46. 45</html>
  47. 46
  48. 47</html>

既然服务器端控件的事件是通过客户端的JavaScript模拟出来,那么我们就可以通过客户端事件来引发服务器事件。
在控件开发中,控件的服务端事件就是通过客户端的JavaScript模拟出来的(__doPostBack)

如例子ClientToServerEvent(附件中有代码)
通过DropDownList的onchange客户端事件来引发服务端控件Button的服务端事件Click事件,如:

  1.  
  2.  1using System;
  3.  2using System.Data;
  4.  3using System.Configuration;
  5.  4using System.Collections;
  6.  5using System.Web;
  7.  6using System.Web.Security;
  8.  7using System.Web.UI;
  9.  8using System.Web.UI.WebControls;
  10.  9using System.Web.UI.WebControls.WebParts;
  11. 10using System.Web.UI.HtmlControls;
  12. 11
  13. 12namespace ServerToClientScript
  14. 13{
  15. 14    public partial class ClientToServerEvent : System.Web.UI.Page
  16. 15    {
  17. 16        protected void Page_Load(object sender, EventArgs e)
  18. 17        {
  19. 18            string strCMD = Page.GetPostBackClientHyperlink(Button1,"");
  20. 19            string script = @"Javacript:ConfirmUpdate(""EVAL_MESSAGE"");";
  21. 20            script = script.Replace("EVAL_MESSAGE", strCMD);
  22. 21            DropDownList1.Attributes.Add("onchange",script);
  23. 22        }
  24. 23
  25. 24        protected void Button1_Click(object sender, EventArgs e)
  26. 25        {
  27. 26            Response.Write("我从服务器来,已经保存!");
  28. 27        }
  29. 28    }
  30. 29}
  31. 30

在页面上写JavaScript脚本:

  1.  
  2.  1    <script type="text/javascript">
  3.  2        function ConfirmUpdate(cmd)
  4.  3        {
  5.  4            if(confirm("真的要保存吗?"))
  6.  5            {
  7.  6                eval(cmd);  //eval函数调用一个字符串中包含的命令
  8.  7            }
  9.  8            else
  10.  9            {
  11. 10                alert("我来自客户端,已经取消!");
  12. 11            }
  13. 12        }
  14. 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.  
  2. 1        protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
  3. 2        {
  4. 3            Response.Write("DropDownList控件选择改变!<br>");
  5. 4        }
  6. 5
  7. 6        protected void TextBox1_TextChanged(object sender, EventArgs e)
  8. 7        {
  9. 8            Response.Write("TextBox文本改变!<br>");
  10. 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中的事件处理的更多相关文章

  1. ASP.NET中常用的优化性能的方法

    1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池( ...

  2. ASP.NET中数据棒图,饼图,柱状图的实现

    Web中绘制图形的方法大致有: 1. VML方式:功能强大,但是非常麻烦. 推荐:http://www.elook.net.cn/vml/ 2.使用控件:Dandus, Aspose.chart,Co ...

  3. asp.net中当服务器出错时显示指定的错误页面

    http://blog.csdn.net/helloxiaoyu/article/details/2943537 此篇文章描述了当异常再ASP.NET中发生时怎样使用C#.NET代码去拦截和相应异常. ...

  4. Asp.net中Postback及Callback

    我们知道,在默认的情况下,当我们点击Asp.net Page中的一个服务器Button时(默认其实是Submit Form),会导致Page被Recreated,这个过程我们称之为Postback,它 ...

  5. MVC架构在Asp.net中的应用和实现

    转载自:http://www.cnblogs.com/baiye7223725/archive/2007/06/07/775390.aspx 摘要:本文主要论述了MVC架构的原理.优缺点以及MVC所能 ...

  6. [ASP.NET]ASP.NET中常用的26个优化性能方法

    1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池( ...

  7. 转:asp.net 中的viewstate

    概述 ViewState是一个被误解很深的动物了.我希望通过此文章来澄清人们对ViewState的一些错误认识.为了达到这个目的,我决定从头到尾详细的描述一下整个ViewState的工作机制,其中我会 ...

  8. Asp.net 中 OnClientClick 与 OnClick 的区别

    OnClientClick 是客户端事件处理方法,一般采用JavaScript来进行处理,也就是直接在IE端运行,一点击就运行. OnClick 是服务器端事件处理方法,在服务器端也就是IIS中运行, ...

  9. ASP.NET中常用的26个优化性能方法

    1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多 次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET 中提供了 连 ...

随机推荐

  1. FileUpload控件「批次上传 / 多档案同时上传」的范例--以「流水号」产生「变量名称」

    原文出處  http://www.dotblogs.com.tw/mis2000lab/archive/2013/08/19/multiple_fileupload_asp_net_20130819. ...

  2. C# 平时碰见的问题【4】

    1. 模糊查询 like的参数化写法 string keyword="value"; // 要模糊匹配的值 错误示范:   sql:    string strSql=" ...

  3. MVC控制器C完美分离(有脚手架辅助)

    MVC控制器C完美分离(有脚手架辅助) 1. 第一步:建立一个web项目和Controllers的类库,引用必要的dll,然后生成,之后去找到他的目录,找到.csproj后缀的文件,然后在找到web项 ...

  4. [terry笔记]ArchiveLog归档日志激增解决思路

    归档日志激增的危害是巨大的,最严重的结果就是数据库无法正常工作,导致整个系统无法正常工作,其次就算数据库可以正常工作,但激增的归档会对磁盘产生大量消耗,导致性能下降.       归档日志激增一般是因 ...

  5. Python os模块常用部分功能

    os.sep 可以取代操作系统特定的路径分割符. os.name字符串指示你正在使用的平台.比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'. os.getcw ...

  6. 实战MySQL集群,试用CentOS 6下的MariaDB-Galera集成版

    说起mysql的集群估计很多人会首先想起mysql自带的replication或者mysql-mmm.mysql-mmm其实也是基于mysql自带的replication的,不过封装的更好用一些,但是 ...

  7. ED/EP系列1《简介》

    电子存折(ED:ElectronicDeposit)一种为持卡人进行消费.取现等交易而设计的支持个人识别码(PIN)保护的金融IC卡应用.它支持圈存.圈提.消费和取现等交易. 电子钱包(EP:Elec ...

  8. ios中如何计算(页数,行数,等等的算法)

    页数 = (总个数 + 每页最大显示个数 - 1) / 每页显示最大的个数

  9. java数据结构和算法------插入排序

    package iYou.neugle.sort; public class Insert_sort { public static void InsertSort(double[] array) { ...

  10. FPGA入门1

    FPGA入门知识介绍    近几年来,由于现场可编程门阵列(FPGA)的使用非常灵活,又可以无限次的编程,已受到越来越多的电子编程者的喜爱,很多朋友都想学习一些FPGA入门知识准备进行这个行业,现在关 ...