目 录
第I部分 介绍ASP.NET Core
第1章 ASP.NET Core上下文 3
1.1 了解ASP.NET Core 3
1.1.1 理解应用程序框架 3
1.1.2 理解实用程序框架 5
1.1.3 了解ASP.NET Core平台 5
1.2 理解本书 5
1.2.1 需要什么软件来完成示例? 6
1.2.2 需要什么平台来完成示例? 6
1.2.3 源代码下载 6
1.2.4 如果在执行这些示例时遇到问题,怎么办? 6
1.2.5 如果发现书中有错误,怎么办? 6
1.2.6 本书包含的内容 6
1.2.7 本书未包含的内容 7
1.2.8 如何联系作者? 7
1.2.9 如果你真的喜欢本书? 8
1.2.10 如果本书让人生气,想要抱怨该怎么办? 8
1.3 小结 8
第2章 入门 9
2.1 选择代码编辑器 9
2.1.1 安装Visual Studio 10
2.1.2 安装Visual Studio Code 12
2.2 创建ASP.NET Core项目 16
2.2.1 用Visual Studio打开项目 16
2.2.2 用Visual Studio Code打开项目 17
2.3 运行ASP.NET Core应用程序 18
2.3.1 理解端点 20
2.3.2 了解路由 21
2.3.3 理解HTML渲染 22
2.3.4 内容综述 26
2.4 小结 26
第3章 第一个ASP.NET Core应用程序 27
3.1 设置场景 27
3.2 创建项目 27
3.2.1 添加数据模型 29
3.2.2 创建第二个操作和视图 29
3.2.3 连接操作方法 31
3.2.4 构建表单 32
3.2.5 接收表单数据 34
3.2.6 添加Thanks视图 36
3.2.7 显示响应 37
3.2.8 添加验证 39
3.2.9 内容的样式化 44
3.3 小结 49
第4章 使用开发工具 51
4.1 创建ASP.NET Core项目 51
4.1.1 使用命令行创建项目 52
4.1.2 使用Visual Studio创建项目 54
4.2 向项目中添加代码和内容 57
4.3 构建和运行项目 59
4.3.1 使用命令行构建和运行项目 60
4.3.2 使用Visual Studio Code构建和运行项目 60
4.3.3 使用Visual Studio构建和运行项目 60
4.4 管理包 61
4.4.1管理NuGet包 61
4.4.2 管理工具包 62
4.4.3 管理客户端包 63
4.4.4 使用Visual Studio管理包 64
4.4.5 使用Visual Studio管理客户端包 65
4.5 调试项目 65
4.6 小结 66
第5章 C#的基本特点 67
5.1 准备工作 67
5.1.1 打开项目 68
5.1.2 启用MVC框架 68
5.1.3 创建应用程序组件 69
5.1.4 选择HTTP端口 70
5.1.5 运行示例应用程序 71
5.2 使用null条件运算符 71
5.2.1 链接null条件运算符 72
5.2.2 结合条件运算符和合并运算符 74
5.3 使用自动实现的属性 76
5.3.1 使用自动实现的属性初始化器 77
5.3.2 创建自动实现的只读属性 77
5.4 使用字符串插值 79
5.5 使用对象和集合初始化器 80
5.6 模式匹配 82
5.7 使用扩展方法 84
5.7.1 将扩展方法应用到接口 86
5.7.2 创建过滤扩展方法 88
5.8 使用lambda表达式 89
5.8.1 定义函数 91
5.8.2 使用lambda表达式方法和属性 94
5.9 使用类型推断和匿名类型 96
5.10 在接口中使用默认实现 98
5.11 使用异步方法 101
5.11.1 直接处理任务 101
5.11.2 应用async和await关键字 102
5.11.3 使用异步枚举 104
5.12 获取名称 107
5.13 小结 109
第6章 测试ASP.NET Core应用程序 111
6.1 准备工作 112
6.1.1 打开项目 112
6.1.2 选择HTTP端口 112
6.1.3 启用MVC框架 113
6.1.4 创建应用程序组件 113
6.1.5 运行示例应用程序 115
6.2 创建单元测试项目 115
6.3 编写和运行单元测试 116
6.3.1 使用Visual Studio Test Explorer运行测试 118
6.3.2 使用Visual Studio Code运行测试 119
6.3.3 从命令行运行测试 119
6.3.4 纠正单元测试 120
6.3.5 为单元测试隔离组件 121
6.3.6 使用模拟包 126
6.3.7 创建模拟对象 126
6.4 小结 128
第7章 SportsStore:一个真正的应用程序 129
7.1 创建项目 130
7.1.1 创建单元测试项目 130
7.1.2 创建应用程序项目文件夹 130
7.1.3 打开项目 131
7.1.4 准备应用程序服务和请求管道 132
7.1.5 配置Razor视图引擎 133
7.1.6 创建控制器和视图 134
7.1.7 启动数据模型 135
7.1.8 检查和运行应用程序 135
7.2 向应用程序添加数据 136
7.2.1 安装Entity Framework Core包 136
7.2.2 定义连接字符串 136
7.2.3 创建数据库上下文类 137
7.2.4 配置Entity Framework Core 138
7.2.5 创建存储库 139
7.2.6 创建数据库迁移 141
7.2.7 创建种子数据 142
7.3 显示产品列表 145
7.3.1 准备控制器 145
7.3.2 更新视图 147
7.3.3 运行应用程序 148
7.4 添加分页 148
7.4.1 显示页面的链接 150
7.4.2 改善URL 158
7.5 内容的样式化 160
7.5.1 安装Bootstrap包 161
7.5.2 应用Bootstrap风格 161
7.5.3 创建部分视图 164
7.6 小结 165
第8章 SportsStore:导航和购物车 167
8.1 添加导航控件 167
8.1.1 筛选产品列表 167
8.1.2 优化URL方案 172
8.1.3 构建一个类别导航菜单 176
8.1.4 更正页数 183
8.2 构建购物车 186
8.2.1 配置Razor Pages 186
8.2.2 创建Razor Pages 189
8.2.3 创建Add To Cart按钮 189
8.2.4 启用会话 191
8.2.5 实现购物车功能 193
8.3 小结 203
第9章 SportsStore:完成购物车 205
9.1 使用服务改进Cart模型 205
9.1.1 创建支持存储的Cart类 205
9.1.2 注册服务 207
9.1.3 简化购物车Razor Pages 209
9.2 完成购物车的功能 211
9.2.1 从购物车中删除商品 211
9.2.2 添加购物车摘要小部件 214
9.3 提交订单 217
9.3.1 创建模型类 217
9.3.2 添加付款过程 218
9.3.3 创建控制器和视图 218
9.3.4 实现订单处理 221
9.3.5 完成订单控制器 224
9.3.6 显示验证错误 227
9.3.7 显示摘要页面 229
9.4 小结 230
第10章 SportsStore:管理 231
10.1 准备Blazor服务器 231
10.1.1 创建导入文件 233
10.1.2 创建Startup Razor Pages 233
10.1.3 创建路由和布局组件 234
10.1.4 创建Razor组件 235
10.1.5 检查Blazor的设置 235
10.2 管理订单 236
10.2.1 增强模型 236
10.2.2 向管理员显示订单 238
10.3 添加目录管理 241
10.3.1 扩展存储库 241
10.3.2 将验证属性应用到数据模型 242
10.3.3 创建列表组件 243
10.3.4 创建细节组件 245
10.3.5 创建编辑器组件 246
10.3.6 删除产品 249
10.4 小结 251
第11章 SportsStore:安全与部署 253
11.1 确保管理功能的安全 253
11.1.1 创建身份数据库 253
11.1.2 添加常规的管理特性 259
11.1.3 应用基本授权策略 260
11.1.4 创建账户控制器和视图 262
11.1.5 测试安全策略 266
11.2 准备进行部署 266
11.2.1 配置错误的处理 266
11.2.2 创建生产配置设置 268
11.2.3 创建Docker映像 268
11.2.4 运行容器化应用程序 271
11.3 小结 272
第II部分 ASP.NET Core平台
第12章 了解ASP.NET Core平台 275
12.1 准备工作 276
12.2 了解ASP.NET Core平台 277
12.2.1 理解中间件和请求管道 277
12.2.2 了解服务 277
12.3 了解ASP.NET Core项目 278
12.3.1 理解入口点 279
12.3.2 理解Startup类 280
12.3.3 理解项目文件 281
12.4 创建自定义中间件 283
12.4.1 使用类定义中间件 286
12.4.2 理解返回管道路径 289
12.4.3 请求管道短路 290
12.4.4 创建管道分支 292
12.4.5 创建终端中间件 294
12.5 配置中间件 297
12.6 小结 301
第13章 使用URL路由 303
13.1 准备工作 304
13.1.1 理解URL路由 307
13.1.2 添加路由中间件、定义端点 307
13.1.3 理解URL模式 310
13.1.4 在URL模式中使用段变量 311
13.1.5 从路由中生成URL 315
13.2 管理URL的匹配 319
13.2.1 从一个URL段匹配多个值 319
13.2.2 为段变量使用默认值 320
13.2.3 在URL模式中使用可选段 321
13.2.4 使用catchall段变量 323
13.2.5 约束段的匹配 324
13.2.6 定义回退路由 327
13.3 高级路由功能 328
13.3.1 创建自定义约束 328
13.3.2 避免模棱两可的路由异常 330
13.3.3 访问中间件组件中的端点 332
13.4 小结 334
第14章 使用依赖注入 335
14.1 为本章做准备 336
14.1.1 创建中间件组件和端点 337
14.1.2 配置请求管道 338
14.2 理解服务位置和紧密耦合 339
14.2.1 理解服务位置问题 340
14.2.2 理解紧密耦合组件的问题 342
14.3 使用依赖注入 344
14.3.1 在中间件类中使用服务 346
14.3.2 在端点中使用服务 347
14.4 使用服务生命周期 352
14.4.1 创建临时服务 353
14.4.2 避免临时服务重用陷阱 354
14.4.3 使用有作用域的服务 357
14.5 其他依赖注入特性 363
14.5.1 创建依赖关系链 363
14.5.2 访问ConfigureServices方法中的服务 365
14.5.3 使用服务工厂函数 366
14.5.4 创建具有多个实现的服务 367
14.5.5 在服务中使用未绑定类型 370
14.6 小结 372
第15章 使用平台特性(第1部分) 373
15.1 准备工作 374
15.2 使用配置服务 375
15.2.1 理解特定于环境的配置文件 376
15.2.2 访问配置设置 377
15.2.3 在服务中使用配置数据 378
15.2.4 理解启动设置文件 381
15.2.5 确定启动类中的环境 387
15.2.6 存储用户的秘密 388
15.3 使用日志服务 392
15.3.1 生成日志消息 392
15.3.2 配置最小日志级别 395
15.4 使用静态内容和客户端包 397
15.4.1 添加静态内容中间件 397
15.4.2 使用客户端包 401
15.5 小结 404
第16章 使用平台特性(第2部分) 405
16.1 准备工作 405
16.2 使用cookie 406
16.2.1 启用cookie consent检查 409
16.2.2 管理cookie consent 411
16.3 使用会话 413
16.3.1 配置会话服务和中间件 413
16.3.2 使用会话数据 415
16.4 使用HTTPS连接 417
16.4.1 启用HTTP连接 417
16.4.2 检测HTTPS请求 419
16.4.3 执行HTTPS请求 420
16.4.4 启用HTTP严格传输安全性 422
16.5 处理异常和错误 425
16.5.1 返回HTML错误响应 427
16.5.2 富集状态码响应 429
16.6 使用Host头过滤请求 431
16.7 小结 433
第17章 处理数据 435
17.1 准备工作 436
17.2 缓存数据 438
17.2.1 缓存数据值 440
17.2.2 使用共享和持久的数据缓存 443
17.3 缓存响应 447
17.4 使用Entity Framework Core 449
17.4.1 安装Entity Framework Core 450
17.4.2 创建数据模型 451
17.4.3 配置数据库服务 452
17.4.4 创建和应用数据库迁移 453
17.4.5 播种数据库 454
17.4.6 在端点中使用数据 457
17.5 小结 460
第III部分 ASP.NET Core应用程序
第18章 创建示例项目 463
18.1 创建项目 463
18.2 添加数据模型 464
18.2.1 向项目中添加NuGet包 464
18.2.2 创建数据模型 464
18.2.3 准备种子数据 466
18.2.4 配置Entity Framework Core服务和中间件 467
18.2.5 创建和应用迁移 469
18.3 添加CSS框架 469
18.4 配置请求管道 470
18.5 运行示例应用程序 472
18.6 小结 472
第19章 创建RESTful Web服务 473
19.1 准备工作 474
19.2 理解RESTful Web服务 474
19.2.1 理解请求URL和方法 474
19.2.2 理解JSON 475
19.3 使用自定义端点创建Web服务 475
19.4 使用控制器创建Web服务 478
19.4.1 启用MVC框架 479
19.4.2 创建控制器 480
19.5 改进Web服务 489
19.5.1 使用异步操作 490
19.5.2 防止过度绑定 491
19.5.3 使用操作的结果 493
19.5.4 验证数据 499
19.5.5 应用API控制器属性 501
19.5.6 忽略Null属性 502
19.6 小结 505
第20章 高级Web服务特性 507
20.1 准备工作 507
20.1.1 删除数据库 508
20.1.2 运行示例应用程序 508
20.2 处理相关数据 509
20.3 支持HTTP Patch方法 512
20.3.1 理解JSON Patch 512
20.3.2 安装和配置JSON Patch包 513
20.3.3 定义操作方法 514
20.4 理解内容的格式化 515
20.4.1 理解默认的内容策略 515
20.4.2 理解内容协商 517
20.4.3 指定操作结果格式 521
20.4.4 在URL中请求格式 522
20.4.5 限制操作方法接收的格式 524
20.5 记录和探索Web服务 525
20.5.1 解决操作冲突 526
20.5.2 安装和配置Swashbuckle包 527
20.5.3 微调API描述 529
20.6 小结 533
第21章 使用控制器和视图
(第1部分) 535
21.1 准备工作 536
21.1.1 删除数据库 537
21.1.2 运行示例应用程序 537
21.2 开始使用视图 538
21.2.1 配置应用程序 538
21.2.2 创建HTML控制器 539
21.2.3 创建Razor视图 542
21.2.4 通过名称选择视图 544
21.3 使用Razor视图 548
21.4 理解Razor语法 556
21.4.1 理解指令 556
21.4.2 理解内容表达式 557
21.4.3 设置元素内容 557
21.4.4 设置特性值 558
21.4.5 使用条件表达式 559
21.4.6 枚举序列 563
21.4.7 使用Razor代码块 565
21.5 小结 566
第22章 使用控制器和视图(第2部分) 567
22.1 准备工作 567
22.1.1 删除数据库 569
22.1.2 运行示例应用程序 569
22.2 使用ViewBag 570
22.3 使用临时数据 572
22.4 使用布局 574
22.4.1 使用ViewBag配置布局 576
22.4.2 使用ViewStart文件 578
22.4.3 覆盖默认布局 579
22.4.4 使用布局节 583
22.5 使用分部视图 590
22.5.1 启用分部视图 590
22.5.2 创建分部视图 590
22.5.3 应用分部视图 591
22.6 理解内容编码 594
22.6.1 理解HTML编码 594
22.6.2 理解JSON编码 596
22.7 小结 597
第23章 使用Razor Pages 599
23.1 准备工作 600
23.2 理解Razor Pages 601
23.2.1 配置Razor Pages 601
23.2.2 创建Razor Pages 603
23.3 理解Razor Pages的路由 607
23.3.1 在Razor Pages中指定路由模式 609
23.3.2 为Razor Pages添加路由 610
23.4 理解页面模型类 612
23.4.1 使用代码隐藏类文件 613
23.4.2 理解Razor Pages的操作结果 615
23.4.3 处理多个HTTP方法 619
23.4.4 选择处理程序方法 621
23.5 理解Razor Pages视图 623
23.5.1 为Razor Pages创建布局 623
23.5.2 在Razor Pages中使用分部视图 625
23.5.3 创建没有页面模型的Razor Pages 627
23.6 小结 628
第24章 使用视图组件 629
24.1 准备工作 629
24.1.1 删除数据库 632
24.1.2 运行示例应用程序 632
24.2 理解视图组件 633
24.3 创建和使用视图组件 633
24.4 理解视图组件的结果 637
24.4.1 返回一个分部视图 638
24.4.2 返回HTML片段 641
24.5 获取上下文数据 643
24.5.1 使用实参提供父视图的上下文 645
24.5.2 创建异步视图组件 648
24.6 创建视图组件类 649
24.7 小结 655
第25章 使用标签助手 657
25.1 准备工作 658
25.1.1 删除数据库 660
25.1.2 运行示例应用程序 660
25.2 创建标签助手 660
25.2.1 定义标签助手类 661
25.2.2 注册标签助手 663
25.2.3 使用标签助手 664
25.2.4 缩小标签助手的范围 665
25.2.5 扩展标签助手的范围 666
25.3 高级标签助手功能 668
25.3.1 创建快捷元素 668
25.3.2 以编程方式创建元素 671
25.3.3 追加、附加内容和元素 672
25.3.4 获取视图上下文数据 675
25.3.5 使用模型表达式 678
25.3.6 标签助手之间的协调 682
25.3.7 抑制输出元素 684
25.4 使用标签助手组件 686
25.4.1 创建标签助手组件 686
25.4.2 展开标签助手的元素选择 688
25.5 小结 690
第26章 使用内置的标签助手 691
26.1 准备工作 691
26.1.1 添加图像文件 693
26.1.2 安装客户端包 694
26.1.3 删除数据库 694
26.1.4 运行示例应用程序 694
26.2 启用内置的标签助手 695
26.3 改变锚元素 695
26.4 使用JavaScript和CSS标签助手 699
26.4.1 管理JavaScript文件 699
26.4.2 管理CSS样式表 706
26.5 处理图像元素 709
26.6 使用数据缓存 710
26.6.1 设置缓存到期时间 712
26.6.2 设置固定的过期点 713
26.6.3 设置最后使用的有效期 713
26.6.4 使用缓存的变化 714
26.7 使用宿主环境标签助手 715
26.8 小结 716
第27章 使用表单标签助手 717
27.1 准备工作 717
27.1.1 删除数据库 719
27.1.2 运行示例应用程序 719
27.2 理解表单处理模式 720
27.2.1 创建控制器来处理表单 721
27.2.2 创建Razor Pages来处理表单 723
27.3 使用标签助手改进HTML表单 725
27.3.1 使用表单元素 725
27.3.2 改变表单按钮 727
27.4 处理input元素 728
27.4.1 转换input元素的类型属性 730
27.4.2 格式化input元素值 732
27.4.3 在input元素中显示相关数据的值 735
27.5 使用label元素 739
27.6 使用select和option元素 741
27.7 处理文本区域 745
27.8 使用防伪功能 746
27.8.1 在控制器中启用防伪功能 747
27.8.2 在Razor Pages中启用防伪功能 749
27.8.3 使用JavaScript客户端防伪令牌 750
27.9 小结 753
第28章 使用模型绑定 755
28.1 准备工作 756
28.1.1 删除数据库 757
28.1.2 运行示例应用程序 757
28.2 理解模型绑定 757
28.3 绑定简单数据类型 759
28.3.1 绑定Razor Pages中的简单数据类型 760
28.3.2 理解默认绑定值 762
28.4 绑定复杂类型 764
28.4.1 绑定到属性 766
28.4.2 绑定嵌套的复杂类型 768
28.4.3 选择性的绑定属性 772
28.5 绑定到数组和集合 775
28.5.1 绑定到数组 775
28.5.2 绑定到简单集合 778
28.5.3 绑定到字典 780
28.5.4 绑定到复杂类型的集合 781
28.6 指定模型绑定源 784
28.6.1 选择属性的绑定源 786
28.6.2 使用标头进行模型绑定 787
28.6.3 使用请求体作为绑定源 788
28.7 手动模式绑定 789
28.8 小结 791
第29章 使用模型验证 793
29.1 准备工作 794
29.2 删除数据库 795
29.3 运行示例应用程序 795
29.4 理解对模型验证的需要 796
29.5 显式验证控制器中的数据 796
29.5.1 向用户显示验证错误 799
29.5.2 显示验证消息 802
29.5.3 显示属性级的验证消息 806
29.5.4 显示模型级消息 807
29.6 显式验证Razor Pages中的数据 810
29.7 使用元数据指定验证规则 813
29.8 执行客户端验证 821
29.9 执行远程验证 823
29.10 小结 828
第30章 使用过滤器 829
30.1 准备工作 829
30.1.1 启用HTTPS连接 831
30.1.2 删除数据库 832
30.1.3 运行示例应用程序 833
30.2 使用过滤器 833
30.3 理解过滤器 838
30.4 创建自定义过滤器 839
30.4.1 理解授权过滤器 840
30.4.2 理解资源过滤器 842
30.4.3 理解操作过滤器 846
30.4.4 理解页面过滤器 850
30.4.5 理解结果过滤器 855
30.4.6 理解异常过滤器 859
30.4.7 创建异常过滤器 860
30.5 管理过滤器生命周期 863
30.5.1 创建过滤器工厂 865
30.5.2 使用依赖注入范围来管理
过滤器的生命周期 866
30.6 创建全局过滤器 868
30.7 理解和改变过滤器的顺序 870
30.8 小结 874
第31章 创建表单应用程序 875
31.1 准备工作 875
31.1.1 删除数据库 878
31.1.2 运行示例应用程序 878
31.2 创建MVC表单应用程序 879
31.2.1 准备视图模型和视图 879
31.2.2 读取数据 881
31.2.3 创建数据 883
31.2.4 编辑数据 887
31.2.5 删除数据 890
31.3 创建Razor Pages表单应用程序 892
31.3.1 创建常用功能 893
31.3.2 为CRUD操作定义页面 896
31.4 创建新的相关数据对象 899
31.4.1 在同一请求中提供相关数据 900
31.4.2 创建新数据 903
31.5 小结 908
第IV部分 高级ASP.NET Core功能
第32章 创建示例项目 911
32.1 创建项目 911
32.2 添加数据模型 912
32.2.1 准备种子数据 914
32.2.2 配置Entity Framework Core
服务和中间件 916
32.2.3 创建和应用迁移 917
32.3 添加引导CSS框架 918
32.4 配置服务和中间件 918
32.5 创建控制器和视图 919
32.6 创建Razor Pages 922
32.7 运行示例应用程序 924
32.8 小结 925
第33章 使用Blazor服务器
(第1部分) 927
33.1 准备工作 928
33.2 理解Blazor服务器 928
33.2.1 理解Blazor服务器的优势 929
33.2.2 理解Blazor服务器的缺点 930
33.2.3 在Blazor服务器和Angular/React/Vue.js之间选择 930
33.3 从Blazor开始 930
33.3.1 为Blazor服务器配置ASP.NET Core 930
33.3.2 创建Blazor组件 933
33.4 理解Razor组件的基本特性 938
33.4.1 理解Blazor事件和数据绑定 938
33.4.2 使用数据绑定 946
33.5 使用类文件定义组件 951
33.5.1 使用代码隐藏类 951
33.5.2 定义Razor组件类 953
33.6 小结 954
第34章 使用Blazor服务器
(第2部分) 955
34.1 准备工作 955
34.2 结合组件 956
34.2.1 利用属性配置组件 958
34.2.2 创建自定义事件和绑定 963
34.3 在组件中显示子内容 968
34.3.1 创建模板组件 970
34.3.2 在模板组件中使用泛型类型参数 972
34.3.3 级联参数 978
34.4 处理错误 981
34.4.1 处理连接错误 981
34.4.2 处理未捕获的应用程序错误 984
34.5 小结 986
第35章 高级Blazor特性 987
35.1 准备工作 988
35.2 使用组件的路由 988
35.2.1 准备Blazor页 989
35.2.2 向组件添加路由 990
35.2.3 在路由组件之间导航 993
35.2.4 接收路由数据 996
35.2.5 使用布局定义公共内容 998
35.3 理解组件生命周期方法 1000
35.4 管理组件的交互 1005
35.4.1 使用子组件的引用 1005
35.4.2 与来自其他代码的组件交互 1008
35.4.3 使用JavaScript与组件交互 1012
35.5 小结 1022
第36章 Blazor表单和数据 1023
36.1 准备工作 1023
36.2 使用Blazor表单组件 1027
36.2.1 创建自定义表单组件 1029
36.2.2 验证表单数据 1033
36.2.3 处理表单事件 1036
36.3 使用Entity Framework Core与Blazor 1038
36.3.1 理解Entity Framework Core上下文范围问题 1039
36.3.2 理解重复查询问题 1043
36.4 执行创建、读取、更新和删除操作 1049
36.4.1 创建List组件 1049
36.4.2 创建Details组件 1050
36.4.3 创建Editor组件 1052
36.5 扩展Blazor表单特性 1054
36.5.1 创建自定义验证约束 1055
36.5.2 创建只验证提交按钮组件 1058
36.6 小结 1060
第37章 使用Blazor WebAssembly 1061
37.1 准备工作 1062
37.2 设置Blazor WebAssembly 1064
37.2.1 创建共享项目 1064
37.2.2 创建Blazor WebAssembly项目 1065
37.2.3 准备ASP.NET Core项目 1065
37.2.4 添加解决方案引用 1066
37.2.5 打开项目 1066
37.2.6 完成Blazor WebAssembly配置 1067
37.2.7 测试占位符组件 1069
37.3 创建Blazor WebAssembly组件 1070
37.3.1 导入数据模型名称空间 1070
37.3.2 创建组件 1070
37.3.3 创建布局 1074
37.3.4 定义CSS样式 1075
37.4 完成Blazor WebAssembly表单应用程序 1076
37.4.1 创建Details组件 1076
37.4.2 创建Editor组件 1077
37.5 小结 1080
第38章 使用ASP.NET Core Identity 1081
38.1 准备工作 1082
38.2 为ASP.NET Core Identity准备项目 1083
38.2.1 准备ASP.NET Core Identity数据库 1083
38.2.2 配置数据库连接字符串 1083
38.2.3 配置应用程序 1084
38.2.4 创建和应用身份数据库迁移 1086
38.3 创建用户管理工具 1086
38.3.1 准备用户管理工具 1087
38.3.2 枚举用户账户 1088
38.3.3 创建用户 1090
38.3.4 编辑用户 1097
38.3.5 删除用户 1099
38.4 创建角色管理工具 1100
38.4.1 为角色管理工具做准备 1101
38.4.2 枚举和删除角色 1102
38.4.3 创建角色 1103
38.4.4 分配角色从属关系 1104
38.5 小结 1107
第39章 应用ASP.NET Core Identity 1109
39.1 验证用户的身份 1111
39.1.1 创建登录特性 1111
39.1.2 检查ASP.NET Core Identity cookie 1113
39.1.3 创建退出页面 1114
39.1.4 测试身份验证特性 1115
39.1.5 启用身份验证中间件 1116
39.2 对授权端点的访问 1118
39.2.1 应用授权属性 1118
39.2.2 启用授权中间件 1119
39.2.3 创建被拒绝访问的端点 1120
39.2.4 创建种子数据 1120
39.2.5 测试身份验证序列 1123
39.3 授权访问Blazor应用程序 1124
39.3.1 在Blazor组件中执行授权 1125
39.3.2 向授权用户显示内容 1127
39.4 对Web服务进行身份验证和授权 1129
39.4.1 构建简单的JavaScript客户端 1132
39.4.2 限制对Web服务的访问 1134
39.4.3 使用cookie验证 1135
39.4.4 使用令牌认证 1138
39.4.5 创建令牌 1139
39.4.6 用令牌验证 1141
39.4.7 使用令牌限制访问 1144
39.4.8 使用令牌请求数据 1145
39.5 小结 1147