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

ASP.NET Core点击Delete按钮出现404 Not Found错误的排查

ASP.NET Core RobotController Delete 404 问题排查与解决

常见原因及解决方法

1. HTTP 动词与请求方式不匹配

ASP.NET Core 中删除操作通常分两步:

  • HttpGet 类型的 Delete(int id):负责渲染删除确认页面(对应Delete视图)
  • HttpPost/HttpDelete 类型的 DeleteConfirmed(int id):负责执行实际删除逻辑

如果Details视图的Delete按钮发起的请求方法与控制器方法的HTTP动词不匹配,就会触发404。

解决方法:

  • 确保控制器方法的特性配置正确:
    // 显示删除确认页的Get方法
    [HttpGet]
    public IActionResult Delete(int id)
    {
        var robot = _context.Robots.Find(id);
        if (robot == null) return NotFound();
        return View(robot);
    }
    
    // 执行删除的Post方法(用ActionName避免重载冲突)
    [HttpPost, ActionName("Delete")]
    [ValidateAntiForgeryToken]
    public IActionResult DeleteConfirmed(int id)
    {
        var robot = _context.Robots.Find(id);
        if (robot != null) _context.Robots.Remove(robot);
        _context.SaveChanges();
        return RedirectToAction(nameof(Index));
    }
    
  • Details视图中的Delete按钮要生成指向HttpGet Delete的链接,用于跳转确认页:
    <!-- 使用Tag Helper生成正确链接 -->
    <a asp-action="Delete" asp-controller="Robot" asp-route-id="@Model.Id" class="btn btn-danger">删除</a>
    
    或用HtmlHelper:
    @Html.ActionLink("删除", "Delete", "Robot", new { id = Model.Id }, new { @class = "btn btn-danger" })
    

2. 路由参数传递错误

如果Delete方法依赖id参数,但视图未正确传递,或参数名称不匹配(比如控制器用int robotId,视图传id),会导致路由无法匹配。

解决方法:

  • 确保控制器参数名称与视图传递的路由参数一致:
    若控制器方法是public IActionResult Delete(int robotId),视图需对应修改:
    <a asp-action="Delete" asp-controller="Robot" asp-route-robotId="@Model.Id" class="btn btn-danger">删除</a>
    
  • 验证Model.Id不为空或无效值,避免传递无效参数导致路由失效。

3. 视图跳转路径/Action名称错误

如果视图中写错了控制器或Action名称(比如把Robot写成Robots,或直接指向DeleteConfirmed),会直接找不到对应路由。

解决方法:

  • 检查视图中asp-controller、asp-action属性值:控制器类是RobotController,所以asp-controller="Robot";跳转的是确认页的Delete方法,所以asp-action="Delete"。
  • 不要直接指向DeleteConfirmed,该方法是Post请求专用,通过ActionName("Delete")映射到Delete路由。

4. 全局路由配置问题

如果项目使用属性路由(控制器/方法加[Route]特性),但Delete方法未配置正确的路由模板,会导致路由不匹配。

解决方法:

  • 若用属性路由,确保Delete方法的路由模板包含必要参数:
    [Route("Robot/[action]/{id?}")]
    public class RobotController : Controller
    {
        [HttpGet]
        public IActionResult Delete(int id)
        {
            // 逻辑代码
        }
    }
    
  • 若用传统路由,确认Program.cs中的默认路由模板包含controller、action和id参数:
    app.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
    

快速排查步骤

  1. 打开浏览器开发者工具(F12),查看Delete按钮的请求URL,确认是否包含正确的控制器、Action和id参数。
  2. 直接在浏览器输入/Robot/Delete/1(替换1为有效id),测试Delete视图是否能正常访问。
  3. 检查控制器Delete方法是否带有[HttpGet]特性,且参数定义正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 19:53:19