初学ASP.NET的时候,曾被各种控件的强大功能所折服。当然,也很容易被搞晕,仅仅记住那些控件的名字都不是一件简单的事儿,何况还有那么多的属性、事件、功能、配置步骤......哈哈。后来越发觉得这些东西确实没啥价值,在企业级开发中很少用到。
写本文的目的并不是要“贬低”或者刻意“排斥”webform中的服务端控件,这里对其优劣也不做过多的讨论。
不过有情提示初学者:其实很多控件的用法都差不多,掌握一种后,再去使用其他的会相对比较容易。例如会用GridView之后,再去用ListView绝对不是难事。切勿“浮于控件表面”,因为你一旦形成了某种思维方式,以后会很难提高。当然,当你慢慢理解了web的本质和这些控件的内部机制,回头再去看那些东西,会觉得实在太简单了。这又是一个“先磨刀还是先砍柴”的问题了。
我们经常拖动一个服务器控件到aspx页面上(例如一个Button按钮),然后双击,就会看到后台代码中注册了一个click事件。或者你也可以在控件上“右键”--》“属性”,然后找到“闪电图标”--事件,然后注册相应的事件。这就是传说中的webform的“事件驱动机制”。如果你曾经接触过VB或者windows开发,或许会倍感温馨。
那这些事件,到底是如何触发的呢?我能否模拟出来呢?为啥我有时候点击了Button按钮却没有触发后台事件?
Asp.net 中在客户端触发服务端事件分为两种情况:一. WebControls中的Button 和HtmlControls中的Type为submit的HtmlInputButton
这两种按钮最终到客户端的表现形式为:
< input name="Submit1" id="Submit1" type="submit" value=”Submit”>
这是Form表单的提交按钮,点击以后会作为参数发送到服务端,参数是这样的: 控件的name属性=控件的value值,对应上面的例子就是:Submit1= Submit。 服务端会根据接收到的控件的name属性的这个key来得知是这个按钮被点击了,从而在服务端触发这个按钮的点击事件。
二. HtmlControls 中的 Type为button的HtmlInputButton 和其它所有的控件事件,比如LinkButton点击,TextBox的Change事件等等:
这些事件在客户端产生后会经过一个统一的机制发送到服务端。
1. 首先asp.net页框架会使用两个Hidden域来存放表示是哪个控件触发的事件,以及事件的参数:
< !—表示触发事件的控件,一般是这个控件的name -->
< input type="hidden" name="__EVENTTARGET" value="" />
< !—表示触发事件的参数,一般是当某个控件有两个以上的事件时,用来区别是哪个事件 -->
< input type="hidden" name="__EVENTARGUMENT" value="" />
2. 服务端会生成一个javascript的方法来处理所有这些事件的发送,这段代码是:
< script type="javascript">
< !--
function __doPostBack(eventTarget, eventArgument) {
var theform = document.WebForm2;
theform.__EVENTTARGET.value = eventTarget;
theform.__EVENTARGUMENT.value = eventArgument;
theform.submit();
}
// -->
< /script>
3. 每个会引发服务端事件的控件都会在响应的客户端事件中调用上面的代码
(浏览器只认html、js、css、图片等静态内容,不管你什么aspx、php、jsp页面最终都会变成html,呈现给用户)
比如,HtmlControls 中的 Type为button的HtmlInputButton的点击事件
< !—客户端的点击事件调用__doPostBack,eventTarget 参数为'Button2',表示是name为'Button2’控件触发的事件,eventArgument 为空,表示这个Type为button的HtmlInputButton只有一个客户端触发的服务端事件-->
< input language="javascript" onclick="__doPostBack('Button2','')" name="Button2" id="Button2" type="button" value="Button" />
又比如,TextBox控件的Change事件
< !—客户端的onchange事件调用__doPostBack,eventTarget 参数为’TextBox1’,表示是name为’TextBox1’控件触发的事件,而TextBox控件只有一个客户端触发的服务端事件TextChanged,故服务器就会去触发这个TextBox的TextChanged事件->
< input name="TextBox1" type="text" id="TextBox1" onchange="__doPostBack('TextBox1','')" language="javascript" />
4. 客户端触发事件后调用__doPostBack方法,将表示触发的控件源的eventTarget 和事件参数eventArgument分别付给两个隐藏域__EVENTTARGET和__EVENTARGUMENT,然后提交Form,在服务端根据__EVENTTARGET和__EVENTARGUMENT来判断是哪个控件的什么事件触发了。
5.既然了解了__doPostBack这个“著名”的函数,那么我们当然也可以想办法“盗链”了。论坛上经常有很多人问,如何用普通的html控件(标签)和js调用后台的方法/激发后台事件。呵呵。使用“盗链”不久可以了吗?当然,还有很多实现方式,这里我就不再赘述了。
说了这么多,相信读者已经理解了asp.net中所谓的“事件机制”了。还是那句话,
web开发,无非是“请求/处理/响应”。
分享到:
相关推荐
ASP.NET\ASP.NET服务端控件,HTML控件,HTML服务端控件 的区别
使用ASP.NET 服务端控件实现用户界面
asp分页控件服务端触发事件,方便的实现分页的功能
这是一个web服务端控件,加入到ToolBox后,可拖放到页面使用。将附带的图片放到站点文件夹内,设置控件的ImageUrl属性指向图片所在文件夹即可。
简单分页服务端自定义控件,将简单分页相关javascript 封装成了服务端控件。 本次版本号为0.0.0.4
8.1 asp.net服务端控件对客户端的支持 297 8.2 clientscriptmanager类功能详解 301 8.2.1 registerarraydeclaration方法 301 8.2.2 registerclientscriptblock方法 302 8.2.3 registerclientscriptinclude方法 ...
注意:如果不能下载是由于服务器忙,请多试几次!
本控件供visual stdio .net开发者使用,为asp.net2.0网站提供验证服务。可自动生成带有多种特效的验证图片,并提供无刷新验证。 特色: • 自由的中文诗词、中文字、英文字母、数字等验证码生成字源控制...
可拖放到页面,通过在属性窗口中的配置可以建立二级下拉菜单结构。本资源附所有源代码,编译可运行。 大毛制作。
全书用通俗易懂、平易近人的语言,讲述ASP.NET技术中最关键的部分――ASP.NET控件与组件的开发细节,从对ASP.NET编程模型的引入到ASP.NET控件最基本的知识,包括呈现内容,属性与持久化,服务端事件与ASP.NET回传,...
也许,对你来说这ASP.NET页面中应用Javascript使用这些Google的API不是件容易的事情。这个文章的控件,让你可以使用服务端控件来使用这些Google MAP。 在我的应用场景中,我从SQL SERVER数据库中提取出地球的经度、...
8.1 asp.net服务端控件对客户端的支持 297 8.2 clientscriptmanager类功能详解 301 8.2.1 registerarraydeclaration方法 301 8.2.2 registerclientscriptblock方法 302 8.2.3 registerclientscriptinclude方法 ...
8.1 asp.net服务端控件对客户端的支持 297 8.2 clientscriptmanager类功能详解 301 8.2.1 registerarraydeclaration方法 301 8.2.2 registerclientscriptblock方法 302 8.2.3 registerclientscriptinclude方法 ...
8.1 asp.net服务端控件对客户端的支持297 8.2 clientscriptmanager类功能详解301 8.2.1 registerarraydeclaration方法301 8.2.2 registerclientscriptblock方法302 8.2.3 registerclientscriptinclude方法303 ...
Ajax 实现在WebForm中拖动控件并即时在服务端保存状态数据 (Asp.net 2.0)\Ajax 实现在WebForm中拖动控件并即时在服务端保存状态数据 (Asp.net 2.0).rar
asp.net WebForm程序删除.designer.cs文件,重新设计并绑定服务端控件时间 **示例源码
ajax技术,无刷新技术 导读:ScriptManager控件包括在ASP.NET 2.0 AJAX Extensions中,它用来处理页面上的所有组件以及页面局部更新,生成相关的客户端代理脚本以便能够在JavaScript中访问Web Service,所有需要支持...
在ASP.NET页面中推荐使用覆写(Override)而不是事件处理(Event Handler) 常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试 在C#里把ArrayList转换为Array 或 把Array转换为ArrayList C# 2.0 在.NET 2.0中...
采用VS2005+C#+ASP.NET开发,提供中英文混合验证的方法,实现对含有中文以及英文进行混合验证的操作。
本书从实用的角度出发,详细介绍了利用ASP.NET开发Web应用程序、构建网络平台、访问后台数据库和配置服务端控件等内容,并通过实际应用中的经典案例来引导读者快速全面地掌握信息管理系统开发的思路、方法与技能。...