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

时间:2013-03-28 09:41:53

标签: c# asp.net webforms asp.net-ajax

我使用了<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();
        }
    }

3 个答案:

答案 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 的详细信息,它接受两个参数 - __doPostBackeventTargeteventArgument包含导致回发的控件的呈现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函数进行回发。但是提交按钮就是这样做的。多数民众赞成。