第1章 MVC概述 1
1.1 MVC架构概述 1
1.1.1 MVC是什么 1
1.1.2 关注点分离 2
1.1.3 约定优于配置 2
1.1.4 MVC的优点与特长 2
1.1.5 MVC的成长趋势 3
1.2 ASP.NET MVC概述 4
1.2.1 与传统ASP.NET Web Forms的差异 4
1.2.2 Model的责任 5
1.2.3 View的范围 6
1.2.4 Controller要做哪些事 7
1.3 ASP.NET MVC 5开发环境 8
1.3.1 One ASP.NET 8
1.3.2 Visual Studio 2013 Web Templates 9
1.3.3 Scaffold(基架) 12
1.3.4 Visual Studio 2013新增功能介绍 12
1.4 NuGet的使用 20
1.4.1 安装程序包 20
1.4.2 还原程序包 22
1.4.3 更新程序包 26
1.4.4 程序包管理器控制台(Package Manager Console) 26
1.5 IIS Express 29
1.5.1 如何在Visual Studio中使用IIS Express 30
1.5.2 如何使用命令行启用IIS Express 31
1.5.3 让IIS Express也支持外部连接 34
1.5.4 整理过多的网站信息 35
1.6 ASP.NETWeb Forms转换至MVC开发 36
1.6.1 从Web Forms转到MVC后开发概念的改变 36
1.6.2 数据源的改变 36
1.7 创建第一个MVC因特网应用程序 41
1.7.1 创建MVC项目 41
1.7.2 创建数据库(使用Local DB) 45
1.7.3 创建MVC中的Model 48
1.7.4 创建MVC中的View与Controller 52
1.7.5 更新为最新MVC版本 55
1.7.6 MVC的生命周期 56
1.8 结术语 58
参考资料 58
第2章 与数据的对话:Model与ADO.NET 60
2.1 Model的概念 60
2.1.1 Model的类型 61
2.1.2 Model的设计 61
2.2 ADO.NET 63
2.2.1 面向连接的操作 63
2.2.2 面向无连接的操作 64
2.3 泛型概念 65
2.3.1 泛型基础 65
2.3.2 设计泛型类 66
2.4 Model的实现 70
2.4.1 Model的设计 70
2.4.2 Model数据读写的设计 71
2.5 SQL Injection 82
2.6 结术语 83
第3章 LINQ:驱动数据的查询功能 84
3.1 LINQ概念 84
3.1.1 LINQ vs.循环处理 85
3.1.2 LINQ的类型 88
3.2 LINQ的基础 89
3.2.1 扩展方法 89
3.2.2 匿名类型与对象初始化器 91
3.2.3 类型推论 93
3.2.4 yield指令与延迟查询 94
3.2.5 Fluent Interface 96
3.3 Lambda表达式 97
3.3.1 Lambda表达式的由来 97
3.3.2 Lambda表达式的格式 98
3.3.3 通用委派与Lambda表达式 100
3.4 LINQ语句 100
3.5 LINQ函数 101
3.5.1 查询结果过滤:Where() 102
3.5.2 选取数据:Select()、SelectMany() 102
3.5.3 群组数据:GroupBy()、ToLookup() 105
3.5.4 联接数据:Join()与GroupJoin() 108
3.5.5 数据排序:OrderBy()与ThenBy() 109
3.5.6 获取集合 112
3.5.7 划分并获取集合 113
3.5.8 集合的运算 114
3.5.9 访问元素 116
3.5.10 聚合与汇总 118
3.6 远程查询:IQueryable〈T〉与IEnumerable〈T〉 120
3.7 Expression 121
3.8 LINQ与ADO.NET:DataSet/DataTable的使用 124
3.9 结术语 126
第4章 EF 127
4.1 ORM概念 127
4.2 EF概述 129
4.3 EF架构 133
4.3.1 数据模型映射 133
4.3.2 Entity SQL Service 135
4.3.3 Object Services 135
4.3.4 LINQ to Entities 137
4.4 Database First 138
4.5 Model First 143
4.6 Code First 150
4.6.1 生成模型——空白Code First的做法 150
4.6.2 生成模型——由数据库生成 155
4.6.3 Code First Modeling APIs 156
4.6.4 实现关联性 159
4.6.5 实现继承 163
4.6.6 存储过程和函数映射 170
4.7 通过DbContext访问EF数据模型 172
4.7.1 DbSet〈T〉 172
4.7.2 以对象为主的查询 173
4.7.3 以SQL为主的查询 174
4.7.4 数据的变动 176
4.7.5 验证 177
4.7.6 更新的考虑 179
4.8 更新数据库:Database Migration 180
4.8.1 数据库初始化器 180
4.8.2 数据库迁移-自动迁移 181
4.8.3 数据库迁移-手动迁移 186
4.8.4 数据库迁移-程序迁移 188
4.9 结术语 189
参考文献 189
第5章 路由(Routing) 190
5.1 URL Rewriting与Route基本概念 190
5.2 URL Routing基本应用 191
5.3 加入自定义的URL Routing 193
5.4 URL Routing如何对比 194
5.5 为URL Routing加上限制条件 195
5.6 URL Routing高级应用 197
5.6.1 如何从程序建立一组网址 198
5.6.2 直接获取RouteData内的值 198
5.7 如何调试网站 199
5.7.1 使用Route Debugger 2.0 199
5.7.2 使用Cobisi Routing Assistant 200
5.8 Area 201
5.8.1 创建第一个Area 202
5.8.2 使用Area会遇到的问题 204
5.8.3 根据功能模块区分的Area 206
5.9 结术语 207
第6章 控制器(Controller) 208
6.1 了解Controller角色 209
6.1.1 了解Controller工作流程 210
6.1.2 ASP.NET MVC 5验证系统 216
6.1.3 创建Model层 219
6.1.4 基架系统 222
6.2 Controller与View的数据传递 227
6.2.1 ViewData属性 227
6.2.2 ViewBag属性 229
6.2.3 ViewData、ViewBag传递Model 231
6.2.4 ViewData.Model属性 234
6.2.5 TempData属性 236
6.2.6 多Model与多对象传递 241
6.3 Model Binding 251
6.3.1 Request对象 251
6.3.2 RouteData 251
6.3.3 简单Model Binding 252
6.3.4 复杂的Model Binding 256
6.3.5 JSON Model Binding 259
6.3.6 ModelBinder扩展 260
6.4 Metadata与数据验证 263
6.4.1 部分类 263
6.4.2 验证属性 265
6.4.3 ModelState 285
6.5 ActionResult 297
6.5.1 EmptyResult 300
6.5.2 ContentResult 300
6.5.3 JavaScriptResult 303
6.5.4 JsonResult 304
6.5.5 HttpStatusCodeResult 309
6.5.6 RedirectResult与RedirectToRouteResult 310
6.5.7 FileResult 317
6.5.8 ViewResult 329
6.5.9 VideoResult 335
6.6 Action Filters 338
6.6.1 Authentication Filter 340
6.6.2 Authorization Filter 347
6.6.3 Action Filter 354
6.6.4 Result Filter 356
6.6.5 Exception Filter 360
6.6.6 Action Filters接口与扩展 363
6.6.7 Filter overrides 368
6.7 其他Controller技巧 371
6.7.1 ActionName属性 371
6.7.2 NoAction属性 371
6.7.3 支援多国语系 372
6.8 结术语 375
第7章 异步程序设计 376
7.1 异步基架生成器 376
7.2 进程与线程 380
7.2.1 进程 380
7.2.2 线程 381
7.2.3 多线程的启动 385
7.3 同步与异步程序设计 386
7.3.1 同步程序设计 387
7.3.2 异步程序设计 387
7.4 Task类 388
7.4.1 接续工作 389
7.4.2 Task.Delay 390
7.4.3 Parallel类 391
7.5 async与await关键词 392
7.5.1 C#4.0与C#5.0异步差异 394
7.5.2 同步方法读取网络资源 396
7.5.3 异步方法读取网络资源 398
7.5.4 异步方法执行流程 400
7.6 异步与线程池 401
7.6.1 如何选择同步或异步操作 405
7.6.2 执行多个并行操作 405
7.6.3 使用cancellationToken 406
7.6.4 多线程与异步 408
7.7 结术语 409
第8章 View:摇曳生姿的美人 410
8.1 View概述 410
8.2 View在项目中的位置 411
8.2.1 Views目录 412
8.2.2 Views下的Shared目录 413
8.2.3 Views下的常规目录 413
8.3 View的类型 414
8.3.1 View常规视图 414
8.3.2 Partial View部分视图 416
8.3.3 Layout主版页面 417
8.3.4 Template 420
8.4 View获得数据的方法 423
8.4.1 Model 424
8.4.2 ViewData及ViewBag 424
8.4.3 TempData 425
8.5 View Engine概述 425
8.5.1 WebForm ViewEngine 425
8.5.2 Razor View Engine 426
8.5.3 View Engine的执行细节 426
8.5.4 View Engine的扩展性 426
8.5.5 Razor View Engine对于View文件的搜索方式 427
8.6 Razor语法 428
8.6.1 Razor语法概述 429
8.6.2 程序代码区块 432
8.6.3 编译指示词 433
8.6.4 排版与辅助功能 434
8.6.5 全站可用的Razor Helper 438
8.6.6 ASP.NET MVC 4/Razor v2.0增强部分 440
8.7 Helpers 443
8.7.1 UrlHelper 443
8.7.2 HtmlHelper 445
8.7.3 AjaxHelper 465
8.7.4 扩展Helper 469
8.8 View开发技术的高级功能 474
8.8.1 前端优化:JavaScript/CSS的合并与优化 474
8.8.2 View Engine文件搜索优化 478
8.8.3 Layout嵌套 481
8.9 结术语 483
第9章 Bootstrap 484
9.1 Bootstrap导览 485
9.1.1 BasicTemplate 486
9.1.2 Grid System 486
9.1.3 Component 492
9.1.4 Bootstrap的JavaScript链接库 492
9.2 定制化Bootstrap 494
9.3 ASP.NET MVC与Bootstrap合壁 496
9.3.1 Component:Label、Badge、Alert、Progress 496
9.3.2 表单域的集成 499
9.4 结术语 502
第10章 诊断及日志处理 503
10.1 预处理器 503
10.1.1 基本规则 503
10.1.2 预处理器 504
10.2 Trace与Debug类 506
10.2.1 Assert方法 507
10.2.2 Listeners集合 508
10.3 艾尔玛(ELMAH) 509
10.3.1 艾尔玛的作用 510
10.3.2 使用ELMAH.MVC 514
10.3.3 XML Out和Database In 516
10.3.4 网站自动报错功能 518
10.3.5 ELMAH变形金刚 520
10.3.6 ElmahR=ELMAH+SignalR 522
10.3.7 ELMAH.io 523
10.4 NLog-Advanced.NET Logging 524
10.4.1 调用N日志(NLog) 524
10.4.2 NLog实战 529
10.5 ELMAH与NLog合体术 540
10.5.1 Log Reporting Dashboard 540
10.5.2 ELMAH.MVC+NLog 540
10.6 结术语 541
第11章 网站安全之道 542
11.1 知己知彼 542
11.1.1 XSS的防范 542
11.1.2 如何有效防范XSS 544
11.1.3 防止跨网站伪造请求 545
11.1.4 参考资料 548
11.2 加密与解密 549
11.2.1 加密博客 549
11.2.2 窗体验证原则 552
11.2.3 ASP.NET加密技术 553
11.2.4 哈希密码 556
11.2.5 Crypto类 557
11.2.6 加密web.config 557
11.2.7 登录监控 560
11.3 结术语 560
第12章 身份验证与授权 561
12.1 使用Session做身份验证 562
12.2 使用Cookie做身份验证 564
12.3 使用Forms Authentication做身份验证 568
12.4 全新的ASP.NET IDentity 2.0 570
12.4.1 ASP.NET IDentity 2.0 572
12.4.2 自定义验证逻辑 576
12.4.3 电子邮件验证 578
12.4.4 双因素认证 584
12.4.5 将用户加入角色 584
12.4.6 集成OAuth 587
12.5 扩展会员字段 594
12.6 结术语 598
第13章 ASP.NET Web API 2概述 599
13.1 Web Service 600
13.1.1 Web Service架构 601
13.1.2 XML Web Service 602
13.1.3 WCF 604
13.1.4 WCF REST 604
13.1.5 小结 605
13.2 ASP.NET Web API 2 605
13.2.1 IIS Express指令模式 607
13.2.2 Web API路由 608
13.2.3 REST 609
13.2.4 HTTP动词+URI 616
13.2.5 小结 616
13.3 Model与Web API 2基架 617
13.4 EF循环引用 619
13.5 JSON 621
13.5.1 XML与JSON 622
13.5.2 了解JSON格式 623
13.5.3 使用JSON数据 624
13.5.4 JSON-LD 626
13.6 POSTMAN 628
13.7 结术语 630
第14章 自动测试完整攻略 631
14.1 测试概念简介 631
14.1.1 测试的目的 631
14.1.2 测试的种类 632
14.1.3 加入测试的时间点 633
14.1.4 测试的效益 634
14.1.5 小结 635
14.2 测试程序设计技巧与工具的介绍 635
14.2.1 单元测试 636
14.2.2 Web自动测试 654
14.2.3 行为驱动开发(Behavior-Driven Development,BDD) 662
14.3 实战演练——以重构计算运费为例 668
14.3.1 范例说明 669
14.3.2 建立测试案例(Feature与Scenarios) 672
14.3.3 使用Selenium IDE来录制测试案例脚本 673
14.3.4 编写Selenium的测试程序(完成Steps.cs) 674
14.3.5 帮程序代码说话 677
14.3.6 提取方法 679
14.3.7 职责分离 680
14.3.8 针对各货运商类加入单元测试 682
14.3.9 依赖接口与工厂方法 683
14.3.10 小结 685
14.4 总结 685
第15章 网站部署 687
15.1 ASP.NET MVC RTM的进化史 687
15.2 部署到IIS 688
15.2.1 Web部署工具 688
15.2.2 将ASP.NET MVC 4应用程序部署到IIS 5.1 中 691
15.3 部署到Microsoft Azure云环境 692
15.3.1 部署到Microsoft Azure Website 692
15.3.2 部署到Microsoft Azure Cloud Service 697
15.4 结术语 699
第16章 CMS范例实战 700
16.1 新建项目 700
16.2 创建数据 701
16.3 建立区域 706
16.4 使用MetaData 708
16.5 使用NuGet 709
16.6 建立会员机制 716
16.7 分页套用 716
16.8 结术语 719
附录A ASP.NET MVC 5.1 与ASP.NET MVC 5.2 720
附录B ASP.NET MVC 6预览 725