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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:34:53