# 删除产品 删除产品与创建或编辑操作相比,非常简单,因为删除我们不需要构建表单。 首先,在`IProductAppService`接口中添加一个新方法: ``` Task DeleteAsync(Guid id); ``` 然后,在`ProductAppService`类中实现它: ``` public async Task DeleteAsync(Guid id) {     await _productRepository.DeleteAsync(id); } ``` 现在向产品列表添加一个新删除按钮。打开`Index.cshtml.js`,并在**Edit**操作之后添加以下定义(在`rowAction.items`数组中): ``` {     text: l('Delete'),     confirmMessage: function (data) {         return l('ProductDeletionConfirmationMessage',data.record.name);     },     action: function (data) {         productManagement.products.product             .delete(data.record.id)             .then(function() {                 abp.notify.info(l('SuccessfullyDeleted'));                 dataTable.ajax.reload();             });     } } ``` `confirmMessage`用于在删除之前获得用户确认。`productManagement.products.product.delete`函数由 ABP 框架动态创建。通过这种方式,可以直接在 JS 代码中调用服务器端方法。我们只需传递当前记录的 ID。`then`函数传递一个回调函数,用于删除之后的操作。最后,我们使用`abp.notify.info`通知用户,最后刷新数据表。 我们使用了一些本地化文本,因此我们需要在本地化`en.json`文件中添加以下代码: ``` "ProductDeletionConfirmationMessage": "Are you sure to delete this book: {0}", "SuccessfullyDeleted": "Successfully deleted!" ``` 再次访问 web 查看结果: ![](https://img.kancloud.cn/ce/da/ceda21a5015af9919a9287c84d6035c7_1116x454.png) 因为现在有两个操作按钮,所以**编辑**按钮会自动变成一个下拉选项。当您单击**删除**操作时,您会收到一条确认消息: ![](https://img.kancloud.cn/5b/ef/5befd88e4d78b6a94deae355680e2e28_1125x528.png) 如果你点击在**是**按钮上,您将在页面上看到一条通知,并且数据表将被刷新。 实施产品删除非常简单。ABP 的内置功能帮助我们实现了常见的模式,例如客户端到服务器的通信、确认对话框和 UI 通知。 请注意,`Product`实体派生于`FullAuditedAggregateRoot`,所以它使用了软删除。删除产品后检查数据库,您会看到它并没有真正删除,但是`IsDeleted`字段已经设置为`true`(逻辑删除不是物理删除)。下次查询商品时,已删除的商品会自动过滤掉,不包含在查询结果中。这是由 ABP 框架的数据过滤系统完成的。 ## 概括 在本章中,我们创建了一个完整的 CRUD 页面。我们介绍了解决方案中的所有层,并了解了ABP 的程序开发的基本方法。 同时,也向您介绍了许多不同的概念,例如实体、存储库、数据库映射和迁移、自动化测试、API 控制器、动态 JavaScript 代理、对象映射、软删除等。ABP 是一个全栈应用程序框架,可帮助您通过最佳实践来实现这些概念。它提供了必要的基础设施,使您的日常开发更容易。 此时您可能不了解所有细节。其余章节会深入研究这些概念并展示它们的细节和不同的用例。 以上的示例相对简单,它不包含任何重要的业务逻辑,因为我引入了许多概念目的是想让大家对这些基础概念有个初步的理解而不是业务复杂性。在此示例中,我忽略了授权。授权将在\[*第 7 章*\] *探索横切关注点*”中进行说明。 在一本书中演示一个具有现实复杂性的示例并不容易。然而,我已经为本书的读者准备了一个完整的参考应用程序,它具有真实世界的特点和复杂性。参考程序是开源的,可在 GitHub 上获得。 下一章将介绍该参考程序并展示参考解决方案的功能、分层和代码结构。其余章节会经常引用该示例的源代码。