簡體   English   中英

使用 JavaScript 的 ASP.NET 回發

[英]ASP.NET postback with JavaScript

我有幾個使用jQuery可拖動的小div 這些div放置在UpdatePanel ,在 dragstop 上我使用_doPostBack() JavaScript 函數,在那里我從頁面的表單中提取必要的信息。

我的問題是,當我調用這個函數時,整個頁面都會重新加載,但我只想重新加載更新面板。

這是一個完整的解決方案

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();
    }
}
  • 如您所見,它將值分配給隱藏的輸入。

當表單提交/回發時:

  • 如果您提供了要運行其按鈕單擊處理程序的服務器控制按鈕的 UniqueID ( 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 中

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM