我有几个div
正在使用jQuery
可拖动的小。这些div
放置在中UpdatePanel
,并且在dragstop上使用_doPostBack()
JavaScript函数,在其中我从页面的表单中提取必要的信息。
我的问题是,当我调用此函数时,将重新加载整个页面,但是我只希望重新加载更新面板。
Answers:
这是一个完整的解决方案
<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的参数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();
}
}
表单提交/回发时:
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 %>','')
从理论上讲,Phairoh的解决方案似乎合理,但我也找到了解决该问题的另一种方法。通过将UpdatePanels id作为doPostBack函数的参数(事件目标)传递,更新面板将回发而不是整个页面。
__doPostBack('myUpdatePanelId','')
*注意:第二个参数用于添加事件参数
希望这对某人有帮助!
编辑:所以看来这条建议是我在上面输入的:)
__doPostBack
直接使用是2000年代。2018年编写WebForms的任何人都使用GetPostBackEventReference
(不过,更严重的是,将其添加为完整性的答案。__doPostBack
直接使用是不好的做法(单个下划线前缀通常表示私有成员,而双精度表示一个更通用的私有成员),尽管这样做可能不会更改或变得过时一点。我们在ClientScriptManager.GetPostBackEventReference中有一个完全受支持的机制。)
假设您的btnRefresh位于我们的UpdatePanel内并引起回发,则可以像这样(灵感)使用GetPostBackEventReference :
function RefreshGrid() {
<%= ClientScript.GetPostBackEventReference(btnRefresh, String.Empty) %>;
}
如果有人遇到问题(就像我以前一样),则可以通过向其添加UseSubmitBehavior =“ false”属性来获取按钮的回发代码。如果检查按钮的渲染源,将看到需要执行的确切JavaScript。就我而言,它使用的是按钮的名称而不是ID。
您是否尝试过将“更新”面板的客户端ID传递给__doPostBack函数?据我所知,我的团队已完成此操作以刷新更新面板。
__doPostBack(UpdatePanelClientID, '**Some String**');
首先,不要使用更新面板。它们是Microsoft为Web开发人员创建的第二件最邪恶的事情。
其次,如果必须使用更新面板,请尝试将UpdateMode属性设置为Conditional。然后将触发器添加到您添加到页面的Asp:Hidden控件。将更改事件分配为触发器。在您的dragstop事件中,更改隐藏控件的值。
这未经测试,但是理论上似乎是正确的...如果不起作用,则可以使用asp:button尝试相同的操作,只需在其上设置display:none样式,然后使用click事件而不是change事件。
您无法调用,_doPostBack()
因为它会强制提交表单。为什么不禁PostBack
用UpdatePanel
?