Matthew MacDonald
Beginning ASP.NET 2.0
in VB 2005
From Novice to Professional
6218ch00FM.qxd 3/24/06 5:21 PM Page i
Beginning ASP.NET 2.0 in VB 2005: From Novice to Professional
Copyright © 2006 by Matthew MacDonald
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-621-0
ISBN-10 (pbk): 1-59059-621-8
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: Ewan Buckingham
Technical Reviewer: Andy Olsen
Editorial Board: Steve Anglin, Ewan Buckingham, Gary Cornell, Jason Gilmore, Jonathan Gennick,
Jonathan Hassell, James Huddleston, Chris Mills, Matthew Moodie, Dominic Shakeshaft, Jim Sumser,
Keir Thomas, Matt Wade
Project Manager | Production Director: Grace Wong
Copy Edit Manager: Nicole LeClerc
Copy Editors: Jennifer Whipple, Kim Wimpsett
Assistant Production Director: Kari Brooks-Copony
Production Editor: Kelly Winquist
Compositor and Artist: Kinetic Publishing Services, LLC
Proofreaders: Lori Bring, Elizabeth Berry
Indexer: Michael Brinkman
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 , or
visit .
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 , or visit .
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 in the Source Code section.
6218ch00FM.qxd 3/24/06 5:21 PM Page ii
For Faria
6218ch00FM.qxd 3/24/06 5:21 PM Page iii
6218ch00FM.qxd 3/24/06 5:21 PM Page iv
Contents at a Glance
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxi
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxiii
PART 1
■ ■ ■
Introducing .NET
■CHAPTER 1 Introducing the .NET Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
■CHAPTER 2 Learning the VB 2005 Language. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
■CHAPTER 3 Types, Objects, and Namespaces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
■CHAPTER 4 Introducing Visual Studio 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
PART 2
■ ■ ■
Developing ASP.NET Applications
■CHAPTER 5 Web Form Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
■CHAPTER 6 Web Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
■CHAPTER 7 Tracing, Logging, and Error Handling . . . . . . . . . . . . . . . . . . . . . . . . . . 209
■CHAPTER 8 Validation and Rich Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
■CHAPTER 9 State Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
■CHAPTER 10 Master Pages and Themes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
■CHAPTER 11 Website Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
■CHAPTER 12 Deploying ASP.NET Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
PART 3
■ ■ ■
Working with Data
■CHAPTER 13 ADO.NET Fundamentals. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
■CHAPTER 14 Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
■CHAPTER 15 The Data Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
■CHAPTER 16 Files and Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
■CHAPTER 17 XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631
v
6218ch00FM.qxd 3/24/06 5:21 PM Page v
PART 4
■ ■ ■
Website Security
■CHAPTER 18 Security Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681
■CHAPTER 19 Membership. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713
■CHAPTER 20 Profiles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755
PART 5
■ ■ ■
Web Services
■CHAPTER 21 Web Services Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 785
■CHAPTER 22 Creating Web Services. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 797
■CHAPTER 23 Enhancing Web Services. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835
PART 6
■ ■ ■
Advanced ASP.NET
■CHAPTER 24 Component-Based Programming. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 867
■CHAPTER 25 Custom Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 901
■CHAPTER 26 Caching and Performance Tuning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 951
■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 993
vi
6218ch00FM.qxd 3/24/06 5:21 PM Page vi
Contents
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxi
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxiii
PART 1
■ ■ ■
Introducing .NET
■CHAPTER 1 Introducing the .NET Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
The Evolution of Web Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
HTML and HTML Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Server-Side Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Client-Side Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
The Problems with ASP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
The .NET Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
VB 2005, C#, and the .NET Languages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
The Intermediate Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Other .NET Languages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
The Common Language Runtime. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
The .NET Class Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Visual Studio 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
.NET 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
ASP.NET 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Visual Studio 2005. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
■CHAPTER 2 Learning the VB 2005 Language . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
The .NET Languages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
The Evolution of Visual Basic. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
vii
6218ch00FM.qxd 3/24/06 5:21 PM Page vii
Variables and Data Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Assignment and Initializers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Enumerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Variable Operations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Advanced Math . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Type Conversions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Object-Based Manipulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
The String Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
The DateTime and TimeSpan Types . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
The Array Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Conditional Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
The If End If Block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
The Select Case Block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Loop Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
The For Next Block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
The For Each Block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
The Do Loop Block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Method Overloading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Delegates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
■CHAPTER 3 Types, Objects, and Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . 51
The Basics of Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Shared and Instance Members . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
A Simple Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Building a Basic Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Creating an Object. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Adding Properties. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Adding a Basic Method. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Adding a Constructor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Adding a Basic Event. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Testing the Product Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Value Types and Reference Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Assignment Operations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Equality Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Passing Parameters by Reference and by Value. . . . . . . . . . . . . . . . . 68
Reviewing .NET Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
■CONTENTSviii
6218ch00FM.qxd 3/24/06 5:21 PM Page viii
Understanding Namespaces and Assemblies. . . . . . . . . . . . . . . . . . . . . . . . 71
Using Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Importing Namespaces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Assemblies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Advanced Class Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Shared Members . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Casting Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Partial Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Generics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
■CHAPTER 4 Introducing Visual Studio 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
The Promise of Visual Studio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Creating a Website . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
The Solution Explorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Designing a Web Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Adding Web Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
The Properties Window. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Adding Ordinary HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
HTML Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Writing Code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Adding Event Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
IntelliSense and Outlining. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Assembly References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Namespace Imports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Visual Studio Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Single-Step Debugging. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Variable Watches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
PART 2
■ ■ ■
Developing ASP.NET Applications
■CHAPTER 5 Web Form Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
The Anatomy of an ASP.NET Application . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
ASP.NET File Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
ASP.NET Application Directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Application Updates. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
■CONTENTS ix
6218ch00FM.qxd 3/24/06 5:21 PM Page ix
A Simple One-Page Web Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
The ASP Solution—and Its Problems. . . . . . . . . . . . . . . . . . . . . . . . . 126
The ASP.NET Solution: Server Controls. . . . . . . . . . . . . . . . . . . . . . . . 127
HTML Server Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
View State. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
The HTML Control Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Improving the Currency Converter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Adding Multiple Currencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Storing Information in the List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Adding Linked Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Setting Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
A Deeper Look at HTML Control Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . 145
HTML Control Events. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Advanced Events with the HtmlInputImage Control. . . . . . . . . . . . . 147
The HtmlControl Base Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
The HtmlContainerControl Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
The HtmlInputControl Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
The Page Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
The Controls Collection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
The HttpRequest Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
The HttpResponse Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
The HttpServerUtility Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
ASP.NET Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
The web.config File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Nested Configuration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Storing Custom Settings in the web.config File . . . . . . . . . . . . . . . . 160
Modifying web.config Settings Programmatically . . . . . . . . . . . . . . 163
The Website Administration Tool (WAT) . . . . . . . . . . . . . . . . . . . . . . . 164
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
■CHAPTER 6 Web Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Stepping Up to Web Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Basic Web Control Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
The Web Control Tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
■CONTENTSx
6218ch00FM.qxd 3/24/06 5:21 PM Page x
Web Control Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
The WebControl Base Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
Units. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Enumerated Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Colors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Fonts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Focus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
The Default Button. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
List Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Multiple-Select List Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
The BulletedList Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Table Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Web Control Events and AutoPostBack . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
How Postback Events Work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
The Page Life Cycle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
A Simple Web Page. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
Improving the Greeting Card Applet . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Generating the Cards Automatically . . . . . . . . . . . . . . . . . . . . . . . . . . 205
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
■CHAPTER 7 Tracing, Logging, and Error Handling. . . . . . . . . . . . . . . . . . . . . 209
Common Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Exception Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
The Exception Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
The Exception Chain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Handling Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Catching Specific Exceptions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Nested Exception Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Exception Handling in Action . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Mastering Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
Throwing Your Own Exceptions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
Logging Exceptions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Using the EventLog Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Custom Logs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Retrieving Log Information. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Error Pages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Error Modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
A Custom Error Page. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Specific Custom Error Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
■CONTENTS xi
6218ch00FM.qxd 3/24/06 5:21 PM Page xi
Page Tracing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Enabling Tracing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Tracing Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Writing Trace Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
Application-Level Tracing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
■CHAPTER 8 Validation and Rich Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
The Validation Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
The Validation Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Client-Side Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
The Validator Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
A Simple Validation Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Other Display Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Manual Validation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Understanding Regular Expressions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Literals and Metacharacters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Finding a Regular Expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
A Validated Customer Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
Validation Groups. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Rich Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
The Calendar Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
The AdRotator. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Pages with Multiple Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
The MultiView Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
The Wizard Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
■CHAPTER 9 State Management. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
The Problem of State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
View State. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
A View State Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Making View State Secure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
■CONTENTSxii
6218ch00FM.qxd 3/24/06 5:21 PM Page xii
Retaining Member Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
Storing Custom Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
Transferring Information. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Cross-Page Posting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
The Query String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Custom Cookies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
A Cookie Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
Session State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Session Tracking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Using Session State. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
A Session State Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
Session State Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
Cookieless. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
Timeout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Application State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
An Overview of State Management Choices. . . . . . . . . . . . . . . . . . . . . . . . 339
The Global.asax Application File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
Application Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
■CHAPTER 10 Master Pages and Themes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
Master Page Basics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
A Simple Master Page and Content Page . . . . . . . . . . . . . . . . . . . . . 345
How Master Pages and Content Pages Are Connected. . . . . . . . . . 348
A Master Page with Multiple Content Regions . . . . . . . . . . . . . . . . . 350
Default Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
Master Pages and Relative Paths . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
Advanced Master Pages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Table-Based Layouts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Code in a Master Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
Interacting with a Master Page Programmatically . . . . . . . . . . . . . . 360
Themes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
How Themes Work. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Applying a Simple Theme. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
■CONTENTS xiii
6218ch00FM.qxd 3/24/06 5:21 PM Page xiii
Handling Theme Conflicts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
Creating Multiple Skins for the Same Control. . . . . . . . . . . . . . . . . . 368
Skins with Templates and Images . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
■CHAPTER 11 Website Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
Site Maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
Defining a Site Map. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
Seeing a Simple Site Map in Action . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Binding an Ordinary Page to a Site Map . . . . . . . . . . . . . . . . . . . . . . 380
Binding a Master Page to a Site Map. . . . . . . . . . . . . . . . . . . . . . . . . 381
Binding Portions of a SiteMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
Navigating Programmatically. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
Mapping URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
The SiteMapPath Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
Customizing the SiteMapPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
Using SiteMapPath Styles and Templates . . . . . . . . . . . . . . . . . . . . . 394
Adding Custom Site Map Information. . . . . . . . . . . . . . . . . . . . . . . . . 396
The TreeView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
TreeView Properties. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
TreeView Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
The Menu Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Menu Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
Menu Templates. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
■CHAPTER 12 Deploying ASP.NET Applications . . . . . . . . . . . . . . . . . . . . . . . . . . 411
ASP.NET Applications and the Web Server . . . . . . . . . . . . . . . . . . . . . . . . . 411
How Web Servers Work. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Web Application URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
Web Farms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
IIS (Internet Information Services) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
Installing IIS 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
Installing IIS 6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
■CONTENTSxiv
6218ch00FM.qxd 3/24/06 5:21 PM Page xiv
Registering the ASP.NET File Mappings . . . . . . . . . . . . . . . . . . . . . . . 420
Verifying That ASP.NET Is Correctly Installed. . . . . . . . . . . . . . . . . . . 421
Managing Websites with IIS Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
Creating a Virtual Directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Virtual Directories and Web Applications . . . . . . . . . . . . . . . . . . . . . . 426
Configuring an Existing Virtual Directory . . . . . . . . . . . . . . . . . . . . . . 428
Adding a Virtual Directory to Your Neighborhood . . . . . . . . . . . . . . . 434
Deploying a Simple Site . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
Web Applications and Components . . . . . . . . . . . . . . . . . . . . . . . . . . 437
Other Configuration Steps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
The ASPNET Account. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
Code Compilation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
Deploying with Visual Studio 2005. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
Creating a Virtual Directory for a New Project . . . . . . . . . . . . . . . . . 443
Copying a Website . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
Publishing a Website . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
PART 3
■ ■ ■
Working with Data
■CHAPTER 13 ADO.NET Fundamentals. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
ADO.NET and Data Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
The Role of the Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
Database Access in the Internet World. . . . . . . . . . . . . . . . . . . . . . . . 453
Introducing ADO.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
SQL Server 2005 Express Edition . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
Browsing and Modifying Databases in Visual Studio. . . . . . . . . . . . 456
SQL Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
Running Queries in Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459
The Select Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
The SQL Update Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
The SQL Insert Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
The SQL Delete Statement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
■CONTENTS xv
6218ch00FM.qxd 3/24/06 5:21 PM Page xv
ADO.NET Basics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
Data Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
The Data Provider Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Direct Data Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Importing the Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
Creating a Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
The Connection String. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
Windows Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
Connection String Tips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
Making the Connection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
Defining a Select Command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
Using a Command with a DataReader . . . . . . . . . . . . . . . . . . . . . . . . 479
Putting It All Together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
Filling the List Box . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
Updating Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484
Enhancing the Author Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
Creating More Robust Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . 489
Disconnected Data Access. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
Selecting Disconnected Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
Selecting Multiple Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
Modifying Disconnected Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503
Adding Rows to a DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
Updating Disconnected Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505
The CommandBuilder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505
Updating a DataTable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
Controlling Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
A Disconnected Update Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508
Concurrency Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
A Concurrency Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
■CHAPTER 14 Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
Introducing Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
Types of ASP.NET Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
How Data Binding Works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
■CONTENTSxvi
6218ch00FM.qxd 3/24/06 5:21 PM Page xvi
Single-Value Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
A Simple Data Binding Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
Simple Data Binding with Properties . . . . . . . . . . . . . . . . . . . . . . . . . 521
Problems with Single-Value Data Binding. . . . . . . . . . . . . . . . . . . . . 522
Using Code Instead of Simple Data Binding . . . . . . . . . . . . . . . . . . . 523
Repeated-Value Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524
Data Binding with Simple List Controls . . . . . . . . . . . . . . . . . . . . . . . 524
A Simple List Binding Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
Generic Collections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
Multiple Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
Data Binding and View State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
Data Binding with a Dictionary Collection . . . . . . . . . . . . . . . . . . . . . 530
Using the DataValueField Property . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
Data Binding with ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
Creating a Record Editor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
Data Source Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
The Page Life Cycle with Data Binding . . . . . . . . . . . . . . . . . . . . . . . 542
The SqlDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543
Selecting Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
Parameterized Commands. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
Handling Errors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
Updating Records. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555
■CHAPTER 15 The Data Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
The GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
Automatically Generating Columns. . . . . . . . . . . . . . . . . . . . . . . . . . . 558
Defining Columns. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560
Formatting the GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564
Formatting Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564
Using Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566
Formatting-Specific Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
Selecting a GridView Row . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
Adding a Select Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572
Using Selection to Create Master-Details Pages . . . . . . . . . . . . . . . 574
■CONTENTS xvii
6218ch00FM.qxd 3/24/06 5:21 PM Page xvii
Editing with the GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576
Sorting and Paging the GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
Sorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
Paging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
Using GridView Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
Using Multiple Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
Editing Templates in Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
Handling Events in a Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589
Editing with a Template. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
The DetailsView and FormView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595
The DetailsView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
The FormView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600
■CHAPTER 16 Files and Streams. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
Files and Web Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
File System Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602
The Directory and File Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603
The DirectoryInfo and FileInfo Classes. . . . . . . . . . . . . . . . . . . . . . . . 608
The DriveInfo Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610
A Sample File Browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611
Reading and Writing with Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
Text Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
Binary Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617
Shortcuts for Reading and Writing Files. . . . . . . . . . . . . . . . . . . . . . . 619
A Simple Guest Book. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620
Allowing File Uploads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
The FileUpload Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
The HtmlInputFile Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
■CHAPTER 17 XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631
XML’s Hidden Role in .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631
Configuration Files. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631
ADO.NET Data Access. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632
■CONTENTSxviii
6218ch00FM.qxd 3/24/06 5:21 PM Page xviii
Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632
Anywhere Miscellaneous Data Is Stored . . . . . . . . . . . . . . . . . . . . . . 632
XML Explained . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632
Improving the List with XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 634
XML Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636
Attributes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637
Comments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639
The XML Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639
The XML TextWriter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
The XML Text Reader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642
Working with XML Documents in Memory . . . . . . . . . . . . . . . . . . . . 648
Reading an XML Document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653
Searching an XML Document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656
XML Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
XML Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
XSD Documents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659
Validating an XML Document. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 660
XML Display and Transforms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
The Xml Web Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 666
XML Data Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667
Nonhierarchical Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668
Hierarchical Binding with the TreeView . . . . . . . . . . . . . . . . . . . . . . . 670
Binding to XML Content from Other Sources . . . . . . . . . . . . . . . . . . 672
XML in ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
Accessing a DataSet As XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674
Accessing XML Through the DataSet . . . . . . . . . . . . . . . . . . . . . . . . . 676
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678
PART 4
■ ■ ■
Website Security
■CHAPTER 18 Security Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681
Determining Security Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681
Restricted File Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682
Security Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682
■CONTENTS xix
6218ch00FM.qxd 3/24/06 5:21 PM Page xix
The ASP.NET Security Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683
Security Strategies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686
Certificates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686
Secure Sockets Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688
Forms Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Web.config Settings. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
Authorization Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692
The WAT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
The Login Page. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698
Windows Authentication. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703
IIS Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703
Web.config Settings. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705
A Windows Authentication Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707
Impersonation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709
Programmatic Impersonation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
■CHAPTER 19 Membership . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713
The Membership Data Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 714
Membership with SQL Server 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . 715
Configuring the Membership Provider . . . . . . . . . . . . . . . . . . . . . . . . 718
Manually Creating the Membership Tables . . . . . . . . . . . . . . . . . . . . 723
Creating Users with the WAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725
The Membership and MembershipUser Classes . . . . . . . . . . . . . . . 727
Authentication with Membership . . . . . . . . . . . . . . . . . . . . . . . . . . . . 731
Disabled Accounts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 732
The Security Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
The Login Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734
The CreateUserWizard Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739
The PasswordRecovery Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744
Role-Based Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746
Creating and Assigning Roles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 747
Restricting Access Based on Roles. . . . . . . . . . . . . . . . . . . . . . . . . . . 750
The LoginView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753
■CONTENTSxx
6218ch00FM.qxd 3/24/06 5:21 PM Page xx
■CHAPTER 20 Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755
Understanding Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 756
Profile Performance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 756
How Profiles Store Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 757
Using the SqlProfileProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759
Enabling Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759
Profiles with SQL Server 2005 Express Edition . . . . . . . . . . . . . . . . 760
Configuring the Profile Provider to Use a Different Database. . . . . 761
Manually Creating the Profile Tables . . . . . . . . . . . . . . . . . . . . . . . . . 763
The Profile Databases. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 764
Defining Profile Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 766
Using Profile Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767
Profile Serialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769
Profile Groups. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 771
Profiles and Custom Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772
The Profile API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 777
Anonymous Profiles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 779
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 782
PART 5
■ ■ ■
Web Services
■CHAPTER 21 Web Services Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 785
Internet Programming Then and Now . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 785
Components and the COM Revolution . . . . . . . . . . . . . . . . . . . . . . . . 786
Web Services and the Programmable Web . . . . . . . . . . . . . . . . . . . . 787
When Web Services Make Sense . . . . . . . . . . . . . . . . . . . . . . . . . . . . 787
The Open-Standards Plumbing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 788
Web Services Description Language . . . . . . . . . . . . . . . . . . . . . . . . . 789
A Sample SOAP Message. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 790
Communicating with a Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 791
Web Service Discovery. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 792
DISCO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793
Universal Description, Discovery, and Integration . . . . . . . . . . . . . . 793
WS-Interoperability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 794
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 795
■CONTENTS xxi
6218ch00FM.qxd 3/24/06 5:21 PM Page xxi
■CHAPTER 22 Creating Web Services. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 797
Web Service Basics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 797
Configuring a Web Service Project . . . . . . . . . . . . . . . . . . . . . . . . . . . 798
The StockQuote Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 800
Understanding the StockQuote Service . . . . . . . . . . . . . . . . . . . . . . . 801
Web Services with Code-Behind. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 801
The ASP.NET Intrinsic Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 803
Documenting Your Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 804
Descriptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 804
The XML Namespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 805
Conformance Claims. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 806
Testing Your Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 807
The Web Service Test Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 808
Service Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 809
Method Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 810
Testing a Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 811
Web Service Data Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 813
The StockQuote Service with a Data Object . . . . . . . . . . . . . . . . . . . 814
Consuming a Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 818
Configuring a Web Service Client in Visual Studio . . . . . . . . . . . . . . 818
The Role of the Proxy Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 819
Creating a Web Reference in Visual Studio . . . . . . . . . . . . . . . . . . . . 820
Creating a Proxy with WSDL.exe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 822
Dissecting the Proxy Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 824
Dynamic Web Service URLs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 827
Using the Proxy Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828
Waiting and Timeouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 829
Web Service Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 830
Connecting Through a Proxy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 831
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 831
■CHAPTER 23 Enhancing Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835
State Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835
The StockQuote Service with State Management . . . . . . . . . . . . . . 836
Consuming a Stateful Web Service. . . . . . . . . . . . . . . . . . . . . . . . . . . 838
■CONTENTSxxii
6218ch00FM.qxd 3/24/06 5:21 PM Page xxii
Web Service Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 842
Windows Authentication with a Web Service . . . . . . . . . . . . . . . . . . 843
Ticket-Based Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 847
Ticket-Based Authentication with SOAP Headers. . . . . . . . . . . . . . . 849
Using SOAP Headers in the Client. . . . . . . . . . . . . . . . . . . . . . . . . . . . 852
Web Service Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853
An Example with TerraService. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855
Adding the Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 856
Testing the Client. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857
Searching for More Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 859
Displaying a Tile. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 860
Windows Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 862
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 864
PART 6
■ ■ ■
Advanced ASP.NET
■CHAPTER 24 Component-Based Programming . . . . . . . . . . . . . . . . . . . . . . . . . 867
Why Use Components?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 867
Component Jargon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869
Three-Tier Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869
Encapsulation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 871
Data Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 871
Business Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 871
Components and Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 872
Creating a Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 872
Classes and Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 874
Adding a Reference to the Component . . . . . . . . . . . . . . . . . . . . . . . 876
Using the Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 878
Properties and State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 880
A Stateful Account Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 881
A Stateless AccountUtility Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 882
Data-Access Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 883
A Simple Data-Access Component. . . . . . . . . . . . . . . . . . . . . . . . . . . 884
Using the Data-Access Component . . . . . . . . . . . . . . . . . . . . . . . . . . 888
■CONTENTS xxiii
6218ch00FM.qxd 3/24/06 5:21 PM Page xxiii
Enhancing the Component with Error Handling . . . . . . . . . . . . . . . . 891
Enhancing the Component with Aggregate Information . . . . . . . . . 892
The ObjectDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 893
Making Classes the ObjectDataSource Can Understand. . . . . . . . . 894
Selecting Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 894
Using Method Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 895
Updating Records. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 897
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 899
■CHAPTER 25 Custom Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 901
User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 901
Creating a Simple User Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 902
Independent User Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 905
Integrated User Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 907
User Control Events. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 910
Passing Information with Events. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 912
User Control Limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 916
Custom Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 916
Creating a Simple Derived Control . . . . . . . . . . . . . . . . . . . . . . . . . . . 917
Creating a Custom Control Library . . . . . . . . . . . . . . . . . . . . . . . . . . . 919
Using a Custom Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 920
Custom Controls and Default Values . . . . . . . . . . . . . . . . . . . . . . . . . 923
Changing Control Rendering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 925
Creating a Web Control from Scratch. . . . . . . . . . . . . . . . . . . . . . . . . 929
Maintaining State Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 931
Design-Time Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 934
Creating a Composite Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 935
Custom Control Events and Postbacks. . . . . . . . . . . . . . . . . . . . . . . . 937
Dynamic Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 943
Basic Drawing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 943
Drawing Custom Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 946
Placing Custom Images Inside Web Pages . . . . . . . . . . . . . . . . . . . . 947
The Last Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 949
■CONTENTSxxiv
6218ch00FM.qxd 3/24/06 5:21 PM Page xxiv