第1章 入门 1
1.1 ASPNET MVC简介 1
1.1.1 ASP.NET MVC如何适应ASP.NET 1
1.1.2 MVC模式简介 2
1.1.3 MVC在Web框架中的应用 2
1.1.4 ASP.NETMVC 5的发展历程 3
1.1.5 ASP.NET MVC 4概述 6
1.1.6 开源发布 9
1.2 ASP.NET MVC 5概述 9
1.2.1 One ASP.NET 10
1.2.2 新的Web项目体验 10
1.2.3 ASP.NET Identity 10
1.2.4 Bootstrap模板 11
1.2.5 特性路由 13
1.2.6 ASP.NET基架 13
1.2.7 身份验证过滤器 13
1.2.8 过滤器重写 13
1.3 安装MVC 5和创建应用程序 13
1.3.1 ASP.NETMVC 5的软件需求 13
1.3.2 安装ASP.NET MVC 5 14
1.3.3 创建ASP.NET MVC 5应用程序 14
1.3.4 New ASP.NET Project对话框 15
1.4 ASP.NET MVC应用程序的结构 19
1.4.1 ASP.NET MVC和约定 21
1.4.2 约定优于配置 21
1.4.3 约定简化通信 22
1.5 小结 22
第2章 控制器 23
2.1 控制器的角色 23
2.2 示例应用程序:MVC Music Store 25
2.3 控制器基础 28
2.3.1 简单示例:Home Controller 28
2.3.2 创建第一个控制器 30
2.3.3 控制器操作中的参数 33
2.4 小结 35
第3章 视图 36
3.1 视图的作用 37
3.2 视图的基础知识 37
3.3 理解视图约定 40
3.4 强类型视图 41
3.4.1 ViewBag的不足 41
3.4.2 理解ViewBag、ViewDatat和ViewDataDictionary 43
3.5 视图模型 44
3.6 添加视图 45
3.7 Razor视图引擎 47
3.7.1 Razor的概念 48
3.7.2 代码表达式 49
3.7.3 HTML编码 50
3.7.4 代码块 52
3.7.5 Razor语法示例 52
3.7.6 布局 54
3.7.7 ViewStart 56
3.8 指定部分视图 57
3.9 小结 58
第4章 模型 59
4.1 为MVC Music Store建模 60
4.2 为商店管理器构造基架 63
4.2.1 基架的含义 63
4.2.2 基架和实体框架 64
4.2.3 执行基架模板 66
4.2.4 执行基架代码 71
4.3 编辑专辑 75
4.3.1 创建编辑专辑的资源 76
4.3.2 响应编辑时的POST请求 79
4.4 模型绑定 80
4.4.1 DefaultModelBinder 81
4.4.2 显式模型绑定 82
4.5 小结 84
第5章 表单和HTML辅助方法 85
5.1 表单的使用 85
5.1.1 action和method特性 86
5.1.2 GET方法还是POST方法 86
5.2 HTML辅助方法 89
5.2.1 自动编码 90
5.2.2 辅助方法的使用 91
5.2.3 HTML辅助方法的工作原理 91
5.2.4 设置专辑编辑表单 92
5.2.5 添加输入元素 93
5.2.6 辅助方法、模型和视图数据 98
5.2.7 强类型辅助方法 100
5.2.8 辅助方法和模型元数据 101
5.2.9 模板辅助方法 101
5.2.10 辅助方法和ModelState 102
5.3 其他输入辅助方法 103
5.3.1 Html.Hidden 103
5.3.2 Html.Password 103
5.3.3 Html.RadioButton 103
5.3.4 Html.CheckBox 104
5.4 渲染辅助方法 104
5.4.1 Html.ActionLink和Html.RouteLink 104
5.4.2 URL辅助方法 105
5.4.3 Html.Partial和Html.RenderPartial 106
5.4.4 Html.Action和Html.RenderAction 107
5.5 小结 108
第6章 数据注解和验证 109
6.1 为验证注解订单 110
6.1.1 验证注解的使用 112
6.1.2 自定义错误提示消息及其本地化 116
6.1.3 注解的后台原理 117
6.1.4 控制器操作和验证错误 118
6.2 自定义验证逻辑 120
6.2.1 自定义注解 120
6.2.2 IValidatableObject 123
6.3 显示和编辑注解 124
6.3.1 Display 124
6.3.2 ScaffoldColumn 125
6.3.3 DisplayFormat 125
6.3.4 ReadOnly 125
6.3.5 DataType 126
6.3.6 UIHint 126
6.3.7 HiddenInput 126
6.4 小结 126
第7章 成员资格、授权和安全性 127
7.1 安全性:无趣、但极其重要 127
7.2 使用Authorize特性登录 129
7.2.1 保护控制器操作 129
7.2.2 Authorize特性在表单身份验证和AccountController控制器中的用法 133
7.2.3 Windows Authentication 134
7.3 要求角色成员使用Authorize特性 137
7.4 扩展用户身份 138
7.4.1 存储额外的用户资料数据 139
7.4.2 持久化控制 139
7.4.3 管理用户和角色 139
7.5 通过OAuth和OpenID的外部登录 139
7.5.1 注册外部登录提供器 141
7.5.2 配置OpenID提供器 142
7.5.3 配置OAuth提供器 144
7.5.4 外部登录的安全性 144
7.6 Web应用程序中的安全向量 145
7.6.1 威胁:跨站脚本 146
7.6.2 威胁:跨站请求伪造 154
7.6.3 威胁:cookie盗窃 158
7.6.4 威胁:重复提交 160
7.6.5 威胁:开放重定向 162
7.7 适当的错误报告和堆栈跟踪 166
7.7.1 使用配置转换 167
7.7.2 在生产环境中使用Retail部署配置 168
7.7.3 使用专门的错误日志系统 168
7.8 安全回顾和有用资源 168
7.9 小结 169
第8章 Ajax 171
8.1 jQuery 172
8.1.1 jQuery的特性 172
8.1.2 非侵入式JavaScript 175
8.1.3 jQuery的用法 176
8.2 Ajax辅助方法 181
8.2.1 在项目中添加非侵入式Ajax脚本 182
8.2.2 Ajax的ActionLink方法 183
8.2.3 HTML 5特性 185
8.2.4 Ajax表单 186
8.3 客户端验证 188
8.3.1 jQuery验证 188
8.3.2 自定义验证 191
8.4 辅助方法之外 196
8.4.1 jQuery UI 196
8.4.2 使用jQuery UI实现自动完成部件 197
8.4.3 JSON和客户端模板 200
8.4.4 Bootstrap插件 204
8.5 提高Ajax性能 206
8.5.1 使用内容分发网络 206
8.5.2 脚本优化 206
8.5.3 捆绑和微小 207
8.6 小结 208
第9章 路由 209
9.1 统一资源定位符——URL 209
9.2 路由概述 210
9.2.1 对比路由和URL重写 211
9.2.2 路由方法 211
9.2.3 定义特性路由 212
9.2.4 定义传统路由 221
9.2.5 选择特性路由还是传统路由 229
9.2.6 路由命名 229
9.2.7 MVC区域 231
9.2.8 catch-all参数 233
9.2.9 段中的多个路由参数 233
9.2.10 StopRoutingHandler和IgnoreRoute 234
9.2.11 路由的调试 235
9.3 揭秘路由如何生成URL 236
9.3.1 URL生成的高层次概述 237
9.3.2 URL生成详解 237
9.3.3 外界路由值 238
9.3.4 Route类生成URL的若干示例 240
9.4 揭秘路由如何绑定到操作 241
9.4.1 高层次请求的路由管道 241
9.4.2 路由数据 242
9.5 自定义路由约束 242
9.6 Web Forms和路由机制 243
9.7 小结 244
第10章 NuGet 245
10.1 NuGet概述 245
10.2 以包的形式添加库 246
10.2.1 查找包 247
10.2.2 安装包 248
10.2.3 更新包 251
10.2.4 包恢复 251
10.2.5 包管理器控制台的用法 252
10.3 创建包 254
10.3.1 打包项目 255
10.3.2 打包文件夹 256
10.3.3 配置文件和源代码转换 256
10.3.4 NuSpec文件 257
10.3.5 元数据 258
10.3.6 依赖库 259
10.3.7 指定要包含的文件 260
10.3.8 工具 260
10.3.9 框架和轮廓定位 263
10.3.10 预发布包 264
10.4 发布包 264
10.4.1 发布到NuGet.org 265
10.4.2 使用NuGet.exe 267
10.4.3 包浏览器的用法 268
10.5 小结 269
第11章 ASP.NET Web API 271
11.1 定义ASP.NET Web API 272
11.2 Web API入门 272
11.3 编写API控制器 273
11.3.1 检查示例ValuesController 273
11.3.2 异步设计:IHttpController 274
11.3.3 传入的操作参数 277
11.3.4 操作返回值、错误和异步 277
11.4 配置Web API 279
11.4.1 Web托管Web API的配置 279
11.4.2 自托管Web API的配置 280
11.5 向Web API添加路由 282
11.6 绑定参数 283
11.7 过滤请求 285
11.8 启用依赖注入 286
11.9 探索API编程 286
11.10 跟踪应用程序 287
11.11 Web API示例:ProductsController 287
11.12 小结 289
第12章 应用AngularJS构建单页面应用程序 290
12.1 理解和安装AngularJS 291
12.1.1 AngularJS简介 291
12.1.2 本章目标 291
12.1.3 入门 291
12.1.4 向网站中添加AngularJS 293
12.1.5 数据库设置 294
12.2 创建Web API 296
12.3 创建应用程序和模块 297
12.3.1 创建控制器、模型和视图 298
12.3.2 服务 300
12.3.3 路由 303
12.3.4 详细视图 305
12.3.5 自定义电影服务 306
12.3.6 删除电影 308
12.3.7 编辑和创建电影 310
12.4 小结 315
第13章 依赖注入 316
13.1 软件设计模式 316
13.1.1 设计模式——控制反转模式 317
13.1.2 设计模式——服务定位器 318
13.1.3 设计模式——依赖注入 322
13.2 MVC中的依赖解析 325
13.2.1 MVC中的单一注册服务 326
13.2.2 MVC中的复合注册服务 326
13.2.3 MVC中的任意对象 328
13.3 Web API中的依赖解析 330
13.3.1 Web API中的单一注册服务 330
13.3.2 Web API中的复合注册服务 331
13.3.3 Web API中的任意对象 332
13.3.4 对比MVC和Web API中的依赖解析器 332
13.4 小结 333
第14章 单元测试 334
14.1 单元测试和测试驱动开发的意义 334
14.1.1 单元测试的定义 335
14.1.2 测试驱动开发的定义 336
14.2 创建单元测试项目 339
14.2.1 检查默认单元测试 339
14.2.2 只测试自己编写的代码 340
14.3 单元测试用于ASP.NET MVC和ASP.NET Web API应用程序的技巧和窍门 341
14.3.1 控制器测试 341
14.3.2 路由测试 346
14.3.3 验证测试 349
14.4 小结 352
第15章 扩展ASP.NET MVC 353
15.1 模型扩展 354
15.1.1 把请求数据转换为模型 354
15.1.2 用元数据描述模型 359
15.1.3 验证模型 361
15.2 视图扩展 364
15.2.1 自定义视图引擎 364
15.2.2 编写HTML辅助方法 366
15.2.3 编写Razor辅助方法 367
15.3 控制器扩展 368
15.3.1 操作选择 368
15.3.2 操作过滤器 370
15.3.3 提供自定义结果 378
15.4 小结 379
第16章 高级主题 381
16.1 移动支持 381
16.1.1 适应性呈现 382
16.1.2 显示模式 386
16.2 高级Razor 388
16.2.1 模板化的Razor委托 388
16.2.2 视图编译 389
16.3 高级视图引擎 390
16.3.1 视图引擎配置 391
16.3.2 查找视图 392
16.3.3 视图本身 393
16.3.4 备用视图引擎 393
16.3.5 新视图引擎还是新ActionResult 395
16.4 高级基架 395
16.4.1 ASP.NET基架简介 395
16.4.2 自定义基架模板 395
16.4.3 自定义基架器 398
16.5 高级路由 398
16.5.1 RouteMagic 398
16.5.2 可编辑路由 399
16.6 高级模板 402
16.6.1 默认模板 403
16.6.2 自定义模板 406
16.7 高级控制器 408
16.7.1 定义控制器:IController接口 408
16.7.2 ControllerBase抽象基类 409
16.7.3 控制器类和操作 410
16.7.4 ActionResult 411
16.7.5 操作调用器 418
16.7.6 使用异步控制器操作 421
16.8 小结 426
第17章 ASP.NET MVC实战:构建NuGet.org网站 427
17.1 源码与我们同在 428
17.2 WebActivator 430
17.3 ASP.NET动态数据 431
17.4 异常日志 433
17.5 性能分析 435
17.6 数据访问 437
17.7 EF基于代码迁移 438
17.8 使用Octopus Deploy进行部署 440
17.9 使用Fluent Automation自动进行浏览器测试 441
17.10 其他有用的NuGet包 441
17.10.1 WebBackgrounder 442
17.10.2 Lucene.NET 443
17.10.3 AnglicanGeek.MarkdownMailer 443
17.10.4 Ninject 443
17.11 小结 444
附录A ASP.NET MVC 5.1 445