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

如何在Abp UserFriendlyException中实现确认触发DeleteALL操作

嘿,我来帮你搞定这个弹窗确认触发批量删除的逻辑问题!

首先咱们先梳理下你的核心需求:当现有删除条件不满足时,弹出确认弹窗,用户点击「确认」后执行_contactRepository.DeleteALL(contact),点击「取消」则终止操作。下面分不同场景给你具体实现方案:

核心思路

原来的代码直接抛出异常的方式没法关联用户的弹窗操作,我们需要把「判断是否需要确认」和「执行对应删除逻辑」拆解开,让弹窗的确认事件直接触发批量删除方法。


场景1:Web应用(后端+前端配合)

第一步:调整后端接口逻辑

不再直接抛异常,而是返回「需要用户确认」的标记,同时新增批量删除的接口:

// 原有单个删除接口
[HttpDelete("{id}")]
public IActionResult DeleteSingleContact(int id)
{
    var input = GetContactInput(id); // 假设你获取输入的方法
    var quotation = _quotationRepository.GetByContactId(id);
    var proposal = _proposalRepository.GetByContactId(id);
    var contact = _contactRepository.GetById(id);

    // 简化原有的重复判断逻辑
    if (input.Id > 0 && quotation.Count == 0 && proposal.Count == 0)
    {
        _contactRepository.Delete(contact);
        return Ok(new { Success = true, Message = "Contact deleted successfully" });
    }
    else
    {
        // 返回需要确认的信号,而不是直接抛异常
        return BadRequest(new { NeedConfirmation = true, Message = "Do you want to delete everything?" });
    }
}

// 新增批量删除接口
[HttpDelete("delete-all/{id}")]
public IActionResult DeleteAllRelatedData(int id)
{
    var contact = _contactRepository.GetById(id);
    _contactRepository.DeleteALL(contact);
    return Ok(new { Success = true, Message = "All related data deleted successfully" });
}

第二步:前端绑定弹窗确认事件

这里以原生JS和React+Ant Design为例:

原生JS实现
async function handleDeleteContact(id) {
    try {
        const deleteResponse = await fetch(`/api/contacts/${id}`, { method: 'DELETE' });
        const result = await deleteResponse.json();

        if (!deleteResponse.ok) {
            if (result.NeedConfirmation) {
                // 弹出原生确认框
                const userConfirmed = confirm(result.Message);
                if (userConfirmed) {
                    // 用户确认后调用批量删除接口
                    await fetch(`/api/contacts/delete-all/${id}`, { method: 'DELETE' });
                    alert("All data deleted successfully");
                    // 这里可以刷新页面或更新列表
                } else {
                    alert("Delete cancelled");
                }
            }
        } else {
            alert(result.Message);
            // 刷新页面或更新列表
        }
    } catch (err) {
        console.error("Delete failed:", err);
    }
}
React+Ant Design模态框实现
import { Modal } from 'antd';

const handleDeleteContact = async (id) => {
    try {
        const deleteResponse = await fetch(`/api/contacts/${id}`, { method: 'DELETE' });
        const result = await deleteResponse.json();

        if (!deleteResponse.ok) {
            if (result.NeedConfirmation) {
                Modal.confirm({
                    title: 'Warning',
                    content: result.Message,
                    onOk: async () => {
                        await fetch(`/api/contacts/delete-all/${id}`, { method: 'DELETE' });
                        alert("All related data deleted successfully");
                        // 更新组件状态或刷新列表
                    },
                    onCancel: () => {
                        alert("Delete cancelled");
                    }
                });
            }
        } else {
            alert(result.Message);
            // 更新组件状态或刷新列表
        }
    } catch (err) {
        console.error("Delete failed:", err);
    }
};

场景2:桌面应用(比如WPF/WinForms)

如果是桌面端,直接在业务逻辑里调用系统弹窗即可:

public void DeleteContact(InputModel input)
{
    var quotation = _quotationRepository.GetByContactId(input.Id);
    var proposal = _proposalRepository.GetByContactId(input.Id);
    var contact = _contactRepository.GetById(input.Id);

    if (input.Id > 0 && quotation.Count == 0 && proposal.Count == 0)
    {
        _contactRepository.Delete(contact);
        MessageBox.Show("Contact deleted successfully");
    }
    else
    {
        // 弹出系统确认框
        var confirmResult = MessageBox.Show(
            "Do you want to delete everything?", 
            "Warning", 
            MessageBoxButtons.YesNo, 
            MessageBoxIcon.Warning
        );

        if (confirmResult == DialogResult.Yes)
        {
            _contactRepository.DeleteALL(contact);
            MessageBox.Show("All related data deleted successfully");
        }
        else
        {
            MessageBox.Show("Delete cancelled");
        }
    }
}

核心逻辑就是:让弹窗的「确认」事件直接触发DeleteALL方法的调用,根据你的技术栈选择对应的实现方式就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:35:20