2009-08-20 74 views
76

我有几个使用jQuery可拖动的小div s。这些div被放置在UpdatePanel中,并且在阻力停止时使用了_doPostBack() JavaScript函数。在那里我从页面表单中提取必要的信息。ASP.NET使用JavaScript回发

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

+0

你的div都有唯一的ID吗? – 2009-08-20 12:58:17

回答

202

这里是一个完整的解决方案的asp.net页面

整个窗体标签包括页面的的

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的代码隐藏
    <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> 
    

    全部内容确保__doPostBack的JavaScript功能呈现给客户。只要有Button控件,就不会导致这个__doPostBack函数被渲染。此功能将通过在大多数ASP上拥有各种控件来呈现。NET页面,因此通常不需要空链接按钮

发生了什么事?

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

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

的__doPostBack函数参数2呈现出像这个:

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 

其他注意事项

  • 如果我不”什么t知道我想要运行哪个点击处理程序的控件的ID?
    • 如果设置ClientIDMode="Static"是不可接受的,那么你可以这样做:__doPostBack('<%= myclientid.UniqueID %>', '')
    • 或者:__doPostBack('<%= MYBUTTON.UniqueID %>','')
    • 这将注入控制的唯一ID到的JavaScript,你应该希望它
+39

+1为完整性。那种让我爱StackOverflow的好回答。 – 2012-04-13 09:07:05

+3

这是我见过的__doPostBack().. +10的最好解释之一! – GuruC 2012-12-07 07:12:46

+1

@BrianWebster,非常感谢您的详细信息。我可以建议任何仍然使用C#而不是VB.NET的ASP.NET 3.5及更低版本的人将.aspx文件中的最后两行更改为以下内容: 的

2013-02-13 10:35:57

0

您不能致电_doPostBack(),因为它强制形式的子级。你为什么不禁用UpdatePanel上的PostBack

+0

我需要AJAX的更新面板。 – ErnieStings 2009-08-20 12:53:10

+1

一个问题。当div被拖动时,_doPostBack由您自动调用还是由ASP.NET自动调用? – 2009-08-20 12:55:45

+0

它由我通过javascript调用 – ErnieStings 2009-08-20 13:01:54

-1

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

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

这是未经测试的,但理论听起来似乎...如果这不起作用,你可以尝试与asp:按钮相同的东西,只需设置display:none样式并使用click事件代替变化事件。

+7

微软为web开发人员创建的第一个最邪恶的东西是什么? – ErnieStings 2009-08-20 13:16:38

+2

登录控件在该列表中必须非常高。 – kim3er 2009-08-20 13:19:58

+25

@ErnieStings:IE6 – phairoh 2009-08-20 14:40:03

2

您是否尝试将更新面板的客户端ID传递给__doPostBack函数?据我所知,我的团队已经完成了刷新更新面板的工作。

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

尽管Phairoh的解决方案在理论上看起来很合理,但我也发现了另一个解决此问题的方法。通过将UpdatePanels ID作为参数(事件目标)传递给doPostBack函数,更新面板将回发但不是整个页面。

__doPostBack('myUpdatePanelId','') 

*注:第二个参数是除了事件参数

希望这可以帮助别人!

编辑:看起来是这样上面我打字:)被赋予此相同的忠告

+2

这会起作用,而且我在应用程序中做了类似的事情,但它确实不是一个好主意,我讨厌当我这样做时我必须这样做。如果更新面板的名称发生更改,则会中断。如果你曾经把它放在一个用户控件中,它就会中断。如果你添加一个母版页,它会中断。是的,但它很脆弱。至少,请使用更新面板的ClientId属性而不是静态字符串。 – phairoh 2009-08-20 14:43:06

+0

请注意'__doPostBack('','')'也适用。 – ErikusMaximus 2018-02-28 20:27:23

14

每Phairoh:在页面使用此/组件,以防万一面板名称更改

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

如果任何人有这个麻烦(因为我),你可以得到通过将UseSubmitBehavior =“false”属性添加到按钮的回发代码。如果你检查按钮的呈现源,你会看到你需要执行的确切的JavaScript。在我的情况下,它使用的是按钮的名称而不是id。

+0

Very使用母版页时很有用。 – DCastenholz 2014-06-19 00:09:52

+0

__doPostBack似乎总是在使用母版页时使用该按钮的名称。 – 2014-07-07 23:54:52