我有几个使用div
可拖动的小jQuery
。这些div
放在UpdatePanel
中,在dragstop上我使用_doPostBack()
JavaScript函数。我从页面表格中提取必要的信息。
我的问题是,当我调用此函数时,整个页面会重新加载,但我只想重新加载更新面板。
答案 0 :(得分:216)
这是一个完整的解决方案
<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
向客户端呈现两个输入控件:
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
__EVENTTARGET
收到__doPostBack __EVENTARGUMENT
收到__doPostBack __doPostBack函数的渲染方式如下:
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
当表单提交/回发时:
javascript:__doPostBack('ButtonB','')
,则将运行该按钮的按钮单击处理程序。您可以将您想要的任何内容作为参数传递给__doPostBack
然后,您可以分析隐藏的输入值并相应地运行特定代码:
If Request.Form("__EVENTTARGET") = "DoSomethingElse" Then
Response.Write("Do Something else")
End If
ClientIDMode="Static"
是不可接受的,那么您可以执行以下操作:__doPostBack('<%= myclientid.UniqueID %>', '')
。 __doPostBack('<%= MYBUTTON.UniqueID %>','')
答案 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事件而不是改变事件。