如何调用__doPostBack方法? 调用方法在哪里?

我使用了控件,在浏览器中渲染后控件没有分配click事件属性。 究竟是如何调用服务器端事件的呢?

ASPX代码:

  

上面的控件在浏览器中呈现如下代码:

  

在浏览器中呈现以下代码,该代码设置__EVENTTARGET我怀疑是如何调用__doPostBack方法的? 调用方法在哪里?

  function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); } } 

简单的答案: __doPostBack JavaScript函数基于特定的控件及其处理的事件进行调用。

详细答案:这取决于。


首先,让我们来举例说明。 你有一个 ,它是一个标准的 。 ASP.NET WebForms中的所有内容都围绕标准的HTML

标记。 通过单击按钮,在使用或协助JavaScript的情况下提交HTML

考虑到这一点,您可以很好地看到(您已经注意到)渲染的按钮没有分配onclick事件。 而且,正如您所看到的,单击按钮时会提交表单。

当谈到如何在单击按钮时执行后端(C#/ VB.NET / etc。)代码时:它全部由ASP.NET Framework本身处理,并且超出了这个问题/答案的范围。


其次,现在让我们来介绍__doPostBack是什么,以及如何使用它。 __doPostBack只是一个帮助JavaScript函数,用于提交HTML

。 由于上面列出的原因,您现在知道为什么按钮不需要调用__doPostBack函数。

为简单起见,让我们看一下具有控件的ASP.NET页面,并SelectedIndexChangedSelectedIndexChanged事件处理程序:

  

呈现如下:

  

让我们忽略onchange事件中的setTimeout函数 – 它只是ASP.NET使用的hacky变通方法 – 让我们专注于它内部的__doPostBack函数。

正如您在此处所看到的, __doPostBack函数正由onchange事件处理程序调用。 关键的区别是更改控件的值不会导致浏览器提交表单!

ASP.NET Framework再次在内部处理提交表单时后端代码的执行方式(无论是否通过__doPostBack函数)。


最后,至于__doPostBack的细节:它接受两个参数 – eventTargeteventArgumenteventTarget包含导致回发的控件的呈现HTML id属性; 和eventArgument是一个可选参数,可用于将其他数据传递给后端代码。


编辑附加信息: OP提出了一个非常有趣的问题 – 当有多个提交按钮时会发生什么?

好吧,在POST操作期间,浏览器包含 ,这导致操作启动。

这意味着,就像获取元素的值一样,您也可以查询导致提交的按钮!

您的控件是一个提交按钮,它可以直接将表单提交给服务器而无需调用__dopostback方法。 所以在这种情况下__dopostback没有被调用。 __dopostback用于没有默认提交行为的控件,例如dropdownlist。

连接到服务器端事件是通过控件实现的ipostbackeventhandler接口实现的。 有关详细信息,请查看此http://msdn.microsoft.com/en-us/library/system.web.ui.ipostbackeventhandler.raisepostbackevent.aspx

那么,你怀疑的原因是因为你认为函数__doPostBack需要发布。 但另一方面,当html首次设计时,只有通过提交按钮发回服务器的方式。 这个function是在浏览器中自行构建的,这样当按下提交按钮时,浏览器将表单的数据传递给声明的位置。 但随着网络的发展,人们开始要求更多。 现在其他控件也需要回发到服务器。 为了实现它们,开发了各种hack,最着名的__doPostBack函数就是其中之一。 现在提交的任何其他控件都可以使用__doPostBack函数进行回发。 但是提交按钮就是这样做的。 就这样。