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

ASP.NET Core MVC IIS Express下HttpPost提交表单报405错误

问题现象
  • 为HomeController中处理表单提交的Contact方法添加[HttpPost]特性后,在IIS Express环境提交表单返回HTTP ERROR 405 Page not found错误
  • 移除Contact方法上的[HttpPost]特性后,页面可正常加载访问,但表单提交的数据无法写入数据库
问题根因
  • 核心原因1:标签助手未生效。如果项目未在_ViewImports.cshtml中注册MVC内置标签助手,form标签上的asp-controller、asp-action属性不会被解析,表单将默认提交到当前渲染页面对应的路由(即带[HttpGet]特性的Index方法),而Index方法仅接受GET请求,POST请求自然返回405状态码。
  • 核心原因2:缺少GET版本的Contact方法。如果Contact表单存放在独立的Contact视图中,现有代码仅提供了处理POST请求的Contact方法,访问表单页面的GET请求没有对应处理逻辑,也会触发405/404错误。
  • 附加诱因:IIS Express默认启用WebDAV模块,会拦截未匹配到静态资源的POST请求,直接返回405状态,阻断请求进入ASP.NET Core MVC处理管线。
  • 移除[HttpPost]后数据无法入库的原因:此时Contact方法同时接受GET、POST请求,但要么表单根本没提交到该方法(标签助手失效场景),要么GET请求触发方法时传入的是空模型,自然无法写入有效数据。
解决方案

按以下顺序逐一排查修复:

  1. 补全标签助手配置
    打开Views/_ViewImports.cshtml文件,确认存在如下配置,不存在则直接添加,确保表单标签助手能正常解析路由:
    @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
    
    配置完成后启动项目,查看页面源码,确认form标签渲染后的action属性值为/Home/Contact。
  2. 补全Contact方法的GET请求处理
    若Contact表单为独立页面(对应Views/Home/Contact.cshtml文件),在HomeController中添加如下方法,用于返回表单页面:
    [HttpGet]
    public IActionResult Contact()
    {
        return View();
    }
    
    如果表单直接嵌入在Index视图中,可跳过此步骤。
  3. 禁用WebDAV模块拦截
    打开项目根目录的web.config文件(不存在则手动新建),在<system.webServer>节点下添加如下配置,移除WebDAV模块的拦截逻辑:
    <system.webServer>
      <modules>
        <remove name="WebDAVModule" />
      </modules>
      <handlers>
        <remove name="WebDAV" />
      </handlers>
    </system.webServer>
    
  4. 验证提交逻辑
    在POST版本的Contact方法内加断点,提交表单时检查传入的ContactUs模型是否能正常绑定表单输入的值,同时确认数据库连接字符串、DbContext实体集配置正确,db.SaveChanges()执行无异常即可。
    推荐在表单内添加防伪造令牌、在POST方法上添加[ValidateAntiForgeryToken]特性,避免跨站请求伪造风险,也能解决部分场景下的模型绑定失效问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:39:21