第1部分 ASP.NET MVC3简介 2
第1章 设计思路 2
1.1 Web开发简史 2
1.1.1 传统的ASP.NET Web Form 3
1.1.2 ASP.NET Web Form表单的问题在哪里 3
1.2 当今的Web开发 4
1.2.1 Web标准与REST 4
1.2.2 敏捷与测试驱动开发 5
1.2.3 Ruby on Rails 5
1.2.4 Sinatra 6
1.2.5 Node.js 6
1.3 ASP.NET MVC的主要优势 7
1.3.1 MVC架构 7
1.3.2 可扩展性 7
1.3.3 在HTML及HTTP上的严密控制 8
1.3.4 可测试性 8
1.3.5 强大的路由系统 9
1.3.6 建立在ASP.NET平台的精华之上 9
1.3.7 现代API 10
1.3.8 ASP.NET MVC是开源的 10
1.4 谁该使用ASP.NET MVC 10
1.4.1 与ASP.NET Web Form的比较 11
1.4.2 从 Web Form迁移到MVC 11
1.4.3 与Ruby on Rails的比较 11
1.4.4 与MonoRail的比较 12
1.5 ASP.NET MVC 3的新特性 12
1.6 小结 12
第2章 准备工作 13
2.1 准备工作站 13
2.1.1 安装Visual Studio 2010 13
2.1.2 安装基本软件 14
2.1.3 安装可选组件 15
2.1.4 MVC框架源代码 16
2.1.5 IIS Express 16
2.1.6 SQL Server 2008 R2 Management Studio Express 16
2.2 准备服务器 16
2.2.1 启用Web服务器角色 17
2.2.2 安装其他组件 18
2.2.3 设置Web部署 19
2.2.4 获取更多信息 21
2.3 小结 21
第3章 第一个MVC应用程序 22
3.1 创建ASP.NET MVC新项目 22
3.1.1 添加第一个控制器 24
3.1.2 理解路由 25
3.2 渲染Web页面 26
3.2.1 创建并渲染一个视图 26
3.2.2 添加动态输出 28
3.3 创建一个简单的数据录入应用程序 29
3.3.1 设置场景 30
3.3.2 设计一个数据模型 31
3.3.3 添加模型类 31
3.3.4 链接动作方法 31
3.3.5 创建动作方法 32
3.3.6 添加一个强类型视图 33
3.3.7 建立表单 34
3.3.8 处理表单 36
3.3.9 使用模型绑定 37
3.3.10 渲染其他视图 38
3.3.11 添加验证 39
3.3.12 高亮无效字段 41
3.3.13 完成示例 42
3.4 小结 43
第4章 MVC模式 44
4.1 MVC简史 44
4.2 理解MVC模式 44
4.2.1 理解域模型 45
4.2.2 MVC的ASP.NET实现 46
4.2.3 MVC与其他模式比较 46
4.2.4 理解“智能UI”模式 46
4.2.5 理解MVC的变异 48
4.3 运用域驱动开发(DDD) 49
4.3.1 模拟一个例子域 50
4.3.2 通用语言 50
4.3.3 聚合与简化 51
4.3.4 定义存储库 53
4.4 建立松耦合组件 53
4.4.1 使用依赖性注入 54
4.4.2 一个MVC专用的依赖性注入示例 56
4.4.3 使用依赖性注入容器 57
4.5 自动测试初步 57
4.5.1 理解单元测试 58
4.5.2 使用测试驱动开发及“红——绿——重构”工作流 60
4.5.3 理解集成测试 65
4.6 小结 66
第5章 基本语言特性 67
5.1 C#基本特性 67
5.1.1 使用自动实现的属性 67
5.1.2 使用对象与集合初始化器 70
5.1.3 使用扩展方法 71
5.1.4 对接口运用扩展方法 73
5.1.5 创建过滤扩展方法 75
5.1.6 使用lambda表达式 76
5.1.7 使用自动类型接口 78
5.1.8 使用匿名类型 78
5.1.9 执行语言集成查询 79
5.1.10 理解延迟LINQ查询 83
5.1.11 反复使用延迟查询 84
5.2 理解Razor语法 86
5.2.1 创建项目 86
5.2.2 考察基本的Razor视图 88
5.3 小结 95
第6章 MVC基本工具 96
6.1 使用Ninject 96
6.1.1 创建项目 98
6.1.2 Ninject入门 99
6.1.3 创建依赖性链 100
6.1.4 指定属性与参数值 102
6.1.5 使用自身绑定 103
6.1.6 绑定到派生类型 104
6.1.7 使用条件绑定 105
6.2 将Ninject运用于APS.NET MVC 106
6.3 Visual Studio的单元测试 108
6.3.1 创建项目 108
6.3.2 创建单元测试 110
6.3.3 运行单元测试(并失败) 114
6.3.4 实现特性 114
6.4 使用Moq 115
6.4.1 将Moq添加到 Visual Studio项目 116
6.4.2 用Moq创建模仿 116
6.4.3 使用Moq的单元测试 118
6.4.4 用Moq作校验 120
6.5 小结 120
第7章 SportsStore:一个真实的应用程序 121
7.1 开始 122
7.1.1 创建Visual Studio解决方案和项目 122
7.1.2 添加引用 123
7.1.3 建立DI容器 124
7.1.4 运行应用程序 125
7.2 从域模型开始 126
7.2.1 创建抽象存储库 127
7.2.2 制作模仿存储库 127
7.3 显示产品列表 128
7.3.1 添加控制器 128
7.3.2 添加视图 129
7.3.3 设置默认路由 130
7.3.4 运行应用程序 131
7.4 准备数据库 131
7.4.1 创建数据库 132
7.4.2 定义数据库方案 132
7.4.3 向数据库添加数据 133
7.4.4 创建实体框架上下文 134
7.4.5 创建Product存储库 135
7.5 添加分页 136
7.5.1 显示页面链接 138
7.5.2 改进URL 145
7.6 设置内容样式 146
7.6.1 定义布局中的公用内容 146
7.6.2 添加CSS规则 147
7.6.3 创建分部视图 148
7.7 小结 150
第8章 SportsStore:导航与购物车 151
8.1 添加导航控件 151
8.1.1 过滤产品列表 151
8.1.2 调整URL方案 154
8.1.3 建立分类导航菜单 156
8.1.4 修正页面计数 163
8.2 建立购物车 165
8.2.1 定义购物车实体 165
8.2.2 添加“Add to Cart(加入购物车)”按钮 169
8.2.3 实现购物车控制器 170
8.2.4 显示购物车内容 172
8.3 使用模型绑定 174
8.4 完成购物车 179
8.4.1 删除购物车的条目 179
8.4.2 添加购物车摘要 180
8.5 递交订单 182
8.5.1 扩充域模型 182
8.5.2 添加结算过程 183
8.5.3 实现订单处理器 186
8.5.4 注册接口实现 189
8.5.5 完成购物车控制器 189
8.5.6 显示验证错误 193
8.5.7 显示致谢页面 193
8.6 小结 195
第9章 SportsStore:管理 196
9.1 添加分类管理 196
9.1.1 创建CRUD控制器 196
9.1.2 渲染存储库中的产品 198
9.1.3 创建新的布局 199
9.1.4 实现List视图 201
9.1.5 编辑产品 204
9.1.6 创建新产品 216
9.1.7 删除产品 217
9.2 使管理特性安全 220
9.2.1 建立表单认证 220
9.2.2 运用过滤器进行授权 221
9.2.3 创建认证提供器 222
9.2.4 创建Accourt控制器 223
9.2.5 创建视图 225
9.3 图像上传 228
9.3.1 扩展数据库 228
9.3.2 增强域模型 229
9.3.3 创建Upload用户界面元素 230
9.3.4 将图像保存到数据库 231
9.3.5 实现GetImage动作方法 232
9.3.6 显示产品图像 234
9.4 小结 235
第2部分 A5P.NET MVC3细节 238
第10章 MVC项目综述 238
10.1 使用Visual Studio的MVC项目 238
10.1.1 使用Internet和Intranet应用程序控制器 241
10.1.2 理解MVC约定 241
10.2 调试MVC应用程序 243
10.2.1 创建项目 243
10.2.2 运行Visual Studio调试器 244
10.2.3 引发Visual Studio调试器中断 245
10.2.4 使用编辑并继续 248
10.3 项目范围的依赖性注入 251
10.4 小结 253
第11章 URL、路由与区域 254
11.1 路由系统介绍 254
11.1.1 创建路由项目 255
11.1.2 URL模式介绍 256
11.1.3 创建并注册一条简单路由 258
11.1.4 定义默认值 262
11.1.5 使用静态URL片段 263
11.1.6 定义自定义片段变量 266
11.1.7 定义可选URL片段 268
11.1.8 定义可变长路由 269
11.1.9 按命名空间区分控制器优先顺序 271
11.1.10 约束路由 273
11.1.11 对磁盘文件的请求进行路由 277
11.1.12 绕过路由系统 279
11.2 生成输出URL 280
11.2.1 准备项目 281
11.2.2 在视图中生成输出URL 281
11.2.3 在动作方法中生成输出URL 287
11.2.4 根据特定路由生成URL 288
11.3 定制路由系统 289
11.3.1 创建一个自定义的RouteBase实现 289
11.3.2 创建自定义路由处理程序 293
11.4 使用区域 294
11.4.1 创建区域 294
11.4.2 填充区域 296
11.4.3 解析不明确的控制器问题 297
11.4.4 生成对区域动作的链接 298
11.5 URL方案最佳实践 299
11.5.1 使URL整洁和人性化 299
11.5.2 GET和POST:选用正确的一个 300
11.6 小结 301
第12章 控制器与动作 302
12.1 控制器介绍 302
12.1.1 准备项目 302
12.1.2 用IController创建控制器 302
12.1.3 创建派生于Controller类的控制器 303
12.2 接收输入 305
12.2.1 通过上下文对象获取数据 305
12.2.2 使用动作方法参数 306
12.3 产生输出 308
12.3.1 理解动作结果 310
12.3.2 通过渲染视图返回HTML 313
12.3.3 把数据从动作方法传递给视图 317
12.3.4 执行重定向 321
12.3.5 返回文本数据 325
12.3.6 返回XML数据 327
12.3.7 返回JSON数据 328
12.3.8 返回文件及二进制数据 328
12.3.9 返回错误及HTTP代码 331
12.3.10 创建自定义动作结果 332
12.4 小结 335
第13章 过滤器 336
13.1 使用过滤器 336
13.1.1 过滤器的四种基本类型 338
13.1.2 将过滤器应用于控制器和动作方法 338
13.1.3 使用授权过滤器 339
13.1.4 使用异常过滤器 345
13.1.5 使用动作和结果过滤器 348
13.1.6 使用其他过滤器特性 353
13.1.7 使用内建过滤器 358
13.2 小结 361
第14章 控制器可扩展性 362
14.1 请求处理管道组件 362
14.2 创建控制器工厂 362
14.2.1 定义自定义控制器工厂 363
14.2.2 注册自定义控制器工厂 365
14.3 使用内建的控制器工厂 365
14.3.1 命名空间优先排序 366
14.3.2 定制DefaultControllerFactory的控制器创建 366
14.4 创建自定义动作调用器 368
14.5 使用内建的动作调用器 370
14.5.1 使用自定义动作名 371
14.5.2 动作方法选择 372
14.5.3 用动作方法选择器支持REST服务 375
14.6 用特殊控制器改善性能 377
14.6.1 使用无会话控制器 378
14.6.2 使用异步控制器 380
14.7 小结 388
第15章 视图 389
15.1 创建自定义视图引擎 389
15.1.1 创建自定义IView 391
15.1.2 创建IViewEngine实现 392
15.1.3 注册自定义视图引擎 393
15.2 使用Razor引擎 395
15.2.1 理解Razor视图渲染 395
15.2.2 对Razor视图添加依赖性注入 397
15.2.3 配置视图搜索位置 398
15.3 对Razor视图添加动态内容 400
15.4 使用HTML辅助器 405
15.4.1 创建内联的HTML辅助器 406
15.4.2 创建外部辅助器方法 407
15.4.3 使用内建的HTML辅助器 408
15.5 使用分段 421
15.5.1 对分段进行检测 423
15.5.2 宣染可选分段 424
15.6 使用分部视图 424
15.6.1 创建分部视图 424
15.6.2 使用强类型分部视图 425
15.7 使用子动作 427
15.7.1 创建子动作 427
15.7.2 渲染子动作 428
15.8 小结 428
第16章 模型模板 429
16.1 使用模板视图辅助器 429
16.1.1 设置生成HTML的样式 433
16.1.2 使用模型元数据 434
16.1.3 使用复合类型参数 441
16.2 定制模板视图辅助器系统 442
16.2.1 创建自定义编辑模板 442
16.2.2 创建自定义显示模板 445
16.2.3 创建泛型模板 446
16.2.4 替换内建模板 446
16.2.5 使用ViewData.TemplateInfo属性 447
16.2.6 把额外元数据传递给模板 449
16.3 理解元数据提供器系统 450
16.3.1 创建自定义模型元数据提供器 451
16.3.2 定制数据注解模型元数据提供器 453
16.4 小结 454
第17章 模型绑定 455
17.1 理解模型绑定 455
17.2 使用默认模型绑定器 457
17.2.1 绑定简单类型 458
17.2.2 绑定复合类型 459
17.2.3 绑定到数组与集合 462
17.3 手工调用模型绑定 465
17.3.1 限制绑定到特定数据源 466
17.3.2 处理绑定错误 467
17.4 使用模型绑定接收文件上传 468
17.5 自定义模型绑定系统 469
17.5.1 创建自定义的值提供器 469
17.5.2 创建依赖性感知的模型绑定器 471
17.5.3 创建自定义模型绑定器 472
17.5.4 创建模型绑定器提供器 474
17.5.5 使用ModelBinder注解属性 475
17.6 小结 476
第18章 模型验证 477
18.1 创建项目 477
18.2 明确地验证模型 479
18.3 显示验证消息 481
18.4 使用其他验证技术 485
18.4.1 模型绑定器中执行验证 485
18.4.2 用元数据指定验证规则 488
18.4.3 定义自验证模型 492
18.4.4 创建自定义验证提供器 493
18.5 执行客户端验证 496
18.5.1 启用和禁用客户端验证 497
18.5.2 使用客户端验证 500
18.5.3 解客户端验证机制 502
18.5.4 自定义客户端验证 503
18.6 执行远程验证 509
18.7 小结 511
第19章 非唐突Ajax 512
19.1 使用MVC的非唐突Ajax 512
19.1.1 创建项目 512
19.1.2 启用和禁用非唐突Ajax 515
19.1.3 使用非唐突Ajax表单 516
19.1.4 理解非唐突Aiax如何工作 517
19.2 设置Ajax选项 518
19.2.1 确保优雅降级 518
19.2.2 在Ajax请求期间给用户提供反馈 520
19.2.3 请求之前对用户进行提示 521
19.3 创建Ajax链接 522
19.4 使用Ajax回调 524
19.5 使用JSON 527
19.5.1 对控制器添加JSON支持 528
19.5.2 在浏览器中处理JSON 529
19.5.3 在动作方法中检测Ajax请求 530
19.5.4 接收JSON数据 531
19.6 小结 533
第20章 jQuery 534
20.1 创建项目 534
20.2 引用jQuery 536
20.3 编写jQuery代码 538
20.4 jQuery基本理论 541
20.4.1 理解jQuery选择器 542
20.4.2 使用jQuery过滤器 544
20.4.3 理解jQuery方法 547
20.4.4 等待DOM 547
20.4.5 使用jQuery的CSS方法 548
20.4.6 使用DOM 551
20.5 使用jQuery事件 554
20.6 使用jQuery视觉效果 555
20.7 使用jQuery UI 556
20.7.1 引用jQuery UI 557
20.7.2 制作更好的按钮 557
20.7.3 使用Silder滑块 559
20.8 小结 561
第3部分 交付已完成的ASP.NET MVC3项目 564
第21章 安全性与脆弱性 564
21.1 所有输入都可以伪造 564
伪造HTTP请求 566
21.2 跨网站脚本与HTML注入 567
21.2.1 理解XSS漏洞 568
21.2.2 Razor的HTML编码 569
21.2.3 请求验证 570
21.2.4 JavaScript字符串编码与XSS 572
21.3 会话劫持 574
21.3.1 通过客户端IP地址检查进行防护 575
21.3.2 通过在cookie中设置HttpOnly标志进行防护 575
21.4 跨网站请求伪造 576
21.4.1 攻击 577
21.4.2 防护 577
21.4.3 用Antiforgery辅助器阻止CSRF 578
21.5 SQL注入 579
21.5.1 攻击 580
21.5.2 用参数化查询进行防护 580
21.5.3 用对象关系映射进行防护 581
21.6 安全使用MVC框架 581
21.6.1 不要意外暴露动作方法 581
21.6.2 不要允许模型绑定修改敏感属性 582
21.7 小结 582
第22章 认证与授权 583
22.1 使用Windows认证 583
22.2 使用表单认证 585
22.2.1 建立表单认证 586
22.2.2 使用Cookieless表单认证 588
22.3 使用成员、角色和简档 589
22.3.1 建立并使用成员 590
22.3.2 建立并使用角色 598
22.3.3 建立并使用简档 601
22.4 为什么不应该使用基于URL的授权 606
22.5 小结 608
第23章 部署 609
23.1 准备要部署的应用程序 609
23.1.1 部署前检测视图错误 609
23.1.2 配置动态页面编译 610
23.1.3 为bin部署做准备 611
23.1.4 准备用于转换的Web.config文件 612
23.2 理解转换结构 613
23.2.1 插入配置元素 615
23.2.2 删除配置元素 617
23.2.3 设置和删除属性 618
23.2.4 替换元素 619
23.2.5 使用Locator属性 620
23.2.6 准备数据库部署准备项目 622
23.3 理解IIS基本原理 624
23.3.1 理解Web网站 624
23.3.2 理解虚拟目录 625
23.3.3 理解应用程序池 625
23.3.4 将Web网站绑定到主机名、IP地址及端口 625
23.4 为部署准备服务器 626
23.5 部署应用程序 627
23.5.1 通过复制文件部署应用程序 627
23.5.2 使用部署包 629
23.5.3 使用一键发布 631
23.6 小结 632