Apress.Pro.ASP.NET.2.0.in.VB.2005.Jan

Pro ASP.NET 2.0
in VB 2005

Laurence Moroney
Matthew MacDonald (Ed.)

Pro ASP.NET 2.0 in VB 2005
Copyright © 2006 by Laurence Moroney, Matthew MacDonald (Ed.), K. Scott Allen, James Avery, Russ
Basiura, Mike Batongbacal, Marco Bellinaso, Matt Butler, Andreas Eide, Daniel Cazzulino, Michael Clark,
Richard Conway, Robert Eisenberg, Brady Gaster, James Greenwood, Kevin Hoffman, Erik Johansson,
Angelo Kastroulis, Dan Kent, Sitaraman Lakshminarayanan, Don Lee, Christopher Miller, Matt Milner,
Jan Narkiewicz, Matt Odhner, Ryan O’Keefe, Andrew Reid, Matthew Reynolds, Enrico Sabbadin, Bill Sempf,
Doug Seven, Srinivasa Sivkumar, Thiru Thangarathinam, Doug Thews
All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording, or by any information storage or retrieval
system, without the prior written permission of the copyright owner and the publisher.
ISBN-13 (pbk): 978-1-59059-563-3
ISBN-10 (pbk): 1-59059-563-7
Library of Congress Cataloging-in-Publication data is available upon request.
Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1
Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence

of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark
owner, with no intention of infringement of the trademark.
Lead Editor: Tony Davis
Technical Reviewer: Andy Olsen
Editorial Board: Steve Anglin, Dan Appleman, Ewan Buckingham, Gary Cornell, Tony Davis, Jason Gilmore,
Jonathan Hassell, Chris Mills, Dominic Shakeshaft, Jim Sumser
Project Manager: Richard Dal Porto
Copy Edit Manager: Nicole LeClerc
Copy Editor: Kim Wimpsett
Assistant Production Director: Kari Brooks-Copony
Production Editor: Linda Marousek
Compositor and Artist: Kinetic Publishing Services, LLC
Proofreaders: Linda Seifert and Nancy Sixsmith
Indexer: Broccoli Information Management
Cover Designer: Kurt Krames
Manufacturing Director: Tom Debolski
Distributed to the book trade worldwide by Springer-Verlag New York, Inc., 233 Spring Street, 6th Floor,
New York, NY 10013. Phone 1-800-SPRINGER, fax 201-348-4505, e-mail [email protected], or
visit http://www.springeronline.com.
For information on translations, please contact Apress directly at 2560 Ninth Street, Suite 219, Berkeley, CA

94710. Phone 510-549-5930, fax 510-549-5939, e-mail [email protected], or visit http://www.apress.com.
The information in this book is distributed on an “as is” basis, without warranty. Although every precaution
has been taken in the preparation of this work, neither the author(s) nor Apress shall have any liability to
any person or entity with respect to any loss or damage caused or alleged to be caused directly or indirectly
by the information contained in this work.
The source code for this book is available to readers at http://www.apress.com in the Source Code section.
You will need to answer questions pertaining to this book in order to successfully download the code.

I would like to dedicate this book to a few people
without whom it never would have been possible.
To Yaacov and Philippe Cohen at Mainsoft,
who are remarkable men creating an excellent working
environment with God at its center. I appreciate every minute,
every conversation, and every e-mail I get from you guys.
Thanks!
To my wife, Rebecca, and children, Claudia and Christopher,
for their eternal patience and support.
Thank you so much!
To the God of Abraham, Isaac, Jacob, and Jesus
through whom all things are possible.


Contents at a Glance

About the Author. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii
About the Editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxi
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxiii

PART 1
■CHAPTER
■CHAPTER
■CHAPTER
■CHAPTER
■CHAPTER
■CHAPTER

PART 2
■CHAPTER
■CHAPTER
■CHAPTER

■CHAPTER
■CHAPTER
■CHAPTER
■CHAPTER

PART 3
■CHAPTER
■CHAPTER
■CHAPTER
■CHAPTER
■CHAPTER

■■■
1
2
3
4
5
6


Introducing ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Visual Studio 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Web Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Server Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
ASP.NET Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
State Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

■■■
7
8
9
10
11
12
13

Data Access

ADO.NET Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Data Components and the DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265

Data Binding. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
Rich Data Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
Files and Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469

■■■
14
15
16
17
18

Core Concepts

Building ASP.NET Websites

User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
Themes and Master Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
Website Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553

Resources and Localization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
Website Deployment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
v

59cf4c9f76dd75c1cc678ccf0261fa69

PART 4
■CHAPTER
■CHAPTER
■CHAPTER
■CHAPTER
■CHAPTER
■CHAPTER
■CHAPTER
■CHAPTER

PART 5
■CHAPTER
■CHAPTER
■CHAPTER

■CHAPTER
■CHAPTER

PART 6

■■■
19
20
21
22
23
24
25
26

The ASP.NET Security Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669
Forms Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
Membership . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709
Windows Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751
Authorization and Roles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 777

Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 803
Cryptography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 839
Custom Membership Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 867

■■■
27
28
29
30
31

Security

Advanced User Interface

Custom Server Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 897
Design-Time Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 939
JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 973
Dynamic Graphics and GDI+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011
Portals with WebPart Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1043


■■■

Web Services

■CHAPTER 32 Creating Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1087
■CHAPTER 33 Web Service Standards and Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . 1129
■CHAPTER 34 Advanced Web Services. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1173
■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1209

vi

Contents

About the Author. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii
About the Editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxi
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxiii

PART 1


■■■

■CHAPTER 1

Core Concepts

Introducing ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
The Evolution of Web Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
The Development World Before ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
What’s Wrong with Classic ASP? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
ASP.NET 1.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Seven Important Facts About ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Fact 1: ASP.NET Is Integrated with the .NET Framework . . . . . . . . . . . . . . . 7
Fact 2: ASP.NET Is Compiled, Not Interpreted. . . . . . . . . . . . . . . . . . . . . . . . 7
Fact 3: ASP.NET Is Multilanguage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Fact 4: ASP.NET Runs Inside the Common Language Runtime . . . . . . . . . 11
Fact 5: ASP.NET Is Object-Oriented . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Fact 6: ASP.NET Is Multidevice and Multibrowser . . . . . . . . . . . . . . . . . . . 14
Fact 7: ASP.NET Is Easy to Deploy and Configure . . . . . . . . . . . . . . . . . . . 14
ASP.NET 2.0: The Story Continues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Visual Basic 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Visual Studio 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
ASP.NET 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

■CHAPTER 2

Visual Studio 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
The .NET Development Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
The Compiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
The Visual Studio 2005 IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Websites in Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Projectless Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Migrating a Visual Studio .NET Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Designing a Web Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
vii

viii

■CONTENTS

The Visual Studio IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Solution Explorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Document Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Toolbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Error List and Task List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Server Explorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
The Code Editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Adding Assembly References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
IntelliSense and Outlining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
The Coding Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
How Code-Behind Files Are Connected to Pages . . . . . . . . . . . . . . . . . . . . 50
How Control Tags Are Connected to Page Variables . . . . . . . . . . . . . . . . . 50
How Events Are Connected to Event Handlers . . . . . . . . . . . . . . . . . . . . . . 51
Visual Studio Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Single-Step Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Advanced Breakpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Variable Watches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Visual Studio Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
ASP.NET Development Helper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

■CHAPTER 3

Web Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Page Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
HTML Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Dynamic Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
The ASP.NET Event Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Automatic Postbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
View State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
XHTML Compliance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Web Forms Processing Stages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Page Framework Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
User Code Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Event Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Automatic Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Cleanup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
A Page Flow Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
The Page As a Control Container . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Showing the Control Tree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
The Page Header . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Dynamic Control Creation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

■CONTENTS

The Page Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Session, Application, and Cache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Response . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
User . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Trace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Accessing the HTTP Context in Another Class . . . . . . . . . . . . . . . . . . . . . 101
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

■CHAPTER 4

Server Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Types of Server Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
The Server Control Hierarchy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
HTML Server Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
The HtmlControl Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
The HtmlContainerControl Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
The HtmlInputControl Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
The HTML Server Control Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Setting Style Attributes and Other Properties . . . . . . . . . . . . . . . . . . . . . . 110
Programmatically Creating Server Controls . . . . . . . . . . . . . . . . . . . . . . . 111
Handling Server-Side Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Web Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
The WebControl Base Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Basic Web Control Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Units . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Enumerated Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Colors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Fonts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Focus. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
The Default Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Scrollable Panels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Handling Web Control Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
The List Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
The Selectable List Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
The BulletedList Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Input Validation Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
The Validation Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
The Validation Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
The BaseValidator Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
The RequiredFieldValidator Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
The RangeValidator Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

ix

x

■CONTENTS

The CompareValidator Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
The RegularExpressionValidator Control . . . . . . . . . . . . . . . . . . . . . . . . . 137
The CustomValidator Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
The ValidationSummary Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Using the Validators Programmatically . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Validation Groups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
The ASP.NET Rich Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
The AdRotator Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
The Calendar Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149

■CHAPTER 5

ASP.NET Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Anatomy of an ASP.NET Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
The Application Domain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Application Lifetime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Application Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Application Directory Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
The Global.asax Application File. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Application Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Demonstrating Application Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
ASP.NET Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
The Machine.config File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
The Web.config File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Configuration Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Reading and Writing Configuration Sections Programmatically . . . . . . . 169
The Website Administration Tool (WAT) . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Extending the Configuration File Structure. . . . . . . . . . . . . . . . . . . . . . . . 173
Encrypting Configuration Sections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
.NET Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Creating a Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Using a Component Through the App_Code Directory . . . . . . . . . . . . . . . 179
Using a Component Through the Bin Directory . . . . . . . . . . . . . . . . . . . . 180
Extending the HTTP Pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
HTTP Handlers and HTTP Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Creating a Custom HTTP Handler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Configuring a Custom HTTP Handler . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Registering HTTP Handlers Without Configuring IIS . . . . . . . . . . . . . . . . . 187
Creating an Advanced HTTP Handler . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
Creating a Custom HTTP Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193

■CONTENTS

■CHAPTER 6

State Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
ASP.NET State Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
View State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
A View State Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Storing Objects in View State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Retaining Member Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Assessing View State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Trimming View State in a List Control . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
View State Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Transferring Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
The Query String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Cross-Page Posting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Cross-Page Posting and Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Custom Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Session State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Session Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Using Session State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Configuring Session State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Securing Session State. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Application State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Shared Application Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226

PART 2

■■■

■CHAPTER 7

Data Access

ADO.NET Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
The ADO.NET Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
ADO.NET Data Providers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Standardization in ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
SQL Server 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Fundamental ADO.NET Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
The Connection Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Connection Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Testing a Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Connection Pooling. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Connection Statistics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
The Command and DataReader Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Command Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
The DataReader Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242

xi

xii

■CONTENTS

The ExecuteReader() Method and the DataReader . . . . . . . . . . . . . . . . . 242
The ExecuteScalar() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
The ExecuteNonQuery() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
SQL Injection Attacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
Using Parameterized Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Calling Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Transactions and ASP.NET Applications . . . . . . . . . . . . . . . . . . . . . . . . . . 254
Isolation Levels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Savepoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Nested Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Provider-Agnostic Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Creating the Factory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
Create Objects with Factory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
A Query with Provider-Agnostic Code . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263

■CHAPTER 8

Data Components and the DataSet . . . . . . . . . . . . . . . . . . . . . . . . . 265
Building a Data Access Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
The Data Package. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
The Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
The Data Utility Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Testing the Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Disconnected Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Web Applications and the DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
XML Integration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
The DataSet Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
The DataTable Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
The DataRow Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
The DataAdapter Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
Filling a DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Working with Multiple Tables and Relationships . . . . . . . . . . . . . . . . . . . 282
Searching for Specific Rows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Using the DataSet in a Custom Data Class . . . . . . . . . . . . . . . . . . . . . . . 286
Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
The DataView Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
Sorting with a DataView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
Filtering with a DataView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Advanced Filtering with Relationships . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Calculated Columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294

■CONTENTS

■CHAPTER 9

Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
Basic Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Single-Value Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Other Types of Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Repeated-Value Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Data Source Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
The Page Life Cycle with Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . 310
The SqlDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Selecting Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Parameterized Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Handling Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
Updating Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
Disadvantages of the SqlDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
The ObjectDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Selecting Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Updating Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Updating with a Data Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
The Limits of the Data Source Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
The Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Adding the Extra Items . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Handling the Extra Options with the SqlDataSource . . . . . . . . . . . . . . . . 333
Handling the Extra Options with the ObjectDataSource . . . . . . . . . . . . . . 334
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334

■CHAPTER 10 Rich Data Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
The GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Defining Columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Formatting the GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
Formatting Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
Formatting-Specific Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
GridView Row Selection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
Using Selection to Create a Master-Details Form . . . . . . . . . . . . . . . . . . 347
The SelectedIndexChanged Event . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
Using a Data Field As a Select Button . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Sorting the GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Sorting with the SqlDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
Sorting with the ObjectDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
Sorting and Selection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
Advanced Sorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354

xiii

xiv

■CONTENTS

Paging the GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Automatic Paging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
Custom Pagination with the ObjectDataSource . . . . . . . . . . . . . . . . . . . . 357
Customizing the Pager Bar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
GridView Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
Using Multiple Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Editing Templates in Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Binding to a Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Handling Events in a Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
Editing with a Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
The DetailsView and FormView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
The DetailsView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
The FormView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
Advanced Grids . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
Summaries in the GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
A Parent/Child View in a Single Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
Serving Images from a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
Detecting Concurrency Conflicts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389

■CHAPTER 11 Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
Understanding ASP.NET Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Output Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
Declarative Output Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
Caching and the Query String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
Caching with Specific Query String Parameters . . . . . . . . . . . . . . . . . . . 395
Custom Caching Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
Caching with the HttpCachePolicy Class . . . . . . . . . . . . . . . . . . . . . . . . . 397
Post-Cache Substitution and Fragment Caching . . . . . . . . . . . . . . . . . . . 398
Cache Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Caching to Disk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Data Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Adding Items to the Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
A Simple Cache Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Cache Priorities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
Caching with the Data Source Controls . . . . . . . . . . . . . . . . . . . . . . . . . . 406
Cache Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
File and Cache Item Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
Aggregate Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
The Item Removed Callback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Understanding SQL Cache Notifications . . . . . . . . . . . . . . . . . . . . . . . . . . 413
Cache Notifications in SQL Server 2000 or SQL Server 7 . . . . . . . . . . . . 415
Cache Notifications in SQL Server 2005 . . . . . . . . . . . . . . . . . . . . . . . . . 419

■CONTENTS

Custom Cache Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
A Basic Custom Cache Dependency . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
A Custom Cache Dependency Using Message Queues . . . . . . . . . . . . . . 422
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424

■CHAPTER 12 XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
When Does Using XML Make Sense? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
An Introduction to XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
The Advantages of XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
Well-Formed XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428
XML Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428
XML Schemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
Writing and Reading XML Programmatically . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
Writing XML Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431
Reading XML Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
Searching an XML Document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
Validating XML Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
Displaying XML Content with XSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
A Basic Stylesheet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
Using XslCompiledTransform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
Using the Xml Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
XML Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Nonhierarchical Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Using XPath Binding Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Nested Grids . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Hierarchical Binding with the TreeView . . . . . . . . . . . . . . . . . . . . . . . . . . 457
Using XSLT to Prepare Data for Binding in a TreeView. . . . . . . . . . . . . . . 460
Binding to XML Content from Other Sources . . . . . . . . . . . . . . . . . . . . . . 461
Updating XML Through the XmlDataSource . . . . . . . . . . . . . . . . . . . . . . . 462
XML and ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
Converting the DataSet to XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
Accessing a DataSet As XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
Executing an XML Query . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468

■CHAPTER 13 Files and Streams. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Working with the File System. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
The Directory and File Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
The DirectoryInfo and FileInfo Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
The DriveInfo Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
Working with Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
Filter Files with Wildcards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477

xv

xvi

■CONTENTS

Retrieving File Version Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
The Path Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
A File Browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
Reading and Writing Files with Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
Text Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
Binary Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
Uploading Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
Making Files Safe for Multiple Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
Compression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
Serialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498

PART 3

■■■

Building ASP.NET Websites

■CHAPTER 14 User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
User Control Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502
Creating a Simple User Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502
Converting a Page to a User Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
Adding Code to a User Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
Handling Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
Adding Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
Using Custom Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508
Adding Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
Exposing the Inner Web Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513
Dynamically Loading User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
Portal Frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
Partial Page Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
VaryByControl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
Sharing Cached Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521

■CHAPTER 15 Themes and Master Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
Standardizing Website Formatting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
Cascading Style Sheets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
Themes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526
Theme Folders and Skins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
Applying a Simple Theme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
Handling Theme Conflicts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
Creating Multiple Skins for the Same Control . . . . . . . . . . . . . . . . . . . . . 530
Skins with Templates and Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
Using CSS in a Theme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533

■CONTENTS

Applying Themes Through a Configuration File . . . . . . . . . . . . . . . . . . . . 534
Applying Themes Dynamically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
Standardizing Web