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

ASP.NET MVC5中点击后禁用提交按钮并确保表单提交的实现

解决ASP.NET MVC5表单重复提交:禁用提交按钮但不阻止表单提交的方法

你遇到的问题我太熟悉了——直接在onclick里禁用按钮会导致浏览器不把这个提交按钮的参数传到服务器,而ASP.NET MVC的Action往往依赖提交按钮的存在来触发(尤其是多个提交按钮的场景),所以表单就提交失败了。下面给你几个靠谱的解决方案:

方法一:简单延迟禁用(快速上手)

给按钮的禁用操作加个极短的延迟,让浏览器先完成表单提交的请求发送,再禁用按钮:

<input type="submit" value="Create" onclick="setTimeout(() => this.disabled = true, 100);" />

这个方法优点是代码少,不用改太多,但要注意如果你的表单有客户端验证,可能会出现验证不通过但按钮还是被禁用的情况,所以更推荐下面的方法。

方法二:结合jQuery验证的优雅处理(推荐)

既然你已经引用了jqueryval,可以利用它的表单验证机制,确保验证通过后再禁用按钮,同时还能给用户加个加载提示:

@section scripts {
    @Scripts.Render("~/bundles/jqueryajaxval")
    @Scripts.Render("~/bundles/jqueryval")
    <script>
        $(document).ready(function() {
            // 监听表单提交事件
            $('form').submit(function() {
                // 先检查客户端验证是否通过
                if ($(this).valid()) {
                    // 找到当前表单的提交按钮,禁用并修改文本提示
                    const submitBtn = $('input[type="submit"]', this);
                    submitBtn.prop('disabled', true);
                    submitBtn.val('Creating...');
                }
            });
        });
    </script>
}

如果你的表单有多个提交按钮,建议给Create按钮加个ID,精准选择:

<input type="submit" id="createBtn" value="Create" />

然后修改脚本:

$('#createBtn').click(function(e) {
    const form = $(this).closest('form');
    // 验证不通过就阻止提交,避免按钮被禁用
    if (!form.valid()) {
        e.preventDefault();
        return;
    }
    // 验证通过后禁用按钮
    $(this).prop('disabled', true).val('Creating...');
});

额外提醒:服务器端也要防重复提交

客户端的禁用只是提升用户体验,懂技术的人可以绕过客户端限制,所以一定要在服务器端加一层防护:

  • 可以在表单里添加@Html.AntiForgeryToken(),Action里用[ValidateAntiForgeryToken]特性,防止CSRF的同时也能一定程度防重复提交;
  • 或者生成一个唯一的请求标识(比如存在Session里),用户提交后就标记这个标识已使用,重复提交就直接拒绝。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:25:03