使用JavaScript进行ASP.NET回发

Ern*_*ngs 80 javascript asp.net postback updatepanel webforms

我有几个小的divs利用jQuerydraggable.这些div被放置在一个UpdatePanel,并在拖动器上我使用_doPostBack()JavaScript函数.我从页面表格中提取必要的信息.

我的问题是,当我调用此函数时,整个页面被重新加载,但我只想重新加载更新面板.

Bri*_*ter 223

这是一个完整的解决方案

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>
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)
  • 包含LinkBut​​ton以确保将__doPostBack javascript函数呈现给客户端.简单地使用Button控件不会导致呈现此__doPostBack函数.此函数将通过在大多数ASP.NET页面上具有各种控件来呈现,因此通常不需要空链接按钮

这是怎么回事?

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

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
Run Code Online (Sandbox Code Playgroud)
  • __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();
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 如您所见,它将值分配给隐藏的输入.

当表单提交/回发时:

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

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

你可以传递你想要的任何东西作为参数 __doPostBack

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

If Request.Form("__EVENTTARGET") = "DoSomethingElse" Then
    Response.Write("Do Something else") 
End If
Run Code Online (Sandbox Code Playgroud)

其他说明

  • 如果我不知道我想要运行其点击处理程序的控件的ID,该怎么办?
    • 如果设置不合格ClientIDMode="Static",那么你可以这样做:__doPostBack('<%= myclientid.UniqueID %>', '').
    • 要么: __doPostBack('<%= MYBUTTON.UniqueID %>','')
    • 如果你愿意,这会将控件的唯一ID注入到javascript中

  • +1表示完整性.一种很棒的答案让我爱上StackOverflow. (46认同)
  • 对于__doPostBack().. + 10,这是我遇到过的最好的解释之一! (3认同)

Lar*_*mie 14

Per Phairoh:在面板名称发生变化时,在页面/组件中使用它

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


Ern*_*ngs 8

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

__doPostBack('myUpdatePanelId','')
Run Code Online (Sandbox Code Playgroud)

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

希望这有助于某人!

编辑:所以看起来上面给出了同样的建议,因为我正在打字:)

  • 这会起作用,我在应用程序中做了类似的事情,但这确实不是一个好主意,我讨厌我必须这样做.如果更新面板的名称发生变化,则会中断.如果你把它放在用户控件中,它会中断.如果添加母版页,则会中断.是的它有效,但它非常脆弱.至少,请使用更新面板的ClientId属性而不是静态字符串. (2认同)

mlh*_*Dev 7

__doPostBack直接使用是2000年代。2018年编写WebForms的任何人都使用GetPostBackEventReference

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

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

function RefreshGrid() {
    <%= ClientScript.GetPostBackEventReference(btnRefresh, String.Empty) %>;
}
Run Code Online (Sandbox Code Playgroud)


use*_*998 6

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