第一部分 入门 2
第1章 第一个ASP.NET应用程序 2
1.1 准备工作站 2
1.2 创建新的ASP.NET项目 3
1.2.1 添加新的Web窗体 4
1.2.2 测试示例应用程序 5
1.3 创建简单的应用程序 8
1.3.1 设定场景 8
1.3.2 创建数据模型和存储库 8
1.3.3 创建窗体并设置其样式 9
1.3.4 处理窗体 12
1.4 创建摘要视图 16
1.4.1 设置动态HTML的格式 18
1.4.2 测试动态代码 18
1.4.3 调用代码隐藏方法 18
1.5 执行验证 21
1.6 总结 24
第2章 ASP.NET背景信息 25
2.1 ASP.NETFramework概述 25
2.2 关于本书 27
2.2.1 所需了解的信息 27
2.2.2 如果没有相关经验该怎么办 27
2.2.3 需要使用哪些软件和技术 28
2.2.4 本书是否包含大量示例 28
2.3 本书的结构 28
2.4 了解Web窗体 29
2.4.1 Web窗体的优势 30
2.4.2 了解Web窗体的劣势 31
2.5 总结 32
第3章 C#基本功能 33
3.1 创建示例项目 33
3.2 使用自动实现的属性 34
3.3 使用对象和集合初始化器 37
3.4 使用扩展方法 39
3.4.1 将扩展方法应用于接口 41
3.4.2 创建过滤式扩展方法 43
3.5 使用lambda表达式 45
3.6 使用自动类型推断 48
3.7 使用匿名类型 48
3.8 使用泛型类型 50
3.8.1 使用通用基类 52
3.8.2 使用泛型类型 54
3.9 显式实现接口 56
3.10 执行语言集成查询 58
3.11 使用异步方法 62
3.12 总结 65
第4章 使用jQuery 66
4.1 创建示例项目 66
4.1.1 在示例项目中添加jQuery 68
4.1.2 在Web窗体中添加jQuery 69
4.2 jQuery入门 70
4.2.1 等待DOM 70
4.2.2 jQuery语句 71
4.3 选择元素 72
4.3.1 按类型、类或ID选择元素 72
4.3.2 使用关系和联合选择元素 73
4.3.3 使用特性选择元素 74
4.3.4 使用过滤器选择元素 75
4.3.5 使用jQuery函数 77
4.4 使用jQuery事件 81
4.5 处理JSON数据 83
4.6 总结 85
第5章 基本开发工具 86
5.1 创建示例项目 86
5.2 使用Visual Studio调试器 88
5.2.1 创建条件断点 89
5.2.2 了解应用程序状态 90
5.2.3 使用Immediate Window 91
5.3 使用Page Inspector和浏览器F12工具 92
5.3.1 使用JavaScript Console 93
5.3.2 使用网络监视器 94
5.3.3 使用JavaScript Profiler 95
5.4 使用NuGet 96
5.5 使用Opera Mobile 98
5.6 使用JavaScript库 98
5.6.1 jQuery、jQuery UI和jQuery Mobile 99
5.6.2 Knockout 99
5.6.3 Modernizr 99
5.6.4 requireJS 99
5.7 总结 99
第6章 SportsStore:真实的应用程序 100
6.1 创建项目 100
6.1.1 创建文件夹结构 100
6.1.2 添加全局应用程序类 102
6.1.3 创建数据库 103
6.1.4 定义数据库架构 105
6.1.5 向数据库中添加数据 106
6.2 创建数据模型和存储库 107
6.2.1 创建数据模型类 108
6.2.2 添加Entity Framework 108
6.2.3 创建Entity Framework上下文 109
6.2.4 创建产品存储库 110
6.3 创建产品清单 111
6.4 添加分页 113
6.4.1 显示产品页 113
6.4.2 添加分页链接 116
6.5 设置列表Web窗体的样式 117
6.5.1 创建母版页 118
6.5.2 自定义母版页 119
6.5.3 应用母版页 120
6.5.4 测试母版页 121
6.6 总结 121
第7章 SportsStore:导航和购物篮 122
7.1 配置URL路由 122
7.1.1 创建路由配置类 123
7.1.2 更新全局应用程序类 124
7.1.3 使用路由变量 125
7.1.4 测试路由配置 126
7.1.5 生成路由链接 127
7.2 添加类别信息 128
7.2.1 创建用户控件 128
7.2.2 将用户控件应用于母版页 130
7.2.3 添加CSS样式 131
7.2.4 扩展URL方案 131
7.2.5 添加显示类别功能 132
7.2.6 突出显示当前类别 134
7.3 构建购物篮 135
7.3.1 定义Cart类 136
7.3.2 添加购物篮按钮 137
7.3.3 创建会话帮助程序 140
7.3.4 处理窗体发布 142
7.3.5 显示购物篮的内容 144
7.3.6 测试购物篮 146
7.4 总结 147
第8章 SportsStore:完善购物篮 148
8.1 移除不需要的购物篮产品 148
8.1.1 了解视图状态 150
8.1.2 禁用视图状态 151
8.2 添加购物篮摘要 152
8.2.1 定义CSS样式 153
8.2.2 应用购物篮摘要控件 154
8.2.3 合并用户控件声明 155
8.3 提交订单 156
8.3.1 扩展数据库和数据模型 156
8.3.2 添加Checkout链接和URL 159
8.3.3 处理订单 162
8.4 添加验证 165
8.4.1 添加NuGet程序包 167
8.4.2 创建并使用脚本捆绑包 168
8.4.3 设置客户端验证 170
8.4.4 创建服务器控件 171
8.4.5 应用服务器控件 173
8.5 总结 175
第9章 SportsStore:管理 176
9.1 添加常用构建块 176
9.1.1 扩展路由配置 176
9.1.2 添加管理母版页 177
9.1.3 添加CSS样式表 178
9.1.4 添加Web窗体 179
9.2 添加订单管理 180
9.2.1 清空和填充数据库 180
9.2.2 添加Web窗体内容 181
9.2.3 创建代码隐藏类 184
9.3 添加类别管理 186
9.3.1 扩展存储库 186
9.3.2 添加Web窗体 187
9.3.3 设置CRUD方法 189
9.3.4 测试类别管理 190
9.4 设置授权 191
9.4.1 确保管理页面的安全 191
9.4.2 创建身份验证登录Web窗体 192
9.4.3 测试失败的身份验证 194
9.4.4 测试成功的身份验证和授权 194
9.5 总结 195
第10章 SportsStore:部署 196
10.1 为最终测试禁用调试模式 196
10.2 准备Windows Azure 197
10.2.1 创建网站和数据库 198
10.2.2 准备数据库以进行远程管理 200
10.2.3 创建架构 200
10.3 部署应用程序 203
10.4 总结 207
第11章 可测试的Web应用程序 208
11.1 了解问题所在 208
11.2 了解解决方案 209
11.3 创建示例项目 211
11.3.1 设置静态内容 211
11.3.2 设置数据模型 212
11.3.3 实现存储库 213
11.3.4 添加基础架构 214
11.4 实现RSVP页面 216
11.4.1 创建表示器 216
11.4.2 创建视图 217
11.4.3 测试RSVP页面 219
11.5 添加单元测试 220
11.5.1 创建单元测试项目 220
11.5.2 创建单元测试 222
11.5.3 测试输入值 224
11.6 添加依赖注入 229
11.6.1 添加NuGet程序包 230
11.6.2 配置注入 231
11.7 完成整个应用程序 233
11.7.1 创建表示器 234
11.7.2 配置依赖注入 235
11.8 总结 236
第二部分 核心ASP.NET平台 238
第12章 使用Web窗体 238
12.1 创建示例项目 238
12.2 了解Web窗体文件 239
12.2.1 使用代码片段 240
12.2.2 了解可编程HTML元素 249
12.2.3 了解控件 250
12.3 了解代码隐藏类 251
12.4 了解Web窗体的工作机制 253
12.4.1 处理可编程HTML元素 254
12.4.2 编译Web窗体 255
12.5 使用母版页 257
12.5.1 配置母版页 258
12.5.2 了解母版页占位符 259
12.5.3 应用母版页 260
12.5.4 使用母版页代码隐藏类 261
12.5.5 嵌套母版页 263
12.6 总结 265
第13章 生命周期和上下文 266
13.1 创建示例项目 266
13.2 了解应用程序生命周期 270
13.3 了解请求生命周期 273
13.3.1 了解模块和处理程序 274
13.3.2 处理请求生命周期事件 276
13.3.3 在一个方法中处理多个事件 278
13.4 了解上下文对象 281
13.4.1 使用HttpContext对象 281
13.4.2 使用HttpApplication对象 282
13.4.3 使用HttpRequest对象 286
13.4.4 使用HttpResponse对象 288
13.5 进行组合 290
13.5.1 对请求计时 291
13.5.2 限制访问 292
13.5.3 记录请求信息 293
13.6 总结 293
第14章 模块 294
14.1 准备示例应用程序 294
14.2 了解模块 296
14.2.1 创建模块 296
14.2.2 注册模块 297
14.3 创建模块项目 298
14.3.1 创建Visual Studio项目 298
14.3.2 创建模块 299
14.3.3 注册模块 301
14.4 使用模块事件 302
14.4.1 定义模块事件 302
14.4.2 处理模块事件 303
14.4.3 按名称查找模块 306
14.5 使用内置模块 309
14.6 进行组合 313
14.7 总结 315
第15章 处理程序 316
15.1 准备示例应用程序 316
15.2 了解处理程序 317
15.3 处理程序和请求生命周期 318
15.4 创建一般处理程序 320
15.4.1 实现自定义行为 321
15.4.2 测试一般处理程序 322
15.5 创建自定义处理程序 324
15.5.1 创建自定义处理程序 324
15.5.2 注册自定义处理程序 325
15.6 创建自定义处理程序工厂 326
15.6.1 控制处理程序实例化 327
15.6.2 动态选择处理程序 329
15.6.3 重复使用处理程序 330
15.7 协调模块与处理程序 333
15.7.1 使用Items集合 334
15.7.2 使用声明式接口 337
15.8 进行组合 338
15.8.1 查找适当的内置处理程序工厂 339
15.8.2 扩展基类 340
15.8.3 编写处理程序 341
15.8.4 注册处理程序工厂 341
15.8.5 测试处理程序工厂 342
15.9 总结 343
第16章 页面和控件生命周期事件 344
16.1 准备示例应用程序 344
16.2 了解Page类 345
16.3 了解页面生命周期 349
16.4 处理控件事件 351
16.4.1 创建一个简单的控件 352
16.4.2 注册并应用控件 353
16.5 接收控件事件 355
16.6 了解端到端Web生命周期 359
16.7 页面上下文 360
16.7.1 访问上下文对象 361
16.7.2 设置Page指令值 361
16.7.3 提供特定于Web窗体的信息 362
16.8 进行组合 363
16.9 总结 365
第17章 管理请求执行过程 366
17.1 准备示例应用程序 366
17.2 使用URL重定向 368
17.2.1 执行URL重定向 369
17.2.2 手动执行重定向 371
17.3 管理处理程序选择和执行过程 372
17.3.1 预先选择处理程序 373
17.3.2 传输请求 374
17.3.3 通过显式执行处理程序生成响应 377
17.4 进行组合 378
17.4.1 创建用于查看源代码的处理程序 378
17.4.2 使用HTTP重定向 380
17.4.3 预先选择处理程序 381
17.4.4 执行多个处理程序 383
17.5 总结 387
第18章 管理状态数据 388
18.1 创建示例应用程序 388
18.2 了解状态数据 389
18.3 存储应用程序数据 390
18.4 存储用户数据 392
18.4.1 创建配置文件数据库 392
18.4.2 配置数据库连接 394
18.4.3 配置配置文件和配置文件属性 395
18.4.4 定义配置文件提供程序 396
18.4.5 定义配置文件属性 397
18.4.6 使用配置文件数据 398
18.5 存储会话数据 401
18.5.1 使用会话数据 401
18.5.2 配置会话数据 404
18.5.3 使用状态服务器 406
18.5.4 使用SQL数据库 407
18.6 使用视图数据 410
18.7 使用cookie 413
18.8 进行整合 414
18.8.1 创建模块 415
18.8.2 创建Web窗体 416
18.9 总结 419
第19章 缓存 420
19.1 准备示例应用程序 420
19.2 使用应用程序缓存 423
19.3 管理数据项缓存 424
19.4 使用依赖项缓存数据 426
19.4.1 使用内部依赖项缓存数据 428
19.4.2 创建自定义依赖项 429
19.4.3 使用聚合依赖项缓存数据 432
19.4.4 缓存具有过期约束条件的数据 433
19.4.5 使用清理优先级缓存数据 434
19.5 接收缓存通知 436
19.5.1 接收清除缓存通知 436
19.5.2 使用通知避免清除缓存 438
19.6 配置缓存 440
19.7 进行组合 441
19.8 总结 443
第20章 缓存输出 444
20.1 准备示例应用程序 444
20.2 缓存Web窗体输出 446
20.2.1 控制端到端缓存 447
20.2.2 缓存多个内容副本 448
20.2.3 创建缓存配置文件 451
20.3 选择性地更新内容 452
20.4 缓存用户控件输出 455
20.5 缓存服务器控件输出 459
20.6 创建缓存依赖项 460
20.7 使用自定义输出缓存 461
20.7.1 创建自定义缓存实现 462
20.7.2 注册自定义输出缓存实现 463
20.7.3 动态选择输出缓存实现 465
20.8 配置输出缓存 466
20.9 进行组合 467
20.9.1 创建处理程序工厂类 468
20.9.2 注册处理程序工厂 472
20.10 总结 473
第21章 处理错误 474
21.1 准备示例项目 474
21.2 了解错误 477
21.3 自定义默认行为 478
21.3.1 提供全包容性的错误页面 479
21.3.2 处理特定HTTP错误 483
21.3.3 指定特定于Web窗体的错误页面 489
21.4 控制错误处理过程 490
21.4.1 在Web窗体中处理错误 490
21.4.2 在应用程序级别处理错误 492
21.5 处理多个错误 495
21.5.1 报告错误 496
21.5.2 显示错误 496
21.5.3 拦截错误 497
21.6 进行组合 499
21.6.1 删除现有错误处理代码 499
21.6.2 定义模块 499
21.7 总结 501
第22章 管理路径 502
22.1 准备示例项目 502
22.1.1 创建模块 502
22.1.2 创建附加内容 504
22.2 使用路径 504
22.2.1 获取路径信息 505
22.2.2 操纵路径 508
22.3 管理虚拟路径 509
22.3.1 设置默认文档 510
22.3.2 处理针对无扩展名URL的请求 511
22.3.3 重写路径 513
22.4 使用友好URL程序包 515
22.4.1 禁用之前的示例 515
22.4.2 安装和配置NuGet程序包 516
22.4.3 使用FriendlyUrls库功能 517
22.5 进行组合 520
22.5.1 编写文件 520
22.5.2 重写路径 521
22.6 总结 524
第23章 URL路由 525
23.1 准备示例项目 525
23.2 为路由准备应用程序 526
23.3 使用固定路由 528
23.4 添加变量段 532
23.4.1 处理范围过大的路由 533
23.4.2 创建可删节URL 534
23.4.3 创建长度可变的段 540
23.5 路由段值模型绑定 542
23.6 生成传出URL 544
23.7 进行组合 546
23.7.1 生成诊断HTML 547
23.7.2 测试URL匹配 551
23.8 总结 551
第24章 高级URL路由 552
24.1 准备示例项目 552
24.2 使用高级约束条件 553
24.2.1 通过HTTP方法限制路由 553
24.2.2 创建自定义路由限制 555
24.3 路由文件请求 557
24.4 使用路由处理程序 560
24.4.1 阻止请求路由 560
24.4.2 创建自定义路由处理程序 564
24.5 创建自定义RouteBase实现 566
24.6 进行组合 569
24.6.1 禁用ASPX请求 569
24.6.2 路由到其他文件类型 571
24.6.3 让ASP.NET为传出URL选择路由 574
24.7 总结 577
第25章 身份验证和授权 578
25.1 准备示例项目 578
25.2 了解窗体身份验证 579
25.3 配置ASP.NET身份验证 581
25.4 执行身份验证 582
25.4.1 验证用户身份 584
25.4.2 获取身份验证信息 586
25.5 执行授权 587
25.5.1 了解授权和身份验证集成 587
25.5.2 创建授权策略 589
25.5.3 创建特定于位置的授权策略 593
25.6 避开授权 595
25.7 授权已路由的URL 597
25.8 进行组合 599
25.8.1 重建身份验证Web窗体 599
25.8.2 添加母版页 601
25.8.3 测试修订后的身份验证和授权 603
25.9 总结 603
第26章 成员资格 604
26.1 准备示例项目 604
26.2 在应用程序中添加成员资格 605
26.2.1 安装通用提供程序 605
26.2.2 为成员资格配置应用程序 606
26.2.3 创建用户和角色 610
26.2.4 使用成员资格执行身份验证 611
26.3 使用成员资格 612
26.3.1 执行密码更改 613
26.3.2 执行密码恢复 616
26.3.3 执行注册 621
26.4 进行组合 625
26.5 总结 627
第27章 ASP.NET配置 628
27.1 准备示例项目 628
27.2 了解配置层次结构 629
27.3 以编程方式获取配置信息 630
27.3.1 使用应用程序设置 631
27.3.2 处理连接字符串 634
27.3.3 使用配置节 638
27.3.4 处理整个配置 641
27.4 创建自定义配置节和组 644
27.4.1 创建简单的配置节 644
27.4.2 创建集合配置节 648
27.4.3 创建配置节组 652
27.5 使用外部配置文件 654
27.6 锁定配置节 655
27.7 进行组合 658
27.8 总结 659
第28章 异步请求处理 660
28.1 准备示例项目 660
28.2 了解问题所在 662
28.3 创建异步Web窗体 663
28.3.1 使用异步方法 665
28.3.2 创建和注册异步页面任务 666
28.3.3 执行多个任务 666
28.4 创建异步模块 669
28.5 创建异步处理程序 671
28.6 总结 672
第三部分 窗体和控件 674
第29章 使用控件 674
29.1 准备示例项目 674
29.2 了解控件 675
29.2.1 了解基本的控件类 676
29.2.2 使用控件以编程方式访问HTML元素 676
29.2.3 使用自定义控件生成HTML片段 678
29.2.4 使用自定义服务器控件 682
29.2.5 使用控件显示数据 685
29.2.6 使用控件模拟桌面开发 688
29.3 利用控件层次结构 691
29.3.1 在控件层次结构中导航 691
29.3.2 在层次结构中查找控件并操纵控件 693
29.3.3 以编程方式添加控件 696
29.4 进行组合 698
29.5 总结 701
第30章 窗体和请求验证 702
30.1 准备示例项目 702
30.2 了解服务器端form元素 703
30.3 检测窗体发布和回传 706
30.3.1 在查询字符串中查找窗体数据 708
30.3.2 检查POST请求 708
30.4 处理窗体数据 709
30.5 了解“一窗体”限制 712
30.6 了解请求验证 715
30.6.1 使用预先请求验证 717
30.6.2 使用延迟请求验证 718
30.6.3 使用未经验证的窗体数据 719
30.6.4 在控件中验证请求 722
30.7 进行组合 723
30.8 总结 725
第31章 创建自定义控件 726
31.1 准备示例项目 726
31.2 创建基本的控件 728
31.2.1 了解Control指令 728
31.2.2 注册和应用控件 729
31.2.3 在Web.config文件中注册控件 730
31.3 在控件中添加功能 732
31.4 了解控件ID 733
31.4.1 标识控件生成的HTML元素 734
31.4.2 标识控件层次结构内的控件 735
31.5 定义元素特性 736
31.5.1 创建枚举特性 738
31.5.2 创建集合特性 739
31.6 创建服务器控件 742
31.6.1 注册服务器控件 744
31.6.2 使用HtmlTextWriter类 746
31.7 进行组合 748
31.8 总结 749
第32章 有状态控件 750
32.1 准备示例项目 750
32.2 了解无状态性和控件生命周期 752
32.2.1 使用会话状态 753
32.2.2 通过窗体元素添加状态 754
32.2.3 使用视图状态 756
32.2.4 使用控件状态 759
32.3 管理应用程序视图状态 761
32.3.1 配置应用程序视图状态 764
32.3.2 配置Web窗体和控件视图状态 766
32.3.3 配置控件视图状态 767
32.4 进行组合 769
32.4.1 对input元素使用视图状态 772
32.4.2 在子控件中使用视图状态 775
32.4.3 视图状态数据不断增加 777
32.4.4 混淆视图状态与控件状态 778
32.5 总结 779
第33章 服务器端HTML元素 780
33.1 准备示例项目 780
33.2 了解服务器端元素 780
33.2.1 使用基类功能 781
33.2.2 使用容器元素 783
33.3 使用页面结构元素 785
33.4 处理窗体元素 787
33.4.1 使用input元素 787
33.4.2 使用其他窗体元素 793
33.5 使用HTML表 796
33.5.1 枚举表 796
33.5.2 使用特定表元素 799
33.5.3 以编程方式创建表 800
33.6 使用其他元素 802
33.7 进行组合 802
33.8 总结 804
第34章 模型绑定 805
34.1 准备示例项目 805
34.2 了解问题所在 807
34.3 应用模型绑定 809
34.4 处理模型绑定和验证错误 813
34.5 使用绑定特性 819
34.5.1 应用模型绑定特性 822
34.5.2 对复杂类型应用模型绑定特性 824
34.6 进行组合 825
34.6.1 创建自我验证模型类 825
34.6.2 创建字段级别的错误控件 827
34.7 总结 829
第35章 数据绑定 830
35.1 准备示例项目 830
35.2 了解数据绑定 834
35.2.1 配置数据绑定 834
35.2.2 组合元素和数据控件 837
35.3 编写自定义数据控件 840
35.3.1 管理数据控件视图状态 843
35.3.2 在自定义数据控件中添加模板 844
35.3.3 为模板添加功能 849
35.4 进行组合 851
35.5 总结 854
第36章 基本数据控件 855
36.1 选择数据控件 855
36.2 准备示例项目 856
36.3 使用列表数据控件 856
36.3.1 使用CheckBoxList控件 857
36.3.2 使用DropDownList控件 864
36.3.3 使用ListBox控件 865
36.3.4 使用RadioButtonList控件 868
36.3.5 使用BulletedList控件 869
36.4 使用Repeater控件 871
36.4.1 Repeater的标准用法 871
36.4.2 使用Repeater模板 872
36.4.3 以编程方式创建模板 874
36.5 进行组合 876
36.6 总结 879
第37章 复杂数据控件 880
37.1 准备示例项目 880
37.1.1 准备脚本管理 880
37.1.2 扩展CSS 881
37.2 使用FormView控件 881
37.2.1 定义代码隐藏类 882
37.2.2 定义模板 884
37.2.3 管理外部元素 886
37.2.4 使用FormView控件编辑数据 887
37.2.5 实现数据方法 893
37.2.6 了解FormView事件 895
37.3 使用ListView控件 896
37.3.1 使用ListView的基本功能 897
37.3.2 对数据分页 902
37.3.3 了解ListView事件 904
37.4 进行组合 904
37.5 总结 905
第38章 其他ASP.NET控件 906
38.1 准备示例应用程序 906
38.2 使用富UI控件 906
38.2.1 富UI控件过于抽象 908
38.2.2 富UI控件会修改元素的行为 908
38.2.3 富UI控件依赖于C#事件 909
38.2.4 将直接对富UI控件应用样式 909
38.3 选择富UI控件 910
38.4 使用其他控件 918
38.4.1 使用Literal控件 919
38.4.2 使用PlaceHolder控件 920
38.4.3 使用MultiView控件 922
38.5 进行组合 923
38.6 总结 925
第四部分 客户端开发 928
第39章 管理脚本和样式 928
39.1 准备示例项目 928
39.2 了解脚本管理问题 930
39.2.1 管理JavaScript文件版本 930
39.2.2 管理库依赖关系 931
39.2.3 管理简化 931
39.3 使用捆绑包 932
39.3.1 为捆绑包准备项目 932
39.3.2 创建脚本捆绑包 933
39.3.3 创建样式捆绑包 936
39.4 使用捆绑优化 937
39.4.1 使用本地优化 938
39.4.2 使用内容传送网络 942
39.5 确保库对控件可用 944
39.6 进行组合 946
39.7 总结 948
第40章 Ajax和Web服务 949
40.1 准备示例项目 949
40.2 使用Web API创建Web服务 951
40.2.1 了解目标 951
40.2.2 创建Web API控制器 952
40.2.3 创建路由配置 953
40.2.4 测试Web服务 954
40.2.5 实现控制器方法 957
40.3 应用Web服务 961
40.4 处理事件验证 965
40.4.1 禁用事件验证 967
40.4.2 替换控件 968
40.5 进行组合 969
40.6 总结 971
第41章 客户端验证 972
41.1 准备示例项目 972
41.1.1 安装JavaScript程序包 975
41.1.2 创建验证脚本捆绑包 975
41.2 使用HTML5验证 976
41.3 使用内置验证控件 979
41.4 直接应用验证特性 983
41.5 删除重复的验证策略 986
41.6 进行组合 990
41.6.1 更新Web服务 990
41.6.2 更新模型对象 990
41.6.3 创建JavaScript 991
41.7 总结 992
第42章 针对移动设备 994
42.1 准备示例项目 994
42.2 标识移动设备 996
42.3 切换移动设备的母版页 999
42.4 传送不同的Web窗体 1002
42.4.1 安装和配置程序包 1002
42.4.2 传送自定义内容 1003
42.4.3 允许用户进行选择 1004
42.5 进行组合 1006
42.6 总结 1008