首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET AJAX:賦予特定非同步回發優先權並取消其餘回發

     編輯:關於ASP.NET

前言

預設情況下,多重非同步回發以最後發起者為準。若需關鍵操作 (如儲存) 擁有最高優先權,並取消其他進行中回發,可透過 PageRequestManager 客戶端邏輯實現。

核心腳本:PostbackPrecedence.js

Sys.Application.add_load(ApplicationLoadHandler);
function ApplicationLoadHandler(sender, args) {
    if (!Sys.WebForms.PageRequestManager.getInstance().get_isInAsyncPostBack()) {
        Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(InitializeRequest);
    }
}

var divElem = 'AlertDiv';
var messageElem = 'AlertMessage';
var exclusivePostBackElement = 'Button1'; // 優先權按鈕 ID
var lastPostBackElement;

function InitializeRequest(sender, args) {
    var prm = Sys.WebForms.PageRequestManager.getInstance();
    // 優先按鈕觸發:中止其他回發
    if (prm.get_isInAsyncPostBack() && args.get_postBackElement().id === exclusivePostBackElement) {
        if (lastPostBackElement === exclusivePostBackElement) {
            args.set_cancel(true);
            ActivateAlertDiv('visible', 'A previous postback is still executing. The new postback has been canceled.');
            setTimeout("ActivateAlertDiv('hidden','')", 1500);
        } else if (lastPostBackElement !== exclusivePostBackElement) {
            prm.abortPostBack();
        }
    }
    // 非優先按鈕觸發:若優先回發進行中,取消新回發
    else if (prm.get_isInAsyncPostBack() && args.get_postBackElement().id !== exclusivePostBackElement) {
        if (lastPostBackElement === exclusivePostBackElement) {
            args.set_cancel(true);
            ActivateAlertDiv('visible', 'A previous postback is still executing. The new postback has been canceled.');
            setTimeout("ActivateAlertDiv('hidden','')", 1500);
        }
    }
    lastPostBackElement = args.get_postBackElement().id;
}

function ActivateAlertDiv(visString, msg) {
    var adiv = $get(divElem);
    var aspan = $get(messageElem);
    adiv.style.visibility = visString;
    aspan.innerHTML = msg;
}
if (typeof(Sys) !== "undefined") Sys.Application.notifyScriptLoaded();

邏輯解析

  • exclusivePostBackElement:指定擁有優先權的控制項 ID。
  • lastPostBackElement:記錄上一次發起回發的控制項。
  • 優先回發進行中 → 中止其他回發 (abortPostBack)。
  • 其他回發進行中 → 取消優先回發 (set_cancel(true)) 並提示。
  • 連續點擊優先按鈕 → 取消後續點擊,避免重複提交。

應用場景

  • 「儲存」按鈕必須優先於「預覽」、「搜尋」等非關鍵操作。
  • 防止使用者急躁連點導致伺服器負載飆升。

總結

透過客戶端攔截 initializeRequest 事件,結合狀態追蹤,可實現細粒度的非同步回發優先權控制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved