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

ASP.NET MVC表单提交禁用按钮后未调用HttpPost Action问题

问题根因

  • jQuery代码中属性名拼写错误,你写的disable是错误的,正确的禁用属性名是disabled,错误的属性赋值会触发浏览器表单提交链路异常。
  • 你在submit事件触发时直接禁用了表单唯一的提交按钮,部分浏览器会判定表单没有合法的提交触发源,放弃执行POST提交逻辑,转而刷新当前页面走GET请求,自然只会命中GET Action,不会触发标注了[HttpPost]的目标Action。
  • 控制器代码存在不规范写法:GET Action和控制器类同名,且直接接收复杂类型参数,很容易和路由规则冲突,干扰请求匹配逻辑。

修复方案

1. 调整前端JS代码

不要在submit事件里立刻禁用按钮,把禁用逻辑放到事件循环的下一个tick执行,保证浏览器先捕获到提交动作再禁用按钮,同时修正属性拼写:

$(function(){
  $("form").submit(function(e){
    // 保证提交逻辑先触发,再延迟禁用按钮
    setTimeout(() => {
      $('input[type="submit"]').prop("disabled", true);
    }, 0);
  });
})

2. 修正控制器不规范写法

避免Action名和控制器名重复,按MVC规范命名Action:

public class MyController:Controller{
    // GET请求对应Action
    public ActionResult MyForm(ExampleModel model){
        return View(model);
    }
    [HttpPost]
    public ActionResult MyForm(ExampleModel model){
        // 处理POST提交逻辑
        return View(model);
    }
}

同时修改cshtml的表单生成代码,明确指定提交的Action,避免路由匹配错误:

@using(Html.BeginForm("MyForm", "My", FormMethod.Post)){
  <input type="submit" value="Submit"/>
}

可选兜底方案

如果存在浏览器兼容性问题,可以不直接禁用按钮,加状态标记防止重复提交:

$(function(){
  $("form").submit(function(e){
    if($(this).data("submitted")){
      // 已经提交过就阻止后续请求
      e.preventDefault();
      return false;
    }
    $(this).data("submitted", true);
    $('input[type="submit"]').val("提交中...");
  });
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:24:02