■CHAPTER 10 Rich Data Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
The GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
Defining Columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
Formatting the GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
Formatting Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Formatting-Specific Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
GridView Row Selection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Using Selection to Create a Master-Details Form . . . . . . . . . . . . . . . . . . . . 398
The SelectedIndexChanged Event . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Using a Data Field As a Select Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Sorting the GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Sorting with the SqlDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Sorting with the ObjectDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Sorting and Selection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Advanced Sorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
xiv ■CONTENTS
Paging the GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
Automatic Paging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
Custom Pagination with the ObjectDataSource. . . . . . . . . . . . . . . . . . . . . . 408
Customizing the Pager Bar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
GridView Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
Using Multiple Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
Editing Templates in Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
Binding to a Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
Handling Events in a Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
Editing with a Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
The ListView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Grouping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
Paging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428
The DetailsView and FormView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
The DetailsView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
The FormView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
Advanced Grids. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
Summaries in the GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
A Parent/Child View in a Single Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
Editing a Field Using a Lookup Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
Serving Images from a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
Detecting Concurrency Conflicts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
■CHAPTER 11 Caching and Asynchronous Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Understanding ASP.NET Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Output Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
Declarative Output Caching. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
Caching and the Query String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Caching with Specific Query String Parameters . . . . . . . . . . . . . . . . . . . . . 454
Custom Caching Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Caching with the HttpCachePolicy Class . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
Post-Cache Substitution and Fragment Caching . . . . . . . . . . . . . . . . . . . . 457
Cache Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459
Cache Configuration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
Data Caching. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
Adding Items to the Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
A Simple Cache Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
Cache Priorities. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
Caching with the Data Source Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
Cache Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
File and Cache Item Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Aggregate Dependencies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
■CONTENTS xv
The Item Removed Callback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Understanding SQL Cache Notifications . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
Cache Notifications in SQL Server 2000 and SQL Server 7 . . . . . . . . . . . . 474
Cache Notifications in SQL Server 2005 and SQL Server 2008 . . . . . . . . 479
Custom Cache Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
A Basic Custom Cache Dependency. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
A Custom Cache Dependency Using Message Queues . . . . . . . . . . . . . . . 483
Asynchronous Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
Creating an Asynchronous Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
Querying Data in an Asynchronous Page. . . . . . . . . . . . . . . . . . . . . . . . . . . 488
Handling Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
Using Caching with Asynchronous Tasks . . . . . . . . . . . . . . . . . . . . . . . . . . 492
Multiple Asynchronous Tasks and Timeouts . . . . . . . . . . . . . . . . . . . . . . . . 495
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
■CHAPTER 12 Files and Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
Working with the File System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
The Directory and File Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
The DirectoryInfo and FileInfo Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
The DriveInfo Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503
Working with Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
Filter Files with Wildcards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
Retrieving File Version Information. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
The Path Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507
A File Browser. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
Reading and Writing Files with Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
Text Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
Binary Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Uploading Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
Making Files Safe for Multiple Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
Compression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
Serialization. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
■CHAPTER 13 LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
LINQ Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
Deferred Execution. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
How LINQ Works. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
LINQ Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
LINQ Expressions “Under the Hood” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
LINQ to DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544
Typed DataSets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Null Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
xvi ■CONTENTS
LINQ to SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
Data Entity Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
The DataContext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
LINQ to SQL Queries “Under the Hood” . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
LINQ to SQL and Database Components . . . . . . . . . . . . . . . . . . . . . . . . . . . 554
Selecting a Single Record or Value. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
Generating Data Classes Automatically . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
Relationships. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563
Generating Methods for Stored Procedures. . . . . . . . . . . . . . . . . . . . . . . . . 571
Committing Changes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
The LinqDataSource. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
Displaying Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
Getting Related Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
Editing Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Validation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586
■CHAPTER 14 XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
When Does Using XML Make Sense?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
An Introduction to XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
The Advantages of XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589
Well-Formed XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
XML Namespaces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
XML Schemas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592
Stream-Based XML Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594
Writing XML Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594
Reading XML Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
In-Memory XML Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600
The XmlDocument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
The XPathNavigator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
The XDocument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Searching XML Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
Searching with XmlDocument. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
Searching XmlDocument with XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
Searching XDocument with LINQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617
Validating XML Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
A Basic Schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
Validating with XmlDocument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
Validating with XDocument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
Transforming XML Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
A Basic Stylesheet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
Using XslCompiledTransform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623
■CONTENTS xvii
Using the Xml Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
Transforming XML with LINQ to XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
XML Data Binding. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
Nonhierarchical Binding. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
Using XPath. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
Nested Grids . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632
Hierarchical Binding with the TreeView . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
Using XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
Binding to XML Content from Other Sources. . . . . . . . . . . . . . . . . . . . . . . . 637
Updating XML Through the XmlDataSource . . . . . . . . . . . . . . . . . . . . . . . . 637
XML and the ADO.NET DataSet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638
Converting the DataSet to XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639
Accessing a DataSet As XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642
PART 3 ■ ■ ■ Building ASP.NET Websites
■CHAPTER 15 User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
User Control Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
Creating a Simple User Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 646
Converting a Page to a User Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
Adding Code to a User Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648
Handling Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648
Adding Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649
Using Custom Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 651
Adding Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 654
Exposing the Inner Web Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
Dynamically Loading User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
Portal Frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658
Partial Page Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
VaryByControl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662
Sharing Cached Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
■CHAPTER 16 Themes and Master Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
Cascading Style Sheets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
Creating a Stylesheet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
Applying Stylesheet Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668
xviii ■CONTENTS
Themes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670
Theme Folders and Skins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671
Applying a Simple Theme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672
Handling Theme Conflicts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
Creating Multiple Skins for the Same Control . . . . . . . . . . . . . . . . . . . . . . . 674
Skins with Templates and Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
Using CSS in a Theme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677
Applying Themes Through a Configuration File . . . . . . . . . . . . . . . . . . . . . 677
Applying Themes Dynamically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678
Standardizing Website Layout. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
Master Page Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
A Simple Master Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681
A Simple Content Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683
Default Content. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684
Master Pages with Tables and CSS Layout . . . . . . . . . . . . . . . . . . . . . . . . . 685
Master Pages and Relative Paths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
Applying Master Pages Through a Configuration File. . . . . . . . . . . . . . . . . 688
Advanced Master Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Interacting with the Master Page Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Dynamically Setting a Master Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690
Nesting Master Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693
■CHAPTER 17 Website Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
Pages with Multiple Views. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
The MultiView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696
The Wizard Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 700
Site Maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707
Defining a Site Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
Binding to a Site Map. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710
Breadcrumbs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
Showing a Portion of the Site Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713
The Site Map Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716
Adding Custom Site Map Information. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
Creating a Custom SiteMapProvider. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
URL Mapping. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725
Security Trimming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 726
The TreeView Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728
The TreeNode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 729
Populating Nodes on Demand. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 731
TreeView Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
■CONTENTS xix
The Menu Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 737
Menu Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 740
Menu Templates. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 743
■CHAPTER 18 Website Deployment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
Internet Information Services (IIS). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
IIS Websites and Virtual Directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746
IIS Management Console and IIS Configuration . . . . . . . . . . . . . . . . . . . . . 747
Mapping Websites, Virtual Directories, and Files to URLs . . . . . . . . . . . . . 748
Diving into the Architecture of IIS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750
Installing IIS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765
Managing Websites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 771
Managing Virtual Directories and Websites with IIS 5.x and IIS 6.0. . . . . . . 772
Managing Application Pools in IIS 6.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778
Managing Virtual Directories and Websites with IIS 7.0. . . . . . . . . . . . . . . 784
Managing Application Pools in IIS 7.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 796
Deploying Your ASP.NET Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798
Verifying the ASP.NET Installation on IIS 5.x and IIS 6.0 . . . . . . . . . . . . . . 800
ASP.NET Side-By-Side Execution on IIS 5.x and IIS 6.0. . . . . . . . . . . . . . . 801
ASP.NET Side-By-Side Execution on IIS 7.0 . . . . . . . . . . . . . . . . . . . . . . . . 803
Configuring HTTP Runtime Settings when Deploying on IIS 5.x . . . . . . . . 803
Compilation Models in ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 804
Deploying with Visual Studio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 808
Visual Studio 2005 Web Deployment Projects . . . . . . . . . . . . . . . . . . . . . . 809
The VirtualPathProvider in ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815
Health Monitoring in ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 819
Understanding the Basic Structure. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
Events and Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 823
PART 4 ■ ■ ■ Security
■CHAPTER 19 The ASP.NET Security Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 827
What It Means to Create Secure Software. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 827
Understanding Potential Threats. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828
Secure Coding Guidelines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828
Understanding Gatekeepers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 829
Understanding the Levels of Security. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 830
Authentication. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 831
Authorization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 832
xx ■CONTENTS
Confidentiality and Integrity. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 833
Pulling It All Together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 833
Internet Information Services Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835
Authentication and Authorization on IIS 5.x and IIS 6.0 . . . . . . . . . . . . . . . 835
Security Configuration on IIS 7.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 838
Understanding Secure Sockets Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843
ASP.NET Security Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 852
Authentication. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853
Authorization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855
The Security Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855
Membership and Roles APIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 858
■CHAPTER 20 Forms Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 859
Introducing Forms Authentication. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 859
Why Use Forms Authentication? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 860
Why Would You Not Use Forms Authentication?. . . . . . . . . . . . . . . . . . . . . 862
Why Not Implement Cookie Authentication Yourself? . . . . . . . . . . . . . . . . 863
The Forms Authentication Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 864
Implementing Forms Authentication. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865
Configuring Forms Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865
Denying Access to Anonymous Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869
Creating a Custom Login Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869
Custom Credentials Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876
Persistent Cookies in Forms Authentication . . . . . . . . . . . . . . . . . . . . . . . . 877
IIS 7.0 and Forms Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 878
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 884
■CHAPTER 21 Membership . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885
Introducing the ASP.NET Membership API. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885
Using the Membership API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 888
Configuring Forms Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 889
Creating the Data Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 890
Configuring Connection String and Membership Provider . . . . . . . . . . . . . 896
Creating and Authenticating Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 900
Using the Security Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 902
The Login Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 904
The LoginStatus Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 914
The LoginView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915
The PasswordRecovery Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 916
The ChangePassword Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 921
The CreateUserWizard Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 922
■CONTENTS xxi
Configuring Membership in IIS 7.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 926
Configuring Providers and Users. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 926
Using the Membership API with Other Applications . . . . . . . . . . . . . . . . . . 928
Using the Membership Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
Retrieving Users from the Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
Updating Users in the Store. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933
Creating and Deleting Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933
Validating Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 934
Using Membership in Windows Forms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 935
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 937
■CHAPTER 22 Windows Authentication. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 939
Introducing Windows Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 939
Why Use Windows Authentication? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 940
Why Would You Not Use Windows Authentication? . . . . . . . . . . . . . . . . . . 941
Mechanisms for Windows Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . 942
Implementing Windows Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 948
Configuring IIS 5.x or IIS 6.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 948
Configuring IIS 7.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 950
Configuring ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 952
Denying Access to Anonymous Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 955
Accessing Windows User Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 957
Impersonation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 962
Impersonation in Windows 2000 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 963
Impersonation on Windows XP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 964
Impersonation and Delegation on Windows Server 2003 . . . . . . . . . . . . . 964
Impersonation on Windows Vista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 967
Impersonation and Delegation on Windows Server 2008 . . . . . . . . . . . . . 968
Configured Impersonation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 968
Programmatic Impersonation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 970
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 973
■CHAPTER 23 Authorization and Roles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975
URL Authorization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975
Authorization Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 976
File Authorization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 981
Authorization Checks in Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 982
Using the IsInRole() Method. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 982
Using the PrincipalPermission Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 983
Using the Roles API for Role-Based Authorization . . . . . . . . . . . . . . . . . . . . . . . . 985
Using the LoginView Control with Roles. . . . . . . . . . . . . . . . . . . . . . . . . . . . 991
Accessing Roles Programmatically. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 992
Using the Roles API with Windows Authentication . . . . . . . . . . . . . . . . . . . 994
xxii ■CONTENTS
Protecting Non-ASP.NET Resources in IIS 5 and 6 . . . . . . . . . . . . . . . . . . . . . . . . 997
Adding a File Type Mapping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997
Writing a Custom HTTP Handler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 998
Authorization and Roles in IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1000
Authorization with ASP.NET Roles in IIS 7.0 . . . . . . . . . . . . . . . . . . . . . . . 1002
Managing ASP.NET Roles with IIS 7.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1005
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1006
■CHAPTER 24 Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009
Understanding Profiles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009
Profile Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009
How Profiles Store Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1010
Profiles and Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011
Profiles vs. Custom Data Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011
Using the SqlProfileProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1012
Creating the Profile Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1012
Configuring the Provider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1015
Defining Profile Properties. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1016
Using Profile Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1017
Profile Serialization. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1018
Profile Groups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1020
Profiles and Custom Data Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1021
The Profiles API. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1024
Anonymous Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1026
Custom Profile Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1029
The Custom Profile Provider Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1029
Designing the FactoredProfileProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1031
Coding the FactoredProfileProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1033
Testing the FactoredProfileProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1037
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1040
■CHAPTER 25 Cryptography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1041
Encrypting Data: Confidentiality Matters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1041
The .NET Cryptography Namespace. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1042
Understanding the .NET Cryptography Classes. . . . . . . . . . . . . . . . . . . . . . . . . . 1046
Symmetric Encryption Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1047
Asymmetric Encryption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1048
The Abstract Encryption Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1049
The ICryptoTransform Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1050
The CryptoStream Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1050
■CONTENTS xxiii
Encrypting Sensitive Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1051
Managing Secrets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1052
Using Symmetric Algorithms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1053
Using Asymmetric Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1058
Encrypting Sensitive Data in a Database . . . . . . . . . . . . . . . . . . . . . . . . . . 1061
Encrypting the Query String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1065
Wrapping the Query String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1066
Creating a Test Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1069
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1070
■CHAPTER 26 Custom Membership Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1071
Architecture of Custom Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1071
Basic Steps for Creating Custom Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1073
Overall Design of the Custom Provider . . . . . . . . . . . . . . . . . . . . . . . . . . . 1073
Designing and Implementing the Custom Store . . . . . . . . . . . . . . . . . . . . 1074
Implementing the Provider Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1082
Using the Custom Provider Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1102
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1106
PART 5 ■ ■ ■ Advanced User Interface
■CHAPTER 27 Custom Server Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1109
Custom Server Control Basics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1109
Creating a Bare-Bones Custom Control . . . . . . . . . . . . . . . . . . . . . . . . . . . 1110
Using a Custom Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1112
Custom Controls in the Toolbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1113
Creating a Web Control That Supports Style Properties . . . . . . . . . . . . . . 1114
The Rendering Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1118
Dealing with Different Browsers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1119
The HtmlTextWriter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1119
Browser Detection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1120
Browser Properties. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1122
Overriding Browser Type Detection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1124
Adaptive Rendering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1125
Control State and Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1127
View State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1127
Control State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1129
Postback Data and Change Events. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1131
Triggering a Postback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1133
Extending Existing Web Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1135
Composite Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1135
End SidebarDerived Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1138
xxiv ■CONTENTS
Template Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1141
Creating a Template Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1141
Using Customized Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1143
Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1148
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1150
■CHAPTER 28 Design-Time Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1151
The Key Players . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1151
Design-Time Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1152
The Properties Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1153
Attributes and Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1157
The Toolbox Icon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1158
Web Resources. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1159
Creating a Resource. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1159
Retrieving a Resource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1160
Text Substitution. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1161
Code Serialization. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1162
Type Converters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1162
Serialization Attributes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1170
Type Editors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1172
Control Designers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1174
Design-Time HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1175
Smart Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1177
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1182
■CHAPTER 29 Dynamic Graphics and GDI+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1183
The ImageMap Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1183
Creating Hotspots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1184
Handling Hotspot Clicks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1185
A Custom Hotspot. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1186
Drawing with GDI+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1188
Simple Drawing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1189
Image Format and Quality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1191
The Graphics Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1192
Using a GraphicsPath. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1194
Pens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1195
Brushes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1198
Embedding Dynamic Graphics in a Web Page . . . . . . . . . . . . . . . . . . . . . . . . . . 1199
Using the PNG Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1200
Passing Information to Dynamic Images . . . . . . . . . . . . . . . . . . . . . . . . . . 1201
Custom Controls That Use GDI+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1204
Charting with GDI+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1208
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1213
■CONTENTS xxv
■CHAPTER 30 Portals with Web Part Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1215
Typical Portal Pages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1216
Basic Web Part Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1217
Creating the Page Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1218
WebPartManager and WebPartZone Controls . . . . . . . . . . . . . . . . . . . . . . 1219
Adding Web Parts to the Page. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1221
Customizing the Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1224
Creating Web Parts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1226
Simple Web Part Tasks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1227
Developing Advanced Web Parts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1235
Web Part Editors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1244
Connecting Web Parts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1250
Custom Verbs and Web Parts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1258
User Controls and Advanced Web Parts. . . . . . . . . . . . . . . . . . . . . . . . . . . 1259
Uploading Web Parts Dynamically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1262
Authorizing Web Parts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1268
Final Tasks for Personalization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1268
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1269
PART 6 ■ ■ ■ Client-Side Programming
■CHAPTER 31 JavaScript and Ajax Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1273
JavaScript Essentials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1273
The HTML Document Object Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1274
Client-Side Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1275
Script Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1277
Manipulating HTML Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1279
Debugging JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1280
Basic JavaScript Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1282
Creating a JavaScript Page Processor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1282
Using JavaScript to Download Images Asynchronously. . . . . . . . . . . . . . 1285
Rendering Script Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1290
Script Injection Attacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1291
Request Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1291
Disabling Request Validation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1292
Custom Controls with JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1294
Pop-Up Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1294
Rollover Buttons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1298
Frames. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1301
Frame Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1302
Inline Frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1303
xxvi ■CONTENTS
Understanding Ajax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1304
The XMLHttpRequest Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1305
An Ajax Example. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1307
Using Ajax with Client Callbacks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1311
Creating a Client Callback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1311
Client Callbacks “Under the Hood”. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1317
Client Callbacks in Custom Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1318
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1322
■CHAPTER 32 ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1323
Introducing ASP.NET AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1323
ASP.NET AJAX on the Client: The Script Libraries . . . . . . . . . . . . . . . . . . 1325
ASP.NET AJAX on the Server: The ScriptManager . . . . . . . . . . . . . . . . . . 1325
Server Callbacks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1326
Web Services in ASP.NET AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1327
The Web Service Proxy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1334
Placing a Web Method in a Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1336
ASP.NET AJAX Application Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1337
ASP.NET AJAX Server Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1344
Partial Rendering with the UpdatePanel. . . . . . . . . . . . . . . . . . . . . . . . . . . 1344
Timed Refreshes with the Timer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1351
Time-Consuming Updates with UpdateProgress. . . . . . . . . . . . . . . . . . . . 1352
Deeper into the Client Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1355
Understanding the Client Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1356
Object-Oriented Programming in JavaScript. . . . . . . . . . . . . . . . . . . . . . . 1357
The Web-Page Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1364
Control Extenders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1369
Installing the ASP.NET AJAX Control Toolkit . . . . . . . . . . . . . . . . . . . . . . . 1370
The AutoCompleteExtender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1371
The ASP.NET AJAX Control Toolkit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1374
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1378
■CHAPTER 33 Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1379
Understanding Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1379
Silverlight vs. Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1380
Silverlight Adoption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1382
Silverlight and WPF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1382
Installing Silverlight and the Visual Studio Extensions . . . . . . . . . . . . . . . 1383
Creating a Silverlight Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1384
The HTML Entry Page. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1385
The Silverlight Initialization Script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1386
The XAML Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1388
The XAML Code-Behind. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1391
■CONTENTS xxvii
Properties and Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1392
Silverlight Compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1393
Silverlight Essentials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1394
.NET Framework Classes in Silverlight . . . . . . . . . . . . . . . . . . . . . . . . . . . 1395
The Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1396
Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1401
Interacting with HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1402
Isolated Storage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1406
Silverlight and ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1408
ASP.NET Futures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1408
Communicating Between Silverlight and ASP.NET . . . . . . . . . . . . . . . . . . 1412
Drawing in 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1412
Simple Shapes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1413
Paths and Geometries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1417
Brushes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1425
Transparency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1427
Animation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1429
Animation Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1430
Defining an Animation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1430
An Interactive Animation Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1434
Transforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1437
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1440
■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1441
Expand