9

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

ASP 代码:

<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();
        }
    }
4

3 回答 3

12

简单的答案: 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:的细节,它接受两个参数 -eventTargeteventArgument. eventTarget包含导致回发的控件的呈现 HTMLid属性;并且eventArgument是一个可选参数,可用于将附加数据传递给后端代码。


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

好吧,在POST操作期间,浏览器会包含导致操作启动value的那些。<input type="submit" />

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

于 2013-04-01T17:58:03.390 回答
4

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

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

于 2013-03-30T00:55:10.503 回答
3

嗯,你有疑问的原因是因为你认为函数 __doPostBack 需要发布。但反过来说,当最初设计 html 时,回发到服务器的唯一方法是通过提交按钮。此功能是在浏览器中构建的,因此当按下提交按钮时,浏览器会将表单的数据传递到声明的位置。但随着网络的发展,人们开始要求更多。现在其他控件也需要回发到服务器。为了实现它们,开发了各种 hack,最著名的 __doPostBack 函数就是其中之一。现在提交的任何其他控件都可以使用 __doPostBack 函数回发。但是提交按钮自己做。就这样。

于 2013-04-04T07:54:49.933 回答