写在前面:因为刚用博客园,还不太熟悉,本文先发到文章里面了,发现不能列出来,就在随笔里再发一遍了。

为了说明问题,首先我将举出一个最简单的例子,然后立即指出问题所在,由此展开讨论。
这个例子就是一个最最基本的ASP.NET WEB应用程序,有一个页面Webpage1.aspx,接下来,我在上面放置一个文本框,一个按钮,ID分别是textbox1和button1,为button1添加click事件,并在其中添加Response.write("button1_click")来验证按钮是否被点击。

程序运行起来以后,随便在文本框中输入一些东西,然后回车,我们可以看到页面被提交,也可以证明发生了一个POSTBACK,然而并没有显示“button1_click”。

随后,我们在页面中再添加一个文本框textbox2,然后启动程序,随便在任意一个文本框中输入一些什么,然后不切换焦点,直接回车,我们可以看到页面上显示“button1_click”,证明触发了button1的click事件。

这个问题源于我用.net做一个系统的简单检索页面,之前做的登录页面不知怎的,输完用户名密码(注意,有两个文本框),回车直接就触发了登录按钮,可在这个仅有一个textbox的简单检索页面却实现不了。这种对比引起了我的注意,最后费了好大的周折,终于发现如果再添加一个textbox,问题就解决了。但是问题的根源,却始终是雾里看花。

我们做开发的,非常不愿意碰到这类黑箱,不愿意系统自动为我们做了一些事情却不让我们知道。因此我对这个问题一直耿耿于怀,现在提出来,请大家来探讨,希望大家不要见笑,我觉得问题尽管小,可以也应该知其所以然,对吧。

接下来,可能有的朋友会想到,再添加一个按钮如何,它是怎么知道要触发哪一个按钮的click事件呢。经过试验,发现它会优先选择aspx文件中,位置靠前的asp:button来触发,即便它没有订阅click事件,也不会顺序向后找button。

整个过程研究下来,有两个关键词,一个是回发,一个是事件。asp.net中,事件是一个比较奇怪的东西,有的事件是通过系统自动生成的function __doPostBack(eventTarget, eventArgument) 客户端脚本函数来实现的,而有的则不是,目前我没有系统的研究过,到底什么样的情况采用__doPostBack,什么情况下不采用,但仅就上文所提到的情况来看,就已经比较混乱了,但我知道这里面一定是有规则的,只是没有公布出来,或者只是我们还不知道,而且大家也较少关注吧。毕竟不必深究这些事情,也可以做出应用软件来。

本人觉得,浏览器将表单发回服务器后,服务器端一定与之进行了一些格式约定,用以与事先设计好的事件挂钩相联系,但出于时间关系,不能进行深入的研究,如果哪位对这些问题有心得,不妨讲来,大家学习学习。
posted on 2005-12-28 09:48  吉林哥  阅读(651)  评论(6编辑  收藏  举报