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

