简单的答案: JavaScript__doPostBack
函数是根据特定<asp />
控件及其处理的事件调用的。
详细答案:视情况而定。
首先,让我们介绍一下您的示例。您有一个<asp:Button />
作为标准呈现的<input type="submit" />
。ASP.NET WebForms中的所有内容都围绕标准HTML<form>
标记。通过单击按钮<form>
提交HTML时无需使用或使用 JavaScript 。<input type="submit" />
考虑到这一点,您可以很好地看到(您已经注意到)渲染的<input type="submit" />
按钮没有分配事件onclick
。而且,如您所见,单击按钮时会提交表单。
<input type="submit" />
关于单击按钮时如何执行后端(C#/VB.NET/等)代码:这一切都由 ASP.NET 框架本身处理,超出了本问题/答案的范围。
其次,现在让我们介绍一下__doPostBack
它是什么以及如何使用它。 __doPostBack
只是一个用于提交 HTML 的辅助 JavaScript 函数<form>
。由于上述原因,您现在知道为什么<input type="submit" />
按钮不需要调用该__doPostBack
函数了。
为简单起见,让我们看一下一个 ASP.NET 页面,它有一个<asp:DropDownList />
控件,并SelectedIndexChanged
分配了事件处理程序:
<asp:DropDownList ID="MyDropDownList" AutoPostBack="true" OnSelectedIndexChanged="MyDropDownList_SelectedIndexChanged" runat="server" />
<asp:DropDownList />
呈现如下:
<select id="ctl00_MyDropDownList" onchange="javascript:setTimeout('__doPostBack(\'ctl00$MyDropDownList\',\'\')', 0)" name="ctl00$MyDropDownList"></select>
让我们忽略事件setTimeout
中的函数onchange
——它只是 ASP.NET 使用的一种 hacky 解决方法——让我们专注于__doPostBack
它内部的函数。
正如您在此处看到的,事件处理程序正在调用该__doPostBack
函数。关键的区别在于改变or控件的值不会导致浏览器提交表单!onchange
<asp:DropDownList />
<select />
ASP.NET Framework 再次在内部处理提交表单时后端代码的执行方式(无论是否通过__doPostBack
函数)。
最后,关于__doPostBack
:的细节,它接受两个参数 -eventTarget
和eventArgument
. eventTarget
包含导致回发的控件的呈现 HTMLid
属性;并且eventArgument
是一个可选参数,可用于将附加数据传递给后端代码。
编辑附加信息: OP 提出了一个非常有趣的问题——当有多个提交按钮时会发生什么?
好吧,在POST
操作期间,浏览器会包含导致操作启动value
的那些。<input type="submit" />
这意味着,就像您获取<input />
元素的值一样,您还可以查询是哪个按钮导致了提交!