ASP.NET如何知道点击了哪个按钮以触发它的事件?

5
当使用LinkButton时,页面将呈现doPostBack()函数。当单击按钮时,doPostBack()将在客户端调用,将表单提交到服务器,并发送信息到名为EVENTTARGETEVENTARGUMENT的两个隐藏字段中。 EVENTTARGET保存导致回发的控件名称,而EVENTARGUMENT保存任何信息。

这样,ASP.NET引擎从EVENTTARGET参数获取导致回发的控件名称,并调用RaisePostBackEvent()事件来调用正确的服务器端事件处理程序。我了解如何工作doPostBack()及如何调用服务器端事件处理程序。

然而,对于普通的服务器按钮,如何调用正确的按钮单击事件?ASP.NET如何被告知客户端单击的控件名称?

2个回答

5
一个普通的ASP.NET Button 被渲染为一个HTML元素 <input type="submit">,并带有唯一的name属性。默认情况下,该HTML元素将触发与当前ASPX页面关联的HTML表单的HTTP POST
当HTTP POST发生时,从表单内的成功控件构建一个控件名称/当前值对序列,称为表单数据集,例如文本框内的文本值是这样传输的。也会发送一个由触发提交的按钮的名称组成的对到服务器,这就是ASP.NET知道哪个按钮触发了HTTP POST的方式。
HTML规范保证只有表单内的成功控件会被考虑为已发布的表单数据集,因为成功控件的定义包含以下规则:
如果一个表单包含多个提交按钮,只有被激活的提交按钮才会生效。 然后ASP.NET可以检查已发布的表单数据集,以检查是否触发了任何普通按钮。

1

一般来说,您不必担心按钮点击的内部细节。这就是 .Net 的美妙之处。

但是,如果您想具体了解客户端调用了什么,您可以简单地查看页面源代码并查看按钮所调用的内容。

例如:

<input name="ctl00$MainContent$btnMyButton" id="ctl00_MainContent_btnMyButton" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$MainContent$btnMyButton", "", true, "", "", false, false))" type="submit" value="My Button"/>

请注意,.Net注入了以下JavaScript例程:

WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$MainContent$btnMyButton", "", true, "", "", false, false))

嗨Jeremy,你认为我的问题怎么样?我不知道。请看一下,我用渲染HTML更新了我的问题。我正在使用VS2010测试。我的渲染HTML没有叫做WebForm_DoPostBackWithOptions()的方法签名。我知道当我们使用服务器端超链接标记等时,doPostBack()会在页面中呈现。如果我的页面中没有任何WebForm_DoPostBackWithOptions()或doPostBack(),那么当我单击提交按钮时,服务器端事件处理程序如何调用?我只需要知道ASP.NET如何跟踪哪个提交按钮导致postback,并相应地调用正确的事件处理程序。 - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接