简单的答案: The __doPostBack
JavaScript 函数根据具体情况调用<asp />
控制and它处理的事件。
详细答案:这取决于。
首先,让我们介绍一下您的示例。你有一个<asp:Button />
它被呈现为标准<input type="submit" />
。一切都在ASP.NET Web 窗体 http://www.asp.net/web-forms围绕标准HTML <form> http://en.wikipedia.org/wiki/Form_%28HTML%29标签。一个 HTML<form>
已提交without通过单击 JavaScript 来使用或协助<input type="submit" />
button.
考虑到这一点,您可以很好地看到(您已经注意到)渲染的<input type="submit" />
按钮确实not有一个onclick
已分配事件。而且,正如您所看到的,单击按钮时就会提交表单。
当涉及到后端(C#/VB.NET/等)代码如何执行时<input type="submit" />
单击按钮:这一切都由 ASP.NET Framework 本身处理,超出了本问题/答案的范围。
其次,现在我们来介绍一下__doPostBack
是什么,以及如何使用它。 __doPostBack
只是一个用于提交 HTML 的辅助 JavaScript 函数<form>
。由于上述原因,您现在知道为什么<input type="submit" />
按钮确实not需要致电__doPostBack
功能。
为了简单起见,让我们看一个 ASP.NET 页面,它有一个<asp:DropDownList />
控制,并且它具有SelectedIndexChanged
分配的事件处理程序:
<asp:DropDownList ID="MyDropDownList" AutoPostBack="true" OnSelectedIndexChanged="MyDropDownList_SelectedIndexChanged" runat="server" />
The <asp:DropDownList />
渲染如下:
<select id="ctl00_MyDropDownList" onchange="javascript:setTimeout('__doPostBack(\'ctl00$MyDropDownList\',\'\')', 0)" name="ctl00$MyDropDownList"></select>
let's ignore the setTimeout
function in the onchange
event - it's merely a hacky workaround used by ASP.NET - and let's focus on the __doPostBack
function inside of it.
正如你在这里看到的,__doPostBack
功能is被称为onchange
事件处理程序。关键的区别在于改变 a 的值<asp:DropDownList />
or <select />
控制不会导致浏览器提交表单!
ASP.NET Framework 再次在内部处理提交表单时后端代码的执行方式(无论是通过__doPostBack
功能与否)。
最后,关于细节__doPostBack
:它接受两个参数 -eventTarget
and eventArgument
. eventTarget
包含渲染的 HTMLid
引起回发的控件的属性;和eventArgument
是一个可选参数,可用于将附加数据传递到后端代码。
编辑附加信息:OP 提出了一个非常有趣的问题 - 当有多个提交按钮时会发生什么?
嗯,在一个POST
操作,浏览器包括value
of the <input type="submit" />
这导致操作启动。
这意味着,正如您获得您的价值观一样<input />
元素,您还可以查询哪个按钮导致了提交!