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

Pra*_*pan 9 c# asp.net webforms asp.net-ajax

我使用了一个<asp:Button />控件,在浏览器中渲染后控件没有click分配事件属性.究竟是如何调用服务器端事件的呢?

ASPX代码:

<asp:Button ID="Button1" runat="server" Text="Button" OnClick="TestClickEvent" />
Run Code Online (Sandbox Code Playgroud)

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

<input type="submit" name="Button1" value="Button" id="Button1">
Run Code Online (Sandbox Code Playgroud)

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

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

Jes*_*sse 12

答案很简单:__doPostBackJavaScript函数是基于特定的所谓<asp />控制它处理的事件.

详细答案:这取决于.


首先,让我们来举例说明.你有一个<asp:Button />作为标准呈现<input type="submit" />.ASP.NET WebForms中的所有内容都围绕标准HTML<form>标记.通过单击按钮,在使用或协助JavaScript的情况下<form>提交HTML .<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:DropDownList />控件的ASP.NET页面,它SelectedIndexChanged分配了事件处理程序:

<asp:DropDownList ID="MyDropDownList" AutoPostBack="true" OnSelectedIndexChanged="MyDropDownList_SelectedIndexChanged" runat="server" />
Run Code Online (Sandbox Code Playgroud)

<asp:DropDownList />呈现如下:

<select id="ctl00_MyDropDownList" onchange="javascript:setTimeout('__doPostBack(\'ctl00$MyDropDownList\',\'\')', 0)" name="ctl00$MyDropDownList"></select>
Run Code Online (Sandbox Code Playgroud)

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

正如你可以在这里看到,该__doPostBack功能由所谓的onchange事件处理程序.关键的区别在于更改<asp:DropDownList /><select />控件的值不会导致浏览器提交表单!

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


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


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

好了,在POST操作时,浏览器会包含value<input type="submit" />造成的操作来启动.

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