Upload
others
View
8
Download
0
Embed Size (px)
Citation preview
ASP.NET 3.5UNLEASHED
800 East 96th Street, Indianapolis, Indiana 46240 USA
Stephen Walther
ASP.NET 3.5 UnleashedCopyright © 2008 by Sams Publishing
All rights reserved. No part of this book shall be reproduced, stored in a retrievalsystem, or transmitted by any means, electronic, mechanical, photocopying, recording,or otherwise, without written permission from the publisher. No patent liability isassumed with respect to the use of the information contained herein. Although everyprecaution has been taken in the preparation of this book, the publisher and authorassume no responsibility for errors or omissions. Nor is any liability assumed fordamages resulting from the use of the information contained herein.
ISBN-13: 978-0-672-33011-7ISBN-10: 0-672-33011-3
Library of Congress Cataloging-in-Publication Data
Walther, Stephen.ASP.NET 3.5 unleashed / Stephen Walther.
p. cm.Includes index.ISBN 0-672-33011-3
1. Active server pages. 2. Web sites—Design. 3. Web site development. 4. Microsoft .NET. I. Title.
TK5105.8885.A26W3516 2007005.2’76—dc22
2007046046
Printed in the United States on America
First Printing December 2007
TrademarksAll terms mentioned in this book that are known to be trademarks or service markshave been appropriately capitalized. Sams Publishing cannot attest to the accuracy ofthis information. Use of a term in this book should not be regarded as affecting thevalidity of any trademark or service mark.
Warning and DisclaimerEvery effort has been made to make this book as complete and as accurate as possible, but no warranty or fitness is implied. The information provided is on an “asis” basis. The author and the publisher shall have neither liability nor responsibility toany person or entity with respect to any loss or damages arising from the informationcontained in this book or from the use of the CD or programs accompanying it.
Bulk SalesSams Publishing offers excellent discounts on this book when ordered in quantity forbulk purchases or special sales. For more information, please contact
U.S. Corporate and Government [email protected]
For sales outside of the U.S., please contact
International [email protected]
Editor-in-ChiefKaren Gettman
Senior AcquisitionsEditorNeil Rowe
Development EditorMark Renfrow
Managing EditorGina Kanouse
Project EditorsLori LyonsAnne Goebel
Copy EditorBart Reed
IndexerErika Millen
ProofreadersWatercrest PublishingSan Dee Phillips
Technical EditorTodd Meister
PublishingCoordinatorCindy Teeters
Multimedia DeveloperDan Scherf
Book DesignerGary Adair
CompositionJake McFarland
Contents at a Glance
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Part I Building ASP.NET Pages
1 Overview of the ASP.NET Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2 Using the Standard Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
3 Using the Validation Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
4 Using the Rich Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Part II Designing ASP.NET Websites
5 Designing Websites with Master Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
6 Designing Websites with Themes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
7 Creating Custom Controls with User Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
Part III Performing Data Access
8 Overview of Data Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
9 Using the SqlDataSource Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
10 Using List Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
11 Using the GridView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
12 Using the DetailsView and FormView Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563
13 Using the Repeater and DataList Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
14 Using the ListView and DataPager Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
Part IV Building Components
15 Building Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
16 Using the ObjectDataSource Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 737
17 Building Data Access Components with ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 809
18 Data Access with LINQ to SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 901
Part V Site Navigation
19 Using the Navigation Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 971
20 Using Site Maps. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1041
21 Advanced Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1081
Part VI Security
22 Using the Login Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1103
23 Using ASP.NET Membership . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1161
Part VII Building ASP.NET Applications
24 Maintaining Application State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1221
25 Caching Application Pages and Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1289
26 Localizing Applications for Multiple Languages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1369
27 Working with the HTTP Runtime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1403
28 Configuring Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1443
Part VIII Custom Control Building
29 Building Custom Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1499
30 Building Templated Databound Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1569
Part IX ASP.NET AJAX
31 Using Server-Side ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1597
32 Using the ASP.NET AJAX Control Toolkit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1657
33 Using Client-Side ASP.NET AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1695
Part X Sample Application
34 Building a Code Sample Website . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1773
Index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1797
Table of Contents
Introduction 1
Who Should Read This Book? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1What Do You Need to Know Before You Read This Book? . . . . . . . . . . . . . . . . . . . . . . . 1Changes to This Book. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2How This Book Is Organized. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Part I Building ASP.NET Pages
1 Overview of the ASP.NET Framework 7
ASP.NET and the .NET Framework. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11Understanding the Framework Class Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11Understanding the Common Language Runtime . . . . . . . . . . . . . . . . . . . . . . . . . 18
Understanding ASP.NET Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20Overview of ASP.NET Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20Understanding HTML Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22Understanding and Handling Control Events. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23Understanding View State. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Understanding ASP.NET Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35Understanding Dynamic Compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35Understanding Control Trees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38Using Code-Behind Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40Handling Page Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45Using the Page.IsPostBack Property . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48Debugging and Tracing ASP.NET Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49Tracing Page Execution. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Installing the ASP.NET Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
2 Using the Standard Controls 61
Displaying Information. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61Using the Label Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61Using the Literal Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Accepting User Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70Using the TextBox Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70Using the CheckBox Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78Using the RadioButton Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Submitting Form Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86Using the Button Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86Using the LinkButton Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88Using the ImageButton Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91Using Client Scripts with Button Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95Performing Cross-Page Posts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98Specifying a Default Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102Handling the Command Event . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Displaying Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106Using the Image Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106Using the ImageMap Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Using the Panel Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113Using the HyperLink Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
3 Using the Validation Controls 123
Overview of the Validation Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123Validation Controls and JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128Using Page.IsValid. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128Setting the Display Property . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129Highlighting Validation Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130Using Validation Groups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135Disabling Validation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Using the RequiredFieldValidator Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141Using the RangeValidator Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145Using the CompareValidator Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147Using the RegularExpressionValidator Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153Using the CustomValidator Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156Using the ValidationSummary Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164Creating Custom Validation Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Creating a LengthValidator Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169Creating an AjaxValidator Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
4 Using the Rich Controls 181
Accepting File Uploads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181Saving Files to the File System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183Saving Files to a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186Uploading Large Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Displaying a Calendar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197Creating a Pop-up Date Picker. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201Rendering a Calendar from a Database Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
ASP.NET 3.5 Unleashedvi
Displaying Advertisements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208Storing Advertisements in an XML File. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209Storing Advertisements in a Database Table. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213Tracking Impressions and Transfers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Displaying Different Page Views. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221Displaying a Tabbed Page View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222Displaying a Multi-Part Form. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Displaying a Wizard. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Part II Designing ASP.NET Websites
5 Designing Websites with Master Pages 237
Creating Master Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238Creating Default Content. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242Nesting Master Pages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245Using Images and Hyperlinks in Master Pages. . . . . . . . . . . . . . . . . . . . . . . . . . . . 251Registering Master Pages in Web Configuration . . . . . . . . . . . . . . . . . . . . . . . . . 254
Modifying Master Page Content. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255Using the Title Attribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255Using the Page Header Property . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256Exposing Master Page Properties. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258Using FindControl with Master Pages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Loading Master Pages Dynamically. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263Loading Master Pages Dynamically for Multiple Content Pages . . . . 266
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
6 Designing Websites with Themes 269
Creating Themes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270Adding Skins to Themes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
Creating Named Skins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272Themes Versus StyleSheetThemes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275Disabling Themes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276Registering Themes in the Web Configuration File . . . . . . . . . . . . . . . . . . . . . 279
Adding Cascading Style Sheets to Themes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280Adding Multiple Cascading Style Sheets to a Theme . . . . . . . . . . . . . . . . . . . 284Changing Page Layouts with Cascading Style Sheets . . . . . . . . . . . . . . . . . . . 284
Creating Global Themes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289Applying Themes Dynamically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
Applying Skins Dynamically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Contents vii
7 Creating Custom Controls with User Controls 297
Creating User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298Registering User Controls in the Web Configuration File . . . . . . . . . . . . . 301Exposing Properties from a User Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302Exposing Events from a User Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305Creating an AddressForm Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
AJAX and User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315Dynamically Loading User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
Using the Reference Directive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319Creating a Multi-Page Wizard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Part III Performing Data Access
8 Overview of Data Access 337
Using DataBound Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337Working with List Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338Working with Tabular DataBound Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341Working with Hierarchical DataBound Controls. . . . . . . . . . . . . . . . . . . . . . . . . 345Working with Other Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
Using DataSource Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350Using ASP.NET Parameters with DataSource Controls . . . . . . . . . . . . . . . . . . 352
Using Programmatic DataBinding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355Understanding Templates and DataBinding Expressions. . . . . . . . . . . . . . . . . . . . . . 357
Using Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357Using DataBinding Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361Using Two-Way DataBinding Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Overview of SQL Server 2005 Express. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367Features of SQL Server Express . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367SQL Server 2005 Express Management Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368Server Databases versus Local Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
Sample Database-Driven Web Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
9 Using the SqlDataSource Control 379
Creating Database Connections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380Connecting to Microsoft SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380Connecting to Other Databases. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384Storing Connection Strings in the Web Configuration File. . . . . . . . . . . 386Encrypting Connection Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
ASP.NET 3.5 Unleashedviii
Executing Database Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389Executing Inline SQL Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389Executing Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392Filtering Database Rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394Changing the Data Source Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397Handling SQL Command Execution Errors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398Canceling Command Execution. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Using ASP.NET Parameters with the SqlDataSource Control . . . . . . . . . . . . . . . . . 405Using the ASP.NET Parameter Object. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406Using the ASP.NET ControlParameter Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409Using the ASP.NET CookieParameter Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414Using the ASP.NET FormParameter Object. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416Using the ASP.NET ProfileParameter Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418Using the QueryStringParameter Object. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421Using the SessionParameter Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Programmatically Executing SqlDataSource Commands . . . . . . . . . . . . . . . . . . . . . . 425Adding ADO.NET Parameters. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425Executing Insert, Update, and Delete Commands. . . . . . . . . . . . . . . . . . . . . . . 427Executing Select Commands. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
Caching Database Data with the SqlDataSource Control . . . . . . . . . . . . . . . . . . . . . 434Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
10 Using List Controls 437
Overview of the List Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437Declaring List Items . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437Binding to a Data Source. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440Determining the Selected List Item . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443Appending Data Items. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448Enabling Automatic PostBacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450Using the Items Collection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Working with the DropDownList Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455Working with the RadioButtonList Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457Working with the ListBox Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460Working with the CheckBoxList Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464Working with the BulletedList Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466Creating a Custom List Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
Contents ix
11 Using the GridView Control 481
GridView Control Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482Displaying Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482Selecting Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484Using Data Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487Sorting Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490Paging Through Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497Editing Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505Displaying Empty Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509Formatting the GridView Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514Using ViewState with the GridView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
Using Fields with the GridView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517Using BoundFields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518Using CheckBoxFields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521Using CommandFields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523Using ButtonFields. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526Using HyperLinkFields. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529Using ImageFields. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534Using TemplateFields. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538
Working with GridView Control Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541Highlighting GridView Rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542Displaying Column Summaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544Displaying Nested Master/Details Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
Extending the GridView Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550Creating a LongTextField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550Creating a DeleteButtonField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555Creating a ValidatedField . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560
12 Using the DetailsView and FormView Controls 563
Using the DetailsView Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563Displaying Data with the DetailsView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . 563Using Fields with the DetailsView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567Displaying Empty Data with the DetailsView Control . . . . . . . . . . . . . . . . . 569Paging Through Data with the DetailsView Control. . . . . . . . . . . . . . . . . . . . 572Updating Data with the DetailsView Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579Inserting Data with the DetailsView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588Deleting Data with the DetailsView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592Working with DetailsView Control Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593Formatting the DetailsView Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
ASP.NET 3.5 Unleashedx
Using the FormView Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599Displaying Data with the FormView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599Paging Through Data with the FormView Control. . . . . . . . . . . . . . . . . . . . . . 601Editing Data with the FormView Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606Inserting Data with the FormView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611Deleting Data with the FormView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617
13 Using the Repeater and DataList Controls 619
Using the Repeater Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619Displaying Data with the Repeater Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620Using Templates with the Repeater Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623Handling Repeater Control Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
Using the DataList Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636Displaying Data with the DataList Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636Displaying Data in Multiple Columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639Using Templates with the DataList Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641Selecting Data with the DataList Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644Editing Data with the DataList Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647Formatting the DataList Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656
14 Using the ListView and DataPager Controls 657
Using the ListView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657Using the LayoutTemplate and ItemTemplate . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658Using the GroupTemplate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662Selecting a Row . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665Sorting Database Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668Editing Database Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670
Using the DataPager Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676Creating a Custom User Interface for Paging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679Data Source Paging with the DataPager Control . . . . . . . . . . . . . . . . . . . . . . . . . 682
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684
Part IV Building Components
15 Building Components 687
Building Basic Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688Components and Dynamic Compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690Mixing Different Language Components in the
App_Code Folder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
Contents xi
Declaring Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692Declaring Fields and Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694Declaring Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699Overloading Methods and Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 700Declaring Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703Creating Partial Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704Inheritance and Abstract Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705Declaring Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708Using Access Modifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710Intellisense and Components. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710Using ASP.NET Intrinsics in a Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712
Building Component Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716Compiling Component Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716Adding a Reference to a Class Library. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
Architectural Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723Building Multi-Tier Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723Creating the User Interface Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 724Creating the Business Logic Layer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728Creating the Data Access Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 732
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 736
16 Using the ObjectDataSource Control 737
Representing Objects with the ObjectDataSource Control. . . . . . . . . . . . . . . . . . . . 738Binding to a Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 738Binding to a DataReader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 740Binding to a DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 742Binding to a LINQ to SQL Query . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744Binding to a Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
Using Parameters with the ObjectDataSource Control. . . . . . . . . . . . . . . . . . . . . . . . . 749Using Different Parameter Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753Passing Objects as Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 756
Paging, Sorting, and Filtering Data with the ObjectDataSource Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 761
User Interface Paging. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 762Data Source Paging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 764User Interface Sorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772Data Source Sorting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 774Filtering Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 779
Handling ObjectDataSource Control Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 783Adding and Modifying Parameters. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 784Handling Method Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 788Handling the ObjectCreating Event . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 792
ASP.NET 3.5 Unleashedxii
Concurrency and the ObjectDataSource Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 795Extending the ObjectDataSource Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798
Creating a Custom ObjectDataSource Control . . . . . . . . . . . . . . . . . . . . . . . . . . . 799Creating Custom Parameter Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 801
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 807
17 Building Data Access Components with ADO.NET 809
Connected Data Access. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 810Using the Connection Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 814Using the Command Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 825Using the DataReader Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 847
Disconnected Data Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855Using the DataAdapter Object. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 856Using the DataTable Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 862Using the DataView Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 871Using the DataSet Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 874
Executing Asynchronous Database Commands. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 877Using Asynchronous ADO.NET Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 877Using Asynchronous ASP.NET Pages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 879
Building Database Objects with the .NET Framework. . . . . . . . . . . . . . . . . . . . . . . . . . 883Enabling CLR Integration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 883Creating User-Defined Types with the .NET Framework. . . . . . . . . . . . . . . 884Building a Data Access Layer with a User-Defined Type . . . . . . . . . . . . . . . 889Creating Stored Procedures with the .NET Framework . . . . . . . . . . . . . . . . . 893Creating the Stored Procedure Assembly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 893
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 899
18 Data Access with LINQ to SQL 901
New C# and VB.NET Language Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 902Understanding Automatic Properties. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 902Understanding Initializers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 903Understanding Type Inference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 905Understanding Anonymous Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 907Understanding Generics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 907Understanding Lambda Expressions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 910Understanding Extension Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 914Understanding LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915
Creating LINQ to SQL Entities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 918Building Entities by Hand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 918Building Entities with the Object Relational Designer . . . . . . . . . . . . . . . . . 922Building Entity Associations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 926Using the LinqDataSource Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 927
Contents xiii
Performing Standard Database Commands with LINQ to SQL . . . . . . . . . . . . . . 930LINQ to Objects versus LINQ to SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930Selecting with LINQ to SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 931Inserting with LINQ to SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 939Updating with LINQ to SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 943Deleting with LINQ to SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 947Dynamic Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 949Debugging LINQ to SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 954
Creating a Custom LINQ Entity Base Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 957Using the Entity Base Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 958Performing Standard Data-Access Operations with the
EntityBase Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 959Performing Validation with the EntityBase Class . . . . . . . . . . . . . . . . . . . . . . . . 961
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 966
Part V Site Navigation
19 Using the Navigation Controls 971
Understanding Site Maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 971Using the SiteMapPath Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 973
Formatting the SiteMapPath Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 976Using the Menu Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 980
Declaratively Adding Menu Items. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 980Using the Menu Control with the MultiView Control . . . . . . . . . . . . . . . . . 984Binding to a Site Map. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 987Binding to an XML File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 991Binding to Database Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 994Formatting the Menu Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 999Using Templates with the Menu Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1006
Using the TreeView Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009Declaratively Adding Tree Nodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009Displaying Check Boxes with the TreeView Control . . . . . . . . . . . . . . . . . . 1013Binding to a Site Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1016Binding to an XML File. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1017Binding to Database Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1020Using Populate On Demand and AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1023Formatting the TreeView Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1029
Building a SQL Hierarchical Data Source Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1036Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1040
ASP.NET 3.5 Unleashedxiv
20 Using Site Maps 1041
Using the SiteMapDataSource Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1042Setting SiteMapDataSource Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1044
Using the SiteMap Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1048Using the SiteMapNode Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1051
Advanced Site Map Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1053Using Security Trimming. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1054Merging Multiple Site Maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1058Creating Custom Site Map Attributes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1060
Creating Custom Site Map Providers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1063Creating the AutoSiteMapProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1063Creating the SqlSiteMapProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1068
Generating a Google SiteMap File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1074Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1078
21 Advanced Navigation 1081
Remapping URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1081Creating a Custom UrlRemapper Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1084
Using the VirtualPathProvider Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1090Limitations of the VirtualPathProvider Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1091Understanding the VirtualPathProvider Class. . . . . . . . . . . . . . . . . . . . . . . . . . . 1091Registering a VirtualPathProvider Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1093Storing a Website in Microsoft SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1094
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1100
Part VI Security
22 Using the Login Controls 1103
Overview of the Login Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1104Using the Login Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1108
Automatically Redirecting a User to the Referring Page. . . . . . . . . . . . . . 1111Automatically Hiding the Login Control from
Authenticated Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1111Using a Template with the Login Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1114Performing Custom Authentication with the Login Control . . . . . . . 1116
Using the CreateUserWizard Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1118Configuring Create User Form Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1120Sending a Create User Email Message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1122Automatically Redirecting a User to the Referring Page. . . . . . . . . . . . . . 1126Automatically Generating a Password . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1128Using Templates with the CreateUserWizard Control . . . . . . . . . . . . . . . . 1134Adding Steps to the CreateUserWizard Control . . . . . . . . . . . . . . . . . . . . . . . . 1137
Contents xv
Using the LoginStatus Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1139Using the LoginName Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1141Using the ChangePassword Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1143
Sending a Change Password Email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1144Using Templates with the ChangePassword Control. . . . . . . . . . . . . . . . . . 1146
Using the PasswordRecovery Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1149Sending the Original Password . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1151Requiring a Security Question and Answer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1152Using Templates with the PasswordRecovery Control . . . . . . . . . . . . . . . . 1153
Using the LoginView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1156Using Roles with the LoginView Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1158
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1160
23 Using ASP.NET Membership 1161
Configuring Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1162Configuring Forms Authentication. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1163Using Cookieless Forms Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1164Using Sliding Expiration with Forms Authentication. . . . . . . . . . . . . . . . . 1166Using Forms Authentication Across Applications . . . . . . . . . . . . . . . . . . . . . . 1166Using Forms Authentication Across Domains. . . . . . . . . . . . . . . . . . . . . . . . . . . 1170Using the FormsAuthentication Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1172Using the User Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1176
Configuring Authorization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1177Authorizing by Role . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1179Authorizing Files by Location. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1179Using Authorization with Images and Other File Types . . . . . . . . . . . . . 1180Using Authorization with ASP Classic Pages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1182
Using ASP.NET Membership . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1183Using the Membership Application Programming Interface. . . . . . . . 1184Encrypting and Hashing User Passwords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1189Modifying User Password Requirements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1191Locking Out Bad Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1192Configuring the SQLMembershipProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1194Configuring the ActiveDirectoryMembershipProvider . . . . . . . . . . . . . . . 1196Creating a Custom Membership Provider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1201
Using the Role Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1203Configuring the SqlRoleProvider. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1203Configuring the WindowsTokenRoleProvider. . . . . . . . . . . . . . . . . . . . . . . . . . . 1208Configuring the AuthorizationStoreRoleProvider . . . . . . . . . . . . . . . . . . . . . . 1210Caching Roles in a Browser Cookie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1213Using the Roles Application Programming Interface. . . . . . . . . . . . . . . . . . 1214
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1217
ASP.NET 3.5 Unleashedxvi
Part VII Building ASP.NET Applications
24 Maintaining Application State 1221
Using Browser Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1222Cookie Security Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1223Creating Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1224Reading Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1227Setting Cookie Properties. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1230Deleting Cookies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1231Working with Multivalued Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1233
Using Session State. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1237Storing Database Data in Session State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1239Using the Session Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1241Handling Session Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1242Controlling When a Session Times Out . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1245Using Cookieless Session State. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1246Configuring a Session State Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1248Configuring SQL Server Session State. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1251
Using Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1254Creating Profile Groups. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1258Supporting Anonymous Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1260Migrating Anonymous Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1263Inheriting a Profile from a Custom Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1264Creating Complex Profile Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1266Saving Profiles Automatically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1273Accessing Profiles from Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1277Using the Profile Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1279Configuring the Profile Provider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1281Creating a Custom Profile Provider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1283
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1288
25 Caching Application Pages and Data 1289
Overview of Caching. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1289Using Page Output Caching. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1291
Varying the Output Cache by Parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1292Varying the Output Cache by Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1296Varying the Output Cache by Header . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1298Varying the Output Cache by Browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1299Varying the Output Cache by a Custom Function . . . . . . . . . . . . . . . . . . . . 1300Specifying the Cache Location . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1302Creating a Page Output Cache File Dependency . . . . . . . . . . . . . . . . . . . . . . . 1304Expiring the Page Output Cache Programmatically . . . . . . . . . . . . . . . . . . . 1306
Contents xvii
Manipulating the Page Output Cache Programmatically . . . . . . . . . . . . 1311Creating Page Output Cache Profiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1313
Using Partial Page Caching. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1314Using Post-Cache Substitution. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1315Caching with a User Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1318Sharing a User Control Output Cache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1322Manipulating a User Control Cache Programmatically . . . . . . . . . . . . . . 1323Creating a User Control Cache File Dependency . . . . . . . . . . . . . . . . . . . . . . 1324Caching Dynamically Loaded User Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1325
Using DataSource Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1327Using an Absolute Cache Expiration Policy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1328Using a Sliding Cache Expiration Policy. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1330Caching with the ObjectDataSource Control . . . . . . . . . . . . . . . . . . . . . . . . . . . 1332Caching with the XmlDataSource Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1334Creating a DataSource Control Key Dependency . . . . . . . . . . . . . . . . . . . . . . 1335
Using Data Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1339Using the Cache Application Programming Interface . . . . . . . . . . . . . . . . 1339Adding Items to the Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1341Adding Items with an Absolute Expiration Policy . . . . . . . . . . . . . . . . . . . . . 1342Adding Items with a Sliding Expiration Policy . . . . . . . . . . . . . . . . . . . . . . . . . 1344Adding Items with Dependencies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1346Specifying Cache Item Priorities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1348Configuring the Cache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1348
Using SQL Cache Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1350Using Polling SQL Cache Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1351Configuring Polling SQL Cache Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . 1352Using Polling SQL Cache Dependencies with Page
Output Caching. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1354Using Polling SQL Cache Dependencies with
DataSource Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1356Using Polling SQL Cache Dependencies with Data Caching . . . . . . . 1357Using Push SQL Cache Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1359Configuring Push SQL Cache Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1360Using Push SQL Cache Dependencies with Page
Output Caching. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1362Using Push SQL Cache Dependencies with Data
Source Caching. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1364Using Push SQL Cache Dependencies with Data Caching . . . . . . . . . . 1366
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1368
ASP.NET 3.5 Unleashedxviii
26 Localizing Applications for Multiple Languages 1369
Setting the Current Culture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1370Setting a Culture Manually . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1371Automatically Detecting a Culture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1378Setting the Culture in the Web Configuration File . . . . . . . . . . . . . . . . . . . . 1382Culture and ASP.NET Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1383
Using the CultureInfo Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1384Using the CultureInfo Class to Format String Values . . . . . . . . . . . . . . . . . 1384Comparing and Sorting String Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1386
Creating Local Resources. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1388Explicit Localization Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1388Implicit Localization Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1391Using Local Resources with Page Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1393Retrieving Local Resources Programmatically . . . . . . . . . . . . . . . . . . . . . . . . . . . 1394
Creating Global Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1397Retrieving Global Resources Programmatically . . . . . . . . . . . . . . . . . . . . . . . . . 1399Using Strongly Typed Localization Expressions . . . . . . . . . . . . . . . . . . . . . . . . 1400
Using the Localize Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1401Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1402
27 Working with the HTTP Runtime 1403
Creating a Custom BuildProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1404Creating a Simple BuildProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1404Creating a Data Access Component BuildProvider . . . . . . . . . . . . . . . . . . . . 1408
Creating a Custom ExpressionBuilder. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1415Creating a Lookup ExpressionBuilder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1416
Creating HTTP Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1420Creating a Generic Handler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1420Implementing the IHttpHandler Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1423Registering Extensions with Internet Information Server. . . . . . . . . . . . 1428Creating an Asynchronous HTTP Handler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1430
Working with HTTP Applications and HTTP Modules . . . . . . . . . . . . . . . . . . . . . . . 1435Creating a Global.asax File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1435Creating Custom HTTP Modules. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1439
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1441
28 Configuring Applications 1443
Overview of Website Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1443Using the Web Site Administration Tool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1445Using the ASP.NET Microsoft Management Console Snap-In . . . . . . 1446ASP.NET Configuration Sections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1447
Contents xix
Applying Configuration Settings to a Particular Path. . . . . . . . . . . . . . . . . 1449Locking Configuration Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1450Adding Custom Application Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1452Placing Configuration Settings in an External File . . . . . . . . . . . . . . . . . . . . 1454
Using the Configuration API. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1455Reading Configuration Sections from the Current Application. . . . 1456Opening a Configuration File. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1461Opening a Configuration File on a Remote Server . . . . . . . . . . . . . . . . . . . . 1465Using the Configuration Class. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1468Modifying Configuration Sections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1471Provisioning a New Website. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1474
Creating Custom Configuration Sections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1478Creating a Configuration Element Collection . . . . . . . . . . . . . . . . . . . . . . . . . . 1483
Creating Encrypted Configuration Sections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1488Encrypting Sections with the aspnet_regiis tool. . . . . . . . . . . . . . . . . . . . . . . . 1489Encrypting Sections Programmatically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1490Deploying Encrypted Web Configuration Files . . . . . . . . . . . . . . . . . . . . . . . . . 1493
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1496
Part VIII Custom Control Building
29 Building Custom Controls 1499
Overview of Custom Control Building . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1499Building Fully Rendered Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1500Building Composite Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1510Building Hybrid Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1513
View State and Control State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1519Supporting View State. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1520Supporting Control State. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1522
Processing Postback Data and Events. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1526Handling Postback Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1526Handling Postback Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1530
Working with Control Property Collections. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1541Using the ParseChildren Attribute. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1541Using the AddParsedSubObject() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1549Using a ControlBuilder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1549
Creating a Better Designer Experience . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1554Applying Design-Time Attributes to a Control. . . . . . . . . . . . . . . . . . . . . . . . . . 1554Creating Control Designers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1559Creating a Container ControlDesigner. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1559Adding Smart Tasks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1563
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1568
ASP.NET 3.5 Unleashedxx
30 Building Templated Databound Controls 1569
Creating Templated Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1569Implementing the ITemplate Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1570Creating a Default Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1574Supporting Simplified Databinding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1578Supporting Two-Way Databinding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1582
Creating Templated Databound Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1588Creating a DivView Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1589
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1594
Part IX ASP.NET AJAX
31 Using Server-Side ASP.NET AJAX 1597
The Ajax Vision. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1598Server-Side Ajax versus Client-Side Ajax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1600Debugging Ajax Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1600Using the UpdatePanel Control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1602
Specifying UpdatePanel Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1611Nesting UpdatePanel Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1612Updating UpdatePanels Programmatically . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1617UpdatePanels and JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1619UpdatePanel Server-Side Page Execution Lifecycle. . . . . . . . . . . . . . . . . . . . . 1622UpdatePanel Client-Side Page Execution Lifecycle. . . . . . . . . . . . . . . . . . . . . 1624Canceling the Current Asynchronous Postback . . . . . . . . . . . . . . . . . . . . . . . . 1632Aborting the Previous Asynchronous Postback . . . . . . . . . . . . . . . . . . . . . . . . . 1634Passing Additional Information During an Asynchronous
Postback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1637Handling UpdatePanel Errors Gracefully . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1639UpdatePanel Performance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1645
Using the Timer Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1649Using the UpdateProgress Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1653Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1656
32 Using the ASP.NET AJAX Control Toolkit 1657
Using the ASP.NET AJAX Control Toolkit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1658Overview of the Toolkit Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1660Using the AutoComplete Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1664
Using the AutoCompleteExtender with a Page Method. . . . . . . . . . . . . . 1664Using the AutoCompleteExtender with a Web Service Method . . . 1667Using Text and Value Pairs with the AutoCompleteExtender . . . . . . 1670
Using the DragPanel Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1674
Contents xxi
Using the FilteredTextBox Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1678Using the MaskedEdit Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1680Using the Animation Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1683Using the UpdatePanelAnimation Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1689Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1692
33 Using Client-Side ASP.NET AJAX 1695
Making JavaScript Look Like C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1695Using the Microsoft AJAX Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1697Creating an AJAX Client Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1698Taking Advantage of JavaScript Intellisense . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1700Working with Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1703Working with Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1707Working with Namespaces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1710Retrieving DOM Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1712Handling DOM Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1713Retrieving DOM Event Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1716Creating Callbacks and Delegates. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1719Debug and Release AJAX Libraries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1722Debugging Microsoft AJAX Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1722
Calling Web Services from the Client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1726Calling an External Web Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1727Calling a Static Page Method. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1731Editing Movies with AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1732Using the Authentication Service. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1737Using the Role Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1742Using the Profile Service. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1745
Creating Custom AJAX Controls and Behaviors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1749Creating AJAX Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1749Launching a Client-Side Control from the Server. . . . . . . . . . . . . . . . . . . . . . 1755Creating Client-Side Behaviors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1762Launching a Client-Side Behavior from the Server . . . . . . . . . . . . . . . . . . . . 1766
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1769
ASP.NET 3.5 Unleashedxxii
Part X Sample Application
34 Building a Code Sample Website 1773
Overview of the Sample Website . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1774Creating Blog Entries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1774Creating Code Sample Entries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1777
Data Access and Validation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1780Using LINQ to SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1781Handling Common Database Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1783Creating a Single Insert and Update Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1783Handling Form Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1788
Taking Advantage of Ajax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1790Using the UpdatePanel Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1790Using the ASP.NET AJAX Control Toolkit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1791
Using the VirtualPathProvider Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1793Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1795
Index 1797
Contents xxiii
About the Author
Stephen Walther is a Microsoft Software Legend, a Microsoft ASP.NET MVP, and amember of the INETA Speaker’s Bureau. He has spoken at a number of major conferences,including Microsoft TechEd, Microsoft DevDays, and ASP.NET Connections.
He wrote several ASP.NET best-practice applications for Microsoft. He was the lead devel-oper of the ASP.NET Community Starter Kit and the Issue Tracker Starter Kit.
His company, Superexpert ASP.NET Training (www.SuperexpertTraining.com), hasprovided ASP.NET training to companies and organizations across the United States,including NASA, the National Science Foundation, the U.S. House of Representatives,Boeing, Lockheed Martin, Verizon, and Microsoft.
Dedication
This book is dedicated to my wife, Ruth Walther, who is my favorite person in the world.
Acknowledgments
I want to thank a number of people at Microsoft for taking the time to answer my ques-tions about ASP.NET: Scott Guthrie, Susan Chory, Bradley Millington, Mike Harder, AndresSanabria, Nikhil Kothari, Matthew Gibbs, Rob Howard, and Stefan Schackow.
I also want to thank Neil Rowe for all the support and encouragement that he gave mewhile I was writing this book. I really appreciate the work that Mark Renfrow, Lori Lyons,Anne Goebel, and Jake McFarland performed when putting together the book to meet avery tight deadline.
Finally, I want to thank Scott Cate for fixing the regular expressions in the first edition ofthis book. I want to thank Paul Litwin for reviewing the chapter on the ObjectDataSourcecontrol. And, I want to thank Dan Wahlin for agreeing with me about the UpdatePanel.
We Want to Hear from You!
As the reader of this book, you are our most important critic and commentator. We valueyour opinion and want to know what we’re doing right, what we could do better, whatareas you’d like to see us publish in, and any other words of wisdom you’re willing topass our way.
As a senior acquisitions editor for Sams Publishing, I welcome your comments. You canemail or write me directly to let me know what you did or didn’t like about this book—aswell as what we can do to make our books better.
Please note that I cannot help you with technical problems related to the topic of this book. We do have a User Services group, however, where I will forward specific technical questionsrelated to the book.
When you write, please be sure to include this book’s title and author as well as yourname, email address, and phone number. I will carefully review your comments and sharethem with the author and editors who worked on the book.
Email: [email protected]
Mail: Neil RoweSenior Acquisitions EditorSams Publishing800 East 96th StreetIndianapolis, IN 46240 USA
For more information about this book or another Sams Publishing title, visit our websiteat www.informit.com/title/9780672330117.
Reader Services
Visit our website and register this book at www.informit.com/title/9780672330117 forconvenient access to any updates, downloads, or errata that might be available for thisbook.
Introduction
ASP.NET is Microsoft’s flagship technology for building highly interactive, highly scal-able websites. Some of the largest websites hosted on the Internet were built with theASP.NET Framework, including Dell (www.Dell.com), MySpace (www.MySpace.com), andMicrosoft (www.Microsoft.com). If you need to build a highly interactive website that canscale to handle thousands of simultaneous users, then ASP.NET is the technology to use.
Who Should Read This Book?ASP.NET 3.5 Unleashed is intended for professional programmers who need to create awebsite. This book is a comprehensive reference for building a website with ASP.NET 3.5.The CD that accompanies this book contains hundreds of code samples that you can startusing immediately while building your website.
If you are new to building websites with ASP.NET, you can use this book to teach yourselfeverything you need to know to build a website with the ASP.NET Framework. If you arean experienced ASP.NET developer, you can use this book to learn about the new featuresof ASP.NET 3.5.
The final part of this book contains a complete sample application written with ASP.NET 3.5:a code sample site. All the code for this application is included on the CD that accompaniesthis book. (The source is in both C# and VB.NET.)
What Do You Need to Know Before You Read This Book?This book assumes that you know either the C# or Visual Basic .NET programminglanguage. If you are completely new to the .NET Framework, then I recommend you readan introductory book on either C# or Visual Basic .NET before reading this book.
In the body of the book, all the code samples are presented in C#. However, this was notintended as any kind of insult to VB.NET programmers. The CD that accompanies thisbook includes every code sample translated into the VB.NET programming language.
To get the most from the database chapters, you should have some experience workingwith a database, such as Microsoft SQL Server, Oracle, or Microsoft Access.
Changes to This BookThis edition of the book reflects three important transitions in the ASP.NET Framework.
First (and most obviously), unlike the previous editions of this book, all the code samplesin the body of this edition of the book are written in the C# programming language.There are now more professional C# developers than Visual Basic .NET developers. Thebook has been updated to reflect this important transition. If your preference is VisualBasic, Visual Basic .NET versions of all code samples are included on the CD that accom-panies this book.
Second, this edition of the book includes a new chapter that covers Microsoft LINQ toSQL in detail. LINQ to SQL is a new query language that enables you to access a databasewithout writing any SQL. The chapter examines LINQ to SQL from an ASP.NET perspec-tive (see Chapter 18, “Data Access with LINQ to SQL”).
This edition of the book also includes a new chapter on the two new data access controlsintroduced with the ASP.NET 3.5 Framework: the ListView and DataPager controls. TheListView control is a more flexible version of the GridView control (see Chapter 14,“Using the ListView and DataPager Controls”).
The third important transition in the ASP.NET 3.5 Framework concerns AJAX. TheMicrosoft AJAX Extensions for ASP.NET are integrated into the ASP.NET 3.5 Framework.AJAX represents a transition from using server-side technologies to using client-side tech-nologies when building web applications.
Ajax represents a fundamental shift in the way that developers build websites. Users areno longer satisfied with slow, noninteractive web applications built with server-side tech-nologies. They want highly responsive and interactive web applications that behave morelike desktop applications.
This book includes three chapters devoted to the very important topic of Ajax. You learnhow to take advantage of Microsoft’s server-side Ajax framework to retrofit existingASP.NET applications with Ajax functionality. You also learn how to take advantage ofMicrosoft’s client-side Ajax framework to build the web applications of the future: pureclient-side Ajax applications (see Part IX of this book, “ASP.NET AJAX”).
The final chapter of this book contains a completely new sample application written withLINQ to SQL and server-side Ajax. The sample application demonstrates how you can takeadvantage of these new technologies when building real-world web applications (seeChapter 34, “Building a Code Sample Website”).
ASP.NET 3.5 Unleashed2
How This Book Is OrganizedAlthough I encourage you to read this book from start to finish, reading chapter bychapter, I realize that not everyone has time to do so. If necessary, you can use this booksolely as a reference and jump to a chapter only when the need arises. It may be helpful,therefore, to have an idea of the overall organization of this book.
. Part I: Building ASP.NET Pages—The chapters in this part provide you with anoverview of the basic controls included in the ASP.NET Framework. You learn howto build interactive Web Forms with the form controls. You also learn how to vali-date form data with the validation controls. Finally, you learn how to upload filesand display interactive calendars and wizards with the rich controls.
. Part II: Designing ASP.NET Websites—The chapters in this part discuss how youcan create a common layout and style for the pages in your website. You learn howto use Master Pages to share content across multiple pages. You also learn how touse Themes to create a consistent page style.
. Part III: Performing Data Access—The chapters in this part focus on data access.You learn how to use the ListView and GridView controls to display, page, sort, andedit a set of database records. You learn how to use the DetailsView and FormView
controls to display and edit a single database record at a time.
. Part IV: Building Components—The chapters in this part focus on buildingcustom components. You learn how to design and create multitiered applications.You also learn how to build data access components by taking advantage of bothLINQ to SQL and ADO.NET.
. Part V: Site Navigation—The chapters in this part discuss the various navigationcontrols included in the ASP.NET Framework, such as the TreeView and Menu
controls. You learn how to use these controls with a Site Map in order to allow usersto easily navigate a website. You also learn how to use the VirtualPathProviderclass to abstract a website from the file system. For example, you learn how to storethe pages in a website in a Microsoft SQL Server database.
. Part VI: Security—The chapters in this part focus on the Login controls andMembership API. You learn how to create a user registration and authenticationsystem. You learn how to store Membership information in either a SQL Server data-base or Active Directory.
. Part VII: Building ASP.NET Applications—These chapters discuss a variety oftopics related to building ASP.NET applications. For example, you learn how toimprove the performance of your ASP.NET applications by taking advantage ofcaching. You also learn how to localize your ASP.NET applications so that they canbe easily translated and presented in multiple human languages.
Introduction 3