`
zy77612
  • 浏览: 284076 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ASP.NET中的事件处理

    博客分类:
  • .net
 
阅读更多

转:http://www.cnblogs.com/xieex/archive/2008/07/10/1240334.html

一、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中的事件处理 PDF

    讲座内容: 在ASP.NET中,事件处理是非常重要的一个话题,如何使控件能够检查客户端发回的窗体数据,如何使控件捕获回发事件?在本次讲座中,我们将给大家详细介绍这方面的知识。 &lt;br/&gt; 课程讲师: ...

    asp.net控制键盘keycode事件

    本文将详细讲解如何在ASP.NET中处理键盘事件,特别是使用`keycode`来识别用户按下的键。 一、键盘事件概述 键盘事件是浏览器中的JavaScript事件,它们允许我们对用户的键盘操作做出响应。常见的键盘事件有`keydown`...

    ASP.NET中的事件处理 Video

    讲座内容: 在ASP.NET中,事件处理是非常重要的一个话题,如何使控件能够检查客户端发回的窗体数据,如何使控件捕获回发事件?在本次讲座中,我们将给大家详细介绍这方面的知识。 &lt;br/&gt; 课程讲师: ...

    C# ASP.NET TreeView click 事件

    本文将深入探讨如何在C#环境中自定义处理ASP.NET TreeView控件的点击事件。 首先,让我们了解`TreeView`控件的基本结构。在ASP.NET中,`TreeView`控件通过`Nodes`集合来添加、删除和管理节点。每个`TreeNode`对象...

    asp.net中TextBox获得焦点和失去焦点——客户端JavaScript事件

    总结来说,ASP.NET中的TextBox可以通过JavaScript的`focus`和`blur`事件实现丰富的客户端交互。这些事件允许我们在用户开始输入时执行预处理,而在用户离开文本框时执行后处理,从而提升用户体验并实现动态验证等...

    ASP.NET一般处理程序图解详情

    下面将深入解析ASP.NET一般处理程序的工作原理及其在web开发中的应用。 首先,让我们理解ASP.NET Web开发的基本原理。在ASP.NET中,Web应用程序由一系列的HTTP模块、HTTP处理器和页面控件组成。当用户发起一个HTTP...

    ASP.net GridView双击事件,弹出一个窗口显示详细信息

    ASP.NET中没有直接的“双击”事件,但可以通过结合RowCommand事件和JavaScript来实现。首先,为GridView添加一个TemplateField,用于添加一个隐藏字段,存储行的数据键(Key),然后在客户端添加一个JavaScript事件...

    asp.net 事件和委托 简单例子

    ASP.NET中的事件和委托是.NET框架中非常重要的概念,它们在构建动态、响应用户交互的Web应用程序时起着核心作用。本文将通过一个简单的C#示例,深入探讨这两个概念及其在实际编程中的应用。 首先,让我们理解什么是...

    ASP.NET程序设计实验报告(期末课程设计)

    同时,实验还引导学生了解如何在ASP.NET环境中创建项目文件,这是构建ASP.NET应用程序的第一步。 实验3则深入到了ASP.NET的基本服务器控件的使用。这部分实验旨在教授学生如何利用ASP.NET提供的服务器控件来增强...

    ASP.NET Core 3.1中文教程.pdf

    * 中间件:ASP.NET Core 使用中间件(Middleware)技术,实现请求和响应的处理。 * 主机:ASP.NET Core 提供了多种主机(Host)选项,包括 Windows、Linux 和 macOS 等。 五、ASP.NET Core 的发展历程 * 1.0 版:...

    【ASP.NET编程知识】ASP .NET 可编辑输入自动匹配的下拉框.docx

    在 ASP.NET 中,可以使用 JS 和 JQuery 库来动态添加下拉框的选项,并将其传递给后台处理程序。 八、ASP.NET 实现下拉框只读功能 在 ASP.NET 中,可以使用 Enabled 属性来实现下拉框的只读功能。当 Enabled 属性...

    asp.net图片处理.rar

    ASP.NET 图片处理技术是Web开发中的一个重要环节,它涵盖了从上传、裁剪、缩放、旋转到水印添加等一系列图像操作。在ASP.NET框架下,开发者可以利用各种工具和库来实现这些功能,为网站提供丰富的图像服务。本文将...

    ASP.NET 课后习题集答案

    本资源摘要信息涵盖了 ASP.NET 的基础知识、ASP.NET 的开发环境搭建、ASP.NET 的编程语言特性、ASP.NET 的控件使用、ASP.NET 的事件处理等方面的知识点。 一、ASP.NET 概述 ASP.NET 是 Microsoft.NET Framework 的...

    ASP.NET中型在线系统开发实践

    在这个“ASP.NET中型在线系统开发实践”主题中,我们将深入探讨如何利用ASP.NET来开发复杂的、可扩展的在线系统。 一、ASP.NET概述 ASP.NET不仅仅是一个编程语言,而是一个完整的开发平台,它包括了多种用于构建...

    asp.net前台显示后台处理进度条

    在ASP.NET开发中,有时我们需要实现一个功能,即在后台执行耗时操作时,让前端用户能够看到处理的进度,从而提高用户体验。这种技术通常被称为后台处理进度条。本篇文章将详细讲解如何在ASP.NET中实现在前台显示后台...

    ASP.NET鼠标响应事件

    在ASP.NET中,鼠标响应事件是网页交互的重要组成部分,它们使得用户通过鼠标操作可以触发特定的服务器端或客户端代码执行。在这个"ASP.NET鼠标响应事件"主题中,我们将深入探讨如何利用这些事件来增强用户体验,特别...

    ASP.NET文件参考 asp.net asp.net技巧

    首先,ASP.NET的核心概念包括Page生命周期、控件事件处理和数据绑定。在Page生命周期中,页面经历初始化、加载、验证、呈现和卸载等阶段,开发者可以在这些阶段中插入代码以控制页面行为。控件事件处理允许用户与...

    【ASP.NET编程知识】ASP.NET的事件模型(很适合学习的文章).docx

    事件模型是指在 ASP.NET 应用程序中,页面的事件处理机制,即页面的生命周期中各个阶段的事件处理。 在 ASP.NET 中,页面的生命周期可以分为以下几个阶段:Init、Load、Render 等。每个阶段都有其对应的事件,例如 ...

    基于ASP.NET的图书销售系统

    2. **控件和事件处理**:Web Forms模型中的控件是ASP.NET的核心组件,例如按钮、文本框等。这些控件可以绑定到后端代码,通过事件触发处理,如用户点击“购买”按钮,会触发对应的事件处理函数,执行图书购买逻辑。 ...

    ASP.NET写的轮播图代码页面

    7. **事件处理**:在ASP.NET中,开发者需要编写事件处理程序来响应用户的交互,如点击按钮切换图片,或者自动定时切换。 8. **用户体验优化**:良好的轮播图设计应考虑到各种设备和浏览器的兼容性,包括响应式设计...

Global site tag (gtag.js) - Google Analytics