# 删除产品
删除产品与创建或编辑操作相比,非常简单,因为删除我们不需要构建表单。
首先,在`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 上获得。
下一章将介绍该参考程序并展示参考解决方案的功能、分层和代码结构。其余章节会经常引用该示例的源代码。
- 前言
- 第一部分
- 第1章 现代软件开发和 ABP 框架
- 企业级 Web 开发的挑战
- ABP框架的能力清单
- 第2章 ABP框架入门
- 安装 ABP CLI
- 创建新解决方案
- 运行解决方案
- 探索预构建模块
- 第3章 逐步开发开发ABP应用
- 创建解决方案
- 定义领域对象
- EFCore和数据库映射
- 定义应用服务
- 测试产品
- 产品列表
- 创建产品
- 编辑产品
- 删除产品
- 第4章 探索 EventHub解决方案
- 应用介绍
- 架构探索
- 方案运行
- 第二部分
- 第5章 探索ABP基础架构
- 了解模块化
- 使用依赖注入系统
- 配置应用程序
- 实现选项模式
- 日志系统
- 第6章 数据访问基础架构
- 定义实体
- 定义仓储库
- EF Core集成
- 了解 UoW
- 第7章 探索横切关注点
- 认证授权
- 用户验证
- 异常处理
- 第8章 体验 ABP 的功能和服务
- 获取当前用户
- 使用数据过滤
- 控制审计日志
- 缓存数据
- 本地化用户界面
- 第三部分
- 第9章 理解领域驱动设计
- 介绍 DDD
- 构建基于 DDD 的 解决方案
- 处理多个应用程序
- 了解执行流程
- DDD的通用原则
- 第10章 领域层 Domain
- 领域事件案例分析
- 聚合和实体的设计原则和实践
- 实现领域服务
- 落地存储库
- 构建规约(Specification)
- 领域事件
- 第11章 应用层 Application
- 落地应用服务
- 设计 DTO
- 理解各层的职责
- 第四部分
- 第12章 MVC/Razor 页面
- 主题系统
- 绑定和压缩
- 导航菜单
- Bootstrap标签助手
- 创建表单并验证
- 使用模态窗口
- 使用JS API
- 调用HTTP API
- 第13章 Blazor WebAssembly UI
- 什么是Blazor
- ABP Blazor UI
- 验证用户身份
- 理解主题系统
- 使用菜单
- 使用基本服务
- 使用UI服务
- 消费HTTP API
- 使用全局脚本和样式
- 第14章 HTTP API 和实时服务
- 构建HTTP API
- 使用HTTP API
- 使用SignalR
- 第五部分
- 第15章 落地模块化
- 理解模块化
- 构建支付模块
- 安装模块
- 第16章 实现多租户
- 理解多租户
- 多租户基础设施
- 使用功能系统
- 何时使用多租户
- 第17章 构建自动化测试
- 了解ABP测试基础设施
- 构建单元测试
- 构建集成测试