使用JavaScript进行ASP.NET回发

时间:2009-08-20 12:45:25

标签: javascript asp.net webforms updatepanel postback

我有几个使用div可拖动的小jQuery。这些div放在UpdatePanel中,在dragstop上我使用_doPostBack() JavaScript函数。我从页面表格中提取必要的信息。

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

8 个答案:

答案 0 :(得分:216)

这是一个完整的解决方案

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();
    }
}
  • 如您所见,它会将值分配给隐藏的输入。

当表单提交/回发时:

  • 如果您提供了要运行其按钮点击处理程序的服务器控制按钮的唯一ID(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中

答案 1 :(得分:14)

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

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

答案 2 :(得分:8)

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

__doPostBack('myUpdatePanelId','')

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

希望这有助于某人!

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

答案 3 :(得分:6)

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

答案 4 :(得分:6)

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

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

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

function RefreshGrid() {
    <%= ClientScript.GetPostBackEventReference(btnRefresh, String.Empty) %>;
}

答案 5 :(得分:2)

您是否尝试将更新面板的客户端ID传递给__doPostBack函数?我的团队已经这样做了刷新更新面板,据我所知它有用。

__doPostBack(UpdatePanelClientID, '**Some String**');

答案 6 :(得分:1)

您无法致电_doPostBack(),因为它会强制提交表单。为什么不禁用PostBack上的UpdatePanel

答案 7 :(得分:1)

首先,不要使用更新面板。它们是微软为Web开发人员创建的第二个最邪恶的东西。

其次,如果必须使用更新面板,请尝试将UpdateMode属性设置为Conditional。然后将一个触发器添加到您添加到页面的Asp:Hidden控件。将更改事件指定为触发器。在dragstop事件中,更改隐藏控件的值。

这是未经测试的,但理论似乎听起来......如果这不起作用,你可以用asp:按钮尝试相同的事情,只需在其上设置display:none样式并使用click事件而不是改变事件。