简单的答案: 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 />元素的值一样,您还可以查询是哪个按钮导致了提交!