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

