我使用了<asp:Button />
控件,在浏览器中渲染后控件没有分配click
事件属性。究竟是如何调用服务器端事件的呢?
ASPX代码:
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="TestClickEvent" />
上述控件在浏览器中呈现为以下代码:
<input type="submit" name="Button1" value="Button" id="Button1">
以下代码在浏览器中呈现,设置__EVENTTARGET
。 我怀疑__doPostBack
方法是如何被调用的?调用方法在哪里?
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
答案 0 :(得分:12)
答案简单:__doPostBack
JavaScript函数是根据特定的<asp />
控件和调用它所处理的事件来调用的。
详细答案:取决于。
首先,让我们介绍一下您的示例。您有一个<asp:Button />
,其呈现为标准<input type="submit" />
。 ASP.NET WebForms中的所有内容都围绕标准HTML <form>
标记展开。通过点击 <form>
按钮,提交,无需 JavaScript的使用或帮助。
考虑到这一点,您可以很好地看到(您已经注意到)呈现的<input type="submit" />
按钮不分配了<input type="submit" />
个事件。而且,正如您所看到的,单击按钮时会提交表单。
当谈到单击onclick
按钮时后端(C#/ VB.NET /等)代码的执行方式:它全部由ASP.NET框架本身处理,并且超出了这个问题/答案的范围。
其次,现在让我们来介绍一下<input type="submit" />
及其使用方式。 __doPostBack
只是一个帮助JavaScript函数,用于提交HTML __doPostBack
。由于上述原因,您现在知道为什么<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
函数 - 它只是ASP.NET使用的一个hacky变通方法 - 让我们专注于里面的onchange
函数它。
正如您在此处所见,__doPostBack
事件处理程序正在调用__doPostBack
函数 。关键区别在于更改onchange
或<asp:DropDownList />
控件的值不会导致浏览器提交表单!
ASP.NET Framework再一次在内部处理提交表单时后端代码的执行方式(无论是否通过<select />
函数)。
最后,关于__doPostBack
的详细信息,它接受两个参数 - __doPostBack
和eventTarget
。 eventArgument
包含导致回发的控件的呈现HTML eventTarget
属性; id
是一个可选参数,可用于将其他数据传递给后端代码。
编辑其他信息:OP提出了一个非常有趣的问题 - 当有多个提交按钮时会发生什么?
好吧,在eventArgument
操作期间,浏览器包含导致操作启动的POST
value
。
这意味着,就像您获取<input type="submit" />
元素的值一样,您也可以查询导致提交的按钮!
答案 1 :(得分:4)
您的控件是一个提交按钮,它可以直接将表单提交到服务器而无需调用__dopostback方法。所以在这种情况下__dopostback没有被调用。 __dopostback用于没有默认提交行为的控件,例如dropdownlist。
通过控件实现的ipostbackeventhandler接口连接到服务器端事件。有关详细信息,请查看此http://msdn.microsoft.com/en-us/library/system.web.ui.ipostbackeventhandler.raisepostbackevent.aspx
答案 2 :(得分:3)
嗯,您怀疑的原因是因为您认为函数__doPostBack需要发布。但另一方面,当html首次设计时,只有通过提交按钮发回服务器的方式。这个功能是在他们自己的浏览器中构建的,这样当按下提交按钮时,浏览器将表单的数据传递给声明的位置。但随着网络的发展,人们开始要求更多。现在其他控件也需要回发到服务器。为了实现它们,开发了各种hack,最着名的__doPostBack函数就是其中之一。现在提交的任何其他控件都可以使用__doPostBack函数进行回发。但是提交按钮就是这样做的。多数民众赞成。