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
相关产品推荐
相关产品推荐

