[英]ASP.NET postback with JavaScript
我有幾個使用jQuery
可拖動的小div
。 這些div
放置在UpdatePanel
,在 dragstop 上我使用_doPostBack()
JavaScript 函數,在那里我從頁面的表單中提取必要的信息。
我的問題是,當我調用這個函數時,整個頁面都會重新加載,但我只想重新加載更新面板。
這是一個完整的解決方案
<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 %>','')
Per Phairoh:在頁面/組件中使用它,以防面板名稱更改
<script type="text/javascript">
<!--
//must be global to be called by ExternalInterface
function JSFunction() {
__doPostBack('<%= myUpdatePanel.ClientID %>', '');
}
-->
</script>
雖然 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**');
您不能調用_doPostBack()
因為它會強制提交表單。 為什么不在UpdatePanel
上禁用PostBack
?
首先,不要使用更新面板。 它們是 Microsoft 為 Web 開發人員創建的第二個最邪惡的東西。
其次,如果您必須使用更新面板,請嘗試將 UpdateMode 屬性設置為 Conditional。 然后向添加到頁面的 Asp:Hidden 控件添加觸發器。 將更改事件指定為觸發器。 在您的 dragstop 事件中,更改隱藏控件的值。
這是未經測試的,但理論似乎是合理的...如果這不起作用,您可以使用 asp:button 嘗試相同的操作,只需在其上設置 display:none 樣式並使用 click 事件而不是 change 事件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.