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

ASP.NET Core 6 MVC删除SQL Server数据遇HTTP405错误且数据未删除求助

ASP.NET Core 6 MVC + EF 6.0.11 删除数据异常问题

问题现象

使用ASP.NET Core 6 MVC结合Entity Framework 6.0.11操作SQL Server数据库时,删除功能出现以下异常:

  • 进入删除确认页面后,页面显示的数值均为0
  • 点击确认删除按钮后,返回列表页,待删除数据仍未被移除
  • 操作过程中页面提示HTTP 405错误

相关代码

控制器代码

public IActionResult deletePackage (long ID)
{
    ForDeletePackage = LQHVContext.Packages.Where(s => s.PackagesId == ID).FirstOrDefault();

    if (ForDeletePackage == null)
    {
        return NotFound();
    }

    return View(ForDeletePackage);
}

[HttpPost]
public IActionResult Delete(long ID)
{                        
    Package package = new Package() { PackagesId = ID };
    LQHVContext.Packages.Attach(package);
    LQHVContext.Packages.Remove(package);

    if (LQHVContext.SaveChanges() == 1)
    {
        //redirect to package list
        return RedirectToAction("packageList", "Packages");
    }

    return View("deletePackage", package);
}

Razor页面代码

<form asp-action="Delete">
    <input type="submit" value="Delete" class="btn btn-danger" /> |
    <a asp-action="listPackage">Back to List</a>
</form>

问题原因及修复方案

1. HTTP 405错误修复

ASP.NET Core默认启用CSRF(跨站请求伪造)验证,当前表单未携带CSRF令牌,导致POST请求被拦截返回405错误。

修复代码:在表单中添加CSRF令牌

<form asp-action="Delete">
    @Html.AntiForgeryToken()
    <input type="submit" value="删除" class="btn btn-danger" /> |
    <a asp-action="listPackage">返回列表</a>
</form>

2. 确认页面显示0值修复

POST方法的Delete中,删除失败时返回的是仅赋值ID的空Package对象,其他数值属性默认值为0,导致页面绑定显示0。

修复代码:删除失败时重新查询完整实体再返回视图

[HttpPost]
public IActionResult Delete(long ID)
{                        
    var package = LQHVContext.Packages.FirstOrDefault(s => s.PackagesId == ID);
    if(package == null)
    {
        return NotFound();
    }
    LQHVContext.Packages.Remove(package);

    if (LQHVContext.SaveChanges() == 1)
    {
        return RedirectToAction("packageList", "Packages");
    }

    // 删除失败返回完整实体,避免页面显示默认值
    return View("deletePackage", package);
}

3. 数据未删除成功修复

之前使用Attach方式删除可能存在上下文跟踪异常,直接查询实体再删除更可靠;同时需确保SaveChanges()执行时无异常,可添加日志或异常捕获排查问题。

优化后控制器代码(含异常处理):

[HttpPost]
public IActionResult Delete(long ID)
{                        
    try
    {
        var package = LQHVContext.Packages.FirstOrDefault(s => s.PackagesId == ID);
        if(package == null)
        {
            return NotFound();
        }
        LQHVContext.Packages.Remove(package);

        if (LQHVContext.SaveChanges() == 1)
        {
            return RedirectToAction("packageList", "Packages");
        }
        ViewBag.ErrorMessage = "删除失败,请稍后重试";
        return View("deletePackage", package);
    }
    catch(Exception ex)
    {
        ViewBag.ErrorMessage = $"删除出错:{ex.Message}";
        var package = LQHVContext.Packages.FirstOrDefault(s => s.PackagesId == ID);
        return View("deletePackage", package);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:15:36