使用 JavaScript 的 ASP.NET 回发

IT技术 javascript asp.net webforms updatepanel postback
2021-01-17 18:52:21

我有几个div使用jQuery可拖动的s 这些divs 被放置在一个 中UpdatePanel,并且在 dragstop 上我使用_doPostBack()JavaScript 函数,在那里我从页面的表单中提取必要的信息。

我的问题是,当我调用这个函数时,整个页面都会重新加载,但我只想重新加载更新面板。

6个回答

这是一个完整的解决方案

asp.net 页面的整个表单标签

<form id="form1" runat="server">
    <asp:LinkButton ID="LinkButton1" runat="server" /> <%-- included to force __doPostBack javascript function to be rendered --%>

    <input type="button" id="Button45" name="Button45" onclick="javascript:__doPostBack('ButtonA','')" value="clicking this will run ButtonA.Click Event Handler" /><br /><br />
    <input type="button" id="Button46" name="Button46" onclick="javascript:__doPostBack('ButtonB','')" value="clicking this will run ButtonB.Click Event Handler" /><br /><br />

    <asp:Button runat="server" ID="ButtonA" ClientIDMode="Static" Text="ButtonA" /><br /><br />
    <asp:Button runat="server" ID="ButtonB" ClientIDMode="Static" Text="ButtonB" />
</form>

页面代码隐藏类的全部内容

Private Sub ButtonA_Click(sender As Object, e As System.EventArgs) Handles ButtonA.Click
    Response.Write("You ran the ButtonA click event")
End Sub

Private Sub ButtonB_Click(sender As Object, e As System.EventArgs) Handles ButtonB.Click
    Response.Write("You ran the ButtonB click event")
End Sub
  • 包含 LinkBut​​ton 以确保 __doPostBack javascript 函数呈现给客户端。简单地拥有 Button 控件不会导致呈现这个 __doPostBack 函数。由于在大多数 ASP.NET 页面上具有多种控件,因此将呈现此功能,因此通常不需要空链接按钮

这是怎么回事?

向客户端呈现两个输入控件:

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
  • __EVENTTARGET 接收 __doPostBack 的参数 1
  • __EVENTARGUMENT 接收 __doPostBack 的参数 2

__doPostBack 函数呈现如下:

function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
  • 如您所见,它将值分配给隐藏的输入。

当表单提交/回发时:

  • 如果您提供了要运行其按钮单击处理程序的服务器控制按钮的 UniqueID ( javascript:__doPostBack('ButtonB',''),则将运行该按钮的按钮单击处理程序。

如果我不想运行点击处理程序,而是想做其他事情怎么办?

你可以将任何你想要的作为参数传递给 __doPostBack

然后,您可以分析隐藏的输入值并相应地运行特定代码:

If Request.Form("__EVENTTARGET") = "DoSomethingElse" Then
    Response.Write("Do Something else") 
End If

其他注意事项

  • 如果我不知道要运行其单击处理程序的控件的 ID,该怎么办?
    • 如果是不能接受的一套ClientIDMode="Static",那么你可以做这样的事情:__doPostBack('<%= myclientid.UniqueID %>', '')
    • 或者: __doPostBack('<%= MYBUTTON.UniqueID %>','')
    • 如果您愿意,这会将控件的唯一 ID 注入到 javascript 中
这是一个非常有用的解决方案。如果您使用母版页,按钮的 id 会变得有点模糊。请参阅下面的 user489998 的回答,以帮助获取正确的回发 ID。
2021-03-19 18:52:21
+1 表示完整性。很好的答案让我喜欢 StackOverflow。
2021-03-26 18:52:21
@BrianWebster,非常感谢您的详细帖子。我可以建议仍然使用 ASP.NET 3.5 及以下版本的任何人使用 C# 而不是 VB.NET 将 .aspx 文件中的最后两行更改为以下内容吗?<asp:Button runat="server" ID="ButtonA" Text="ButtonA" OnClick = "ButtonA_Click"/><br /> <br /> <asp:Button runat="server" ID="ButtonB" Text= "ButtonB" OnClick = "ButtonB_Click" />
2021-03-28 18:52:21
这是我对 __doPostBack() 遇到的最好的解释之一。为此 +10!
2021-04-02 18:52:21
@BrianWebster 能够为某人的问题提供完整的解决方案并为潜在的偏差提供适当的替代方案确实很少见。
2021-04-10 18:52:21

Per Phairoh:在页面/组件中使用它,以防面板名称更改

<script type="text/javascript">
     <!--
     //must be global to be called by ExternalInterface
         function JSFunction() {
             __doPostBack('<%= myUpdatePanel.ClientID  %>', '');
         }
     -->
     </script>

虽然 Phairoh 的解决方案在理论上似乎是合理的,但我也找到了另一个解决这个问题的方法。通过将 UpdatePanels id 作为参数(事件目标)传递给 doPostBack 函数,更新面板将回发,但不会回发整个页面。

__doPostBack('myUpdatePanelId','')

*注意:第二个参数用于添加事件参数

希望这有助于某人!

编辑:所以似乎在我打字时上面给出了同样的建议:)

这会奏效,而且我在应用程序中做了类似的事情,但这真的不是一个好主意,我讨厌这样做时我不得不这样做。如果您的更新面板的名称发生变化,它就会中断。如果你曾经把它放在用户控件中,它就会中断。如果您添加一个母版页,它会中断。是的,它有效,但它非常脆弱。至少,请使用更新面板的 ClientId 属性而不是静态字符串。
2021-03-22 18:52:21

__doPostBack直接使用太2000了。任何在 2018 年编写 WebForms 的人都使用 GetPostBackEventReference

(更严重的是,添加这个作为完整性的答案。__doPostBack直接使用是不好的做法(单下划线前缀通常表示私有成员,双下划线表示更通用的私有成员),尽管它可能不会改变或在此过时点。我们在ClientScriptManager.GetPostBackEventReference 中有一个完全支持的机制。)

假设您的 btnRefresh 位于我们的 UpdatePanel 内并导致回发,您可以像这样使用 GetPostBackEventReference(灵感):

function RefreshGrid() {
    <%= ClientScript.GetPostBackEventReference(btnRefresh, String.Empty) %>;
}
这非常有效。在我的情况下,我可以在 HTML 标记中单击 btnRefresh 时声明要刷新的 Target AJAX 控件。通过使用它,在支持 AJAX 的情况下实现它变得非常简单。
2021-04-04 18:52:21

如果有人对此有问题(就像我一样),您可以通过向按钮添加 UseSubmitBehavior="false" 属性来获取按钮的回发代码。如果您检查按钮的呈现源,您将看到您需要执行的确切 javascript。在我的情况下,它使用按钮的名称而不是 id。

__doPostBack 在使用母版页时似乎总是使用按钮的名称。
2021-03-12 18:52:21
使用母版页时非常有用。
2021-03-21 18:52:21