首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

ASP.NET __doPostBack 中 onsubmit 與 onsubmit() 差異解析

     編輯:程式設計綜合問答

程式碼出處

ASP.NET WebForms 自動生成的客戶端腳本,負責處理 `` 等控件的 PostBack 流程。

代碼逐行解析

function _doPostBack(eventTarget, eventArgument) {
    // 1. theForm = document.forms[0] (頁面唯一 form)
    // 2. onsubmit = theForm.onsubmit (取得 onsubmit 事件處理器引用)
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        // 3. !theForm.onsubmit → 沒有綁定 onsubmit 事件
        // 4. theForm.onsubmit() → **呼叫** onsubmit 處理器,取得返回值
        // 5. != false → 返回值不為 false (true/undefined/null 都繼續)
        
        theForm._EVENTTARGET.value = eventTarget;
        theForm._EVENTARGUMENT.value = eventArgument;
        theForm.submit(); // 真正提交表單
    }
}

關鍵差異對照表

寫法含義類型範例
theForm.onsubmit取得事件處理器**引用** (函數物件)Function / null`function() { return validate(); }`
theForm.onsubmit()**呼叫** 事件處理器,取得**返回值**Boolean / undefined`true` / `false` / `undefined`

HTML 對應關係

<form id="form1" runat="server" onsubmit="return validateForm();">
    <asp:Button Text="提交" />
</form>

<script>
function validateForm() {
    if ($('#txtName').val() === '') {
        alert('姓名必填');
        return false; // 阻止提交
    }
    return true; // 允許提交
}
</script>

執行流程圖解

使用者點擊 Button
        ↓
__doPostBack('btnSubmit', '')
        ↓
檢查 theForm.onsubmit 存在嗎? → 否 → 直接 submit()
        ↓ 是
呼叫 theForm.onsubmit() → validateForm()
        ↓
返回 false? → 是 → 阻止提交,結束
        ↓ 否
設置 __EVENTTARGET / __EVENTARGUMENT
        ↓
theForm.submit() → 瀏覽器原生提交 → 頁面 PostBack

常見誤區

  • ❌ 以為 `onsubmit` 是屬性值 → 實際是 DOM 0 級事件處理器屬性
  • ❌ 以為 `return false` 在 jQuery `.submit()` 中生效 → 需用 `e.preventDefault()`
  • ❌ 直接覆蓋 `form.onsubmit = ...` → 會覆蓋 ASP.NET 內部邏輯,**應用 `addEventListener`**

正確攔截提交的現代寫法

document.getElementById('form1').addEventListener('submit', function(e) {
    if (!validateForm()) {
        e.preventDefault(); // 阻止提交
        return false;
    }
    // 允許提交,ASP.NET _doPostBack 繼續執行
});

總結

  • onsubmit (無括號) = **取得函數引用**,用於判斷是否存在
  • onsubmit() (有括號) = **執行函數**,用於取得驗證結果
  • ASP.NET 這段代碼體現了「防禦性程式設計」:先檢查存在性,再呼叫,最後判斷返回值
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved