ASP.NET Core MVC删除项时POST方法未调用的问题排查
解决ASP.NET Core MVC删除操作返回405错误的问题
问题分析
405错误表示HTTP请求方法不被允许,核心原因是控制器的DeleteConfirmed方法与表单提交的请求路由不匹配,或者不符合ASP.NET Core MVC的动作名称约定。
解决方案
方法1:统一动作名称映射(推荐)
修改控制器的DeleteConfirmed方法,添加[ActionName("Delete")]特性,让POST请求映射到Delete动作,同时调整视图中的表单动作名称:
控制器代码修改:
[HttpGet] public async Task<IActionResult> Delete(Guid id) { var subcategory = await _uow.SubcategoryRepository.GetByGuidSubcategoryAsync(id); if (subcategory == null) { return NotFound(); } return View(subcategory); } [HttpPost] [ActionName("Delete")] // 添加该特性实现动作别名映射 public async Task<IActionResult> DeleteConfirmed(Guid id) { var subcategory = await _uow.SubcategoryRepository.GetByGuidSubcategoryAsync(id); if (subcategory == null) { return NotFound(); } await _uow.SubcategoryRepository.DeleteAsync(subcategory); return RedirectToAction(nameof(Index)); }
视图代码修改(form标签部分):
<form asp-action="Delete" asp-route-id="@Model.Id" method="post"> @Html.AntiForgeryToken() <input type="submit" value="Delete" class="btn btn-danger" /> | <a asp-action="Index">Back to List</a> </form>
方法2:直接匹配动作名称(不推荐,不符合常规约定)
如果不想修改动作名称,确保视图的asp-action与控制器方法名称完全一致,同时确认路由模板未限制该动作:
- 保持控制器的
DeleteConfirmed方法不变 - 视图的form标签保持
asp-action="DeleteConfirmed",同时检查项目的路由模板(通常在Program.cs中)是否包含{action}参数,例如:
app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
关键说明
- ASP.NET Core MVC默认通过动作名称匹配路由,使用
[ActionName]特性可以实现"别名"映射,让GET和POST请求分别对应不同的处理方法,同时保持URL的简洁性。 - 若防伪令牌验证失败会返回400错误而非405,你已添加
@Html.AntiForgeryToken(),无需额外操作。
内容的提问来源于stack exchange,提问作者Torekhan
相关产品推荐
相关产品推荐

