存在关联时删除数据失败却返回true,如何修正返回逻辑?
问题分析与解决方案
你遇到的问题其实有两个核心点:
- 后端代码仅在发生异常时返回
false,但部分删除失败的场景可能不会抛出异常(比如要删除的记录已不存在,或数据库约束导致删除未生效但未触发异常); - 前端脚本不管后端返回的
IsComplete值是什么,只要请求成功就显示成功提示,这会让你误以为删除成功,实际却失败了。
咱们一步步来修正:
1. 优化后端Delete方法
修改后的代码会做这几件关键事:
- 检查要删除的记录是否存在;
- 执行删除后,通过
SaveChanges()的返回值确认是否有行被实际删除; - 捕获所有可能的异常(比如外键约束冲突),确保异常场景也能返回
false。
public ActionResult Delete(int? User) { // 参数为空直接返回失败 if (!User.HasValue) { return Json(new { IsComplete = false }); } try { var item = Db.Institutions.FirstOrDefault(p => p.Id == User.Value); // 要删除的记录不存在,返回失败 if (item == null) { return Json(new { IsComplete = false }); } Db.Institutions.Remove(item); // 获取受影响的行数:删除成功时该值应为1 int affectedRows = Db.SaveChanges(); // 根据实际删除结果返回状态 return Json(new { IsComplete = affectedRows > 0 }); } catch (Exception ex) { // 这里可以添加日志记录方便排查问题,比如: // Logger.LogError(ex, "删除Institution失败,ID: {Id}", User.Value); return Json(new { IsComplete = false }); } }
2. 修复前端脚本逻辑
你的前端现在只要AJAX请求能正常返回(哪怕后端说删除失败),都会显示成功提示。需要改成根据后端返回的IsComplete值来显示对应的提示:
$(document).on("click", ".m-portlet__nav-link", function () { var myDataText = $(this).data('title'); var myDataId = $(this).data('id'); var myDataUrl = $(this).data('url') + "/" + myDataId; $(".modal-body .dataIdFromJs").text(myDataText); $("#saveChanges").click(function () { var User = myDataId; $.ajax({ dataType: "json", type: "POST", contentType: "application/json", url: '@Url.Action("Delete", "Institution")', data: JSON.stringify({ 'User': User }), success: function (data) { toastr.options = { "closeButton": true, "debug": false, "newestOnTop": false, "progressBar": false, "positionClass": "toast-top-right", "preventDuplicates": true, "onclick": null, "showDuration": "300", "hideDuration": "1000", "timeOut": "5000", "extendedTimeOut": "1000", "showEasing": "swing", "hideEasing": "linear", "showMethod": "fadeIn", "hideMethod": "fadeOut" }; // 根据后端返回的结果显示对应提示 if (data.IsComplete) { toastr.success("İşleminiz başarıyla tamamdlandı."); } else { toastr.error("Hata, tekrar deneyiniz!"); } }, error: function (data) { toastr.options = { "closeButton": true, "debug": false, "newestOnTop": false, "progressBar": false, "positionClass": "toast-top-right", "preventDuplicates": true, "onclick": null, "showDuration": "300", "hideDuration": "1000", "timeOut": "5000", "extendedTimeOut": "1000", "showEasing": "swing", "hideEasing": "linear", "showMethod": "fadeIn", "hideMethod": "fadeOut" }; toastr.error("Hata, tekrar deneyiniz!"); } }); }); });
这样修改后,不管是因为外键关联导致删除失败,还是记录不存在、其他异常情况,后端都会返回IsComplete=false,前端也会正确显示错误提示,不会再出现“删除失败却显示成功”的问题了。
内容的提问来源于stack exchange,提问作者user3717626
相关产品推荐
相关产品推荐

