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

存在关联时删除数据失败却返回true,如何修正返回逻辑?

问题分析与解决方案

你遇到的问题其实有两个核心点:

  1. 后端代码仅在发生异常时返回false,但部分删除失败的场景可能不会抛出异常(比如要删除的记录已不存在,或数据库约束导致删除未生效但未触发异常);
  2. 前端脚本不管后端返回的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:59:14