You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core MVC表单用SweetAlert2时必填项缺失仍可提交的修复求助

问题原因
  • 原生alert()是同步阻塞调用:弹出时会暂停所有JavaScript执行,直到用户点击确认,这让jquery.validate有足够时间完成错误标记并阻断表单提交流程。
  • SweetAlert2的Swal.fire()是异步非阻塞调用:代码执行后会立刻继续向下运行,不会等待用户交互,导致表单提交流程没被中断,直接触发POST请求。
解决方案

需要手动阻断表单默认提交行为,同时确保用户确认提示后,验证错误状态依然生效,避免表单意外提交。

方案1:修改onErrors函数阻断提交

直接在onErrors中通过事件对象阻止默认行为,再触发SweetAlert2:

function onErrors(event, validator) {  // 'this' 指向表单元素
    var container = $(this).find("[data-valmsg-summary=true]"),
        list = container.find("ul");

    if (list && list.length && validator.errorList.length) {
        list.empty();
        container.addClass("validation-summary-errors").removeClass("validation-summary-valid");

        $.each(validator.errorList, function () {
            $("<li />").html(this.message).appendTo(list);
        });

        // 阻断表单默认提交流程
        event.preventDefault();
        
        // 触发SweetAlert2提示
        Swal.fire({
            title: 'Required Input Missing',
            html: 'One or more required fields have been left blank.',
            icon: 'error',
            allowOutsideClick: false,
            allowEscapeKey: false,
            allowEnterKey: false
        });
    }
}

方案2:通过事件委托避免修改源码

如果不想直接修改jquery.validate.unobtrusive.js(避免版本升级覆盖修改),可以用事件委托绑定自定义处理逻辑:

$(document).on('invalid-form', 'form', function(event, validator) {
    // 先执行原生的unobtrusive错误处理逻辑
    var originalErrorHandler = $.validator.unobtrusive.options.error;
    originalErrorHandler.call(this, event, validator);
    
    // 阻断提交并触发SweetAlert2
    event.preventDefault();
    Swal.fire({
        title: 'Required Input Missing',
        html: 'One or more required fields have been left blank.',
        icon: 'error',
        allowOutsideClick: false,
        allowEscapeKey: false,
        allowEnterKey: false
    });
});

内容的提问来源于stack exchange,提问作者bmurrell30

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 20:30:24