Pro ASP.NET 4 in C# 2010
ii n in
Matthew MacDonald, Adam Freeman,and Mario Szpuszta
Apress
Contents
Contents at a Glance - ... •Hi
About the Author xxxii
About the Technical Reviewer xxxiii
Introduction xxxiv
Part 1: Core Concepts 1
1 Chapter 1: Introducing ASP.NET 3
The Seven Pillars of ASP.NET 3
#1: ASP.NET Is Integrated with the .NET Framework 3
#2: ASP.NET Is Complied, Not Interpreted 4
#3: ASP.NET Is Multilanguage 6
#4: ASP.NET Is Hosted by the Common Language Runtime 8
#5: ASP.NET Is Object-Oriented 9
#6: ASP.NET Supports all Browsers 11
#7: ASP.NET Is Easy to Deploy and Configure 11
The Evolution of ASP.NET 12
ASP.NET 1.0 and 1.1 12
ASP.NET 2.0 12
ASP.NET 3.5 13
ASP.NET 4 16
Silverlight 18
Summary 19
CONTENTS
CflciptGr 2i VlSUcll StllCtlOi " BBi«iB«»«BBa«aBaBBBBBBBaaBBBiBBBBBBi«BBBBBaBBB«aaBB»BBBBBBBaaiBBBBBBB21
Introducing Visual Studio 21
Websites and Web Projects 22
Creating a Projectless Website 23
Designing a Web Page 28
The Visual Studio IDE 35
Solution Explorer 37
Document Window 38
Toolbox 38
Error List and Task List 39
Server Explorer 41
The Code Editor 42
Adding Assembly References 43
IntelliSense and Outlining 46
Visual Studio 2010 Improvements 50
The Code Model 56
How Code-Behind Files Are Connected to Pages 59
How Control Tags Are Connected to Page Variables 60
How Events Are Connected to Event Handlers 61
Web Projects 63
Creating a Web Project 64
Migrating a Website from a Previous Version of Visual Studio 66
Visual Studio Debugging 68
Single-Step Debugging 69
Variable Watches 72
Advanced Breakpoints 74
The Web Development Helper 74
Summary 76
Chapter 3: Web Forms- 77
Page Processing 78
HTML Forms 78
vi
CONTENTS
Dynamic User Interface 80
The ASP.NET Event Model 81
Automatic Postbacks 82
View State 84
XHTML Compliance 88
Client-Side Control IDs 94
Web Forms Processing Stages 97
Page Framework Initialization 98
User Code Initialization 99
Validation 99
Event Handling 100
Automatic Data Binding 100
Cleanup 101
A Page Flow Example 101
The Page As a Control Container 104
Showing the Control Tree 104
The Page Header 109
Dynamic Control Creation 110
The Page Class 112
Session, Application, and Cache 112
Request 113
Response 114
Server 118
User, 121
Trace "121
Accessing the HTTP Context in Another Class 127
Summary 128
Chapter 4: Server Controls 129
Types of Server Controls 129
The Server Control Hierarchy 130
HTML Server Controls 132
The HtmlControl Class 133
CONTENTS
The HtmlContainerControl Class 133
The HtmllnputControl Class 134
The HTML Server Control Classes 134
Setting Style Attributes and Other Properties 136
Programmatically Creating Server Controls 137
Handling Server-Side Events 139
Web Controls 142
The WebControl Base Class 143
Basic Web Control Classes 145
Units 147
Enumerations 147
Colors 148
Fonts 148
Focus 150
The Default Button 151
Scrollable Panels 152
Handling Web Control Events 153
The List Controls 156
The Selectable List Controls 157
The BulletedList Control 161
Input Validation Controls 162
The Validation Controls 163
The Validation Process 164
The BaseValidator Class 165
The RequiredFieldValidator Control 167
The RangeValidator Control 167
The CompareValidator Control 168
The RegularExpressionValidator Control 168
The CustomValidator Control 171
The ValidationSummary Control 172
Using the Validators Programmatically 174
Validation Groups 175
viii
CONTENTS
Rich Controls 177
The AdRotator Control 178
The Calendar Control 180
Summary 182
Chapter 5: ASP.NET Applications • 183
Anatomy of an ASP.NET Application 183
The Application Domain 184
Application Lifetime 185
Application Updates 186
Application Directory Structure 186
The global.asax Application File,
187
Application Events 189
Demonstrating Application Events 191
ASP.NET Configuration 192
The machine.config File 193
The web.config File 195
<system.web> 199
<system.webServer> 200
<appSettings> 201
<connectionStrings> 202
Reading and Writing Configuration Sections Programmatically 203
The Website Administration Tool (WAT) 206
Extending the Configuration File Structure 207
Encrypting Configuration Sections 211
.NET Components 213
Creating a Component 214
Using a Component Through the App_Code Directory 215
Using a Component Through the Bin Directory 216
Extending the HTTP Pipeline 219
HTTP Handlers 219
Creating a Custom HTTP Handler 221
Configuring a Custom HTTP Handler 222
CONTENTS
Using Configuration-Free HTTP Handlers 223
Creating an Advanced HTTP Handier 223
Creating an HTTP Handler for Non-HTML Content 226
HTTP Modules 229
Creating a Custom HTTP Module 231
Summary 234
& Chapter 6: State Management .235
ASP.NET State Management 236
View State 238
A View State Example 239
Storing Objects in View State 241
Assessing View State 243
Selectively Disabling View State 244
View State Security 246
Transferring Information Between Pages 247
The Query String 248
Cross-Page Posting 249
Cookies 256
Session State 258
Session Architecture 258
Using Session State 259
Configuring Session State 261
Securing Session State 268
Application State 269
Static Application Variables 271
Summary 273
Part 2: Data Access 275
im Chapter 7: ADO.NET Fundamentals ....277
The ADO.NET Architecture 278
AD0.NET Data Providers 278
CONTENTS
Standardization in ADO.NET 280
Fundamental AD0.NET Classes 281
The Connection Class 283
Connection Strings 283
Testing a Connection 286
Connection Pooling 287
The Command and DataReader Classes 289
Command Basics 290
The DataReader Class 291
The ExecuteReader() Method and the DataReader 292
The ExecuteScalarO Method 298
The ExecuteNonQuery() Method 298
SQL Injection Attacks 299
Using Parameterized Commands 303
Calling Stored Procedures 304
Transactions 307
Transactions and ASP.NET Applications 307
Isolation Levels 312
Savepoints 314
Provider-Agnostic Code 315
Creating the Factory 316
Create Objects with Factory 317
A Query with Provider-Agnostic Code 318
Summary 319
Chapter 8: Data Components and the DataSet 321
Building a Data Access Component 321
The Data Package 323
The Stored Procedures 324
The Data Utility Class.... 325
Testing the Database Component 331
Disconnected Data 333
Web Applications and the DataSet 334
CONTENTS
XML Integration 335
The DataSet 335
The DataAdapter Class 337
Filling a DataSet 338
Working with Multiple Tables and Relationships 340
Searching for Specific Rows 343
Using the DataSet in a Data Access Class 344
Data Binding 345
The DataView Class 345
Sorting with a DataView 346
Filtering with a DataView 348
Advanced Filtering with Relationships 350
Calculated Columns 350
Summary 352
i Chapter 9: Data Binding 353
Basic Data Binding 354
Single-Value Binding 354
Other Types of Expressions 356
Repeated-Value Binding 360
Data Source Controls 368
The Page Life Cycle with Data Binding 369
The SqIDataSource 370
Selecting Records 371
Parameterized Commands 374
Handling Errors 379
Updating Records 379
Deleting Records 384
Inserting Records 384
Disadvantages of the SqIDataSource 385
The ObjectDataSource 386
Selecting Records 387
xii
CONTENTS
Updating Records 392
Updating with a Data Object 393
The Limits of the Data Source Controls 397
The Problem 398
Adding the Extra Items 399
Handling the Extra Options with the SqIDataSource 399
Handling the Extra Options with the ObjectDataSource 400
Summary 401
Chapter 10: Rich Data Controls.... 403
The GridView 404
Defining Columns 404
Formatting the GridView 408
Formatting Fields 409
Styles 410
Formatting-Specific Values 414
GridView Row Selection, 416
Using Selection to Create a Master-Details Form 418
The SelectedlndexChanged Event 420
Using a Data Field As a Select Button 421
Sorting the GridView 422
Sorting with the SqIDataSource 422
Sorting with the ObjectDataSource 423
Sorting and Selection 425
Advanced Sorting 425
Paging the GridView 427
Automatic Paging 427
Paging and Selection 429
Custom Pagination with the ObjectDataSource 429
Customizing the Pager Bar 432
GridView Templates 433
Using Multiple Templates 435
xiii
CONTENTS
Editing Templates in Visual Studio 436
Binding to a Method 437
Handling Events in a Template 439
Editing with a Template 440
Client IDs in Templates 447
The ListView 447
Grouping 451
Paging 453
The DetailsView and FormView 454
The DetailsView 454
The FormView 457
Advanced Grids 459
Summaries in the GridView 459
A Parent/Child View in a Single Table 461
Editing a Field Using a Lookup Table 464
Serving Images from a Database 466
Detecting Concurrency Conflicts 472
Summary 476
i Chapter 11: Caching and Asynchronous Pages 477
Understanding ASP.NET Caching 477
Output Caching 478
Declarative Output Caching 479
Caching and the Query String 480
Caching with Specific Query String Parameters 481
Custom Caching Control 481
Caching with the HttpCachePolicy Class 483
Post-Cache Substitution and Fragment Caching 484
Cache Profiles 487
Cache Configuration 487
Output Caching Extensibility 488
Data Caching 493
Adding Items to the Cache 494
xiv
CONTENTS
A Simple Cache Test 496
Cache Priorities 498
Caching with the Data Source Controls 498
Cache Dependencies 502
File and Cache Item Dependencies 502
Aggregate Dependencies 503
The Item Removed Callback 504
Understanding SQL Cache Notifications 507
How Cache Notifications Work 508
Enabling Notifications 508
Creating the Cache Dependency 509
Custom Cache Dependencies 510
A Basic Custom Cache Dependency 510
A Custom Cache Dependency Using Message Queues 512
Asynchronous Pages 514
Creating an Asynchronous Page 515
Querying Data in an Asynchronous Page 517
Handling Errors 519
Using Caching with Asynchronous Tasks >522
Multiple Asynchronous Tasks and Timeouts 524
Summary 526
II Chapter 12: Files and Streams 527
Working with the File System 527
The Directory and File Classes 528
The Directorylnfo and Filelnfo Classes 530
The Drivelnfo Class 533
Working with Attributes 534
Filter Files with Wildcards 536
Retrieving File Version Information 537
The Path Class 538
A File Browser 541
xv
CONTENTS
Reading and Writing Files with Streams 546
Text Files 547
Binary Files 549
Uploading Files 550
Making Files Safe for Multiple Users 552
Compression 557
Serialization 558
Summary 561
Chapter 13: LINQ 563
LINQ Basics 563
Deferred Execution 565
How LINQ Works 566
LINQ Expressions 567
LINQ Expressions "Under the Hood" 575
LINQ to DataSet 578
Typed DataSets 581
Null Values 581
LINQ to Entities 581
Generating the Data Model 582
The Data Model Classes 583
Entity Relationships 586
Querying Stored Procedures 587
LINQ to Entities Queries "Under the Hood" 589
Database Operations 595
Inserts 595
Updates 598
Deletes 598
Managing Concurrency 598
Handling Concurrency Conflicts 599
The EntityDataSource Control 604
Displaying Data 604
xvi
CONTENTS
Getting Related Data 609
Editing Data 610
Validation 611
Using the QueryExtender Control 612
Using a SearchExpression 613
Using a RangeExpression 614
Using a PropertyExpression 614
Using a MethodExpression 615
Summary 616
ChciptGr 14* XIVILib HMHiiiiiiiiiiMiitiiiHUM mi i * «6"!7
When Does Using XML Make Sense? 617
An Introduction to XML 618
The Advantages of XML 619
Well-Formed XML 620
XML Namespaces 621
XML Schemas 622
Stream-Based XML Processing 624
Writing XML Files 624
Reading XML Files 628
In-Memory XML Processing 631
The XmlDocument 632
The XPathNavigator 636
The XDocument 638
Searching XML Content,
643
Searching with XmlDocument 644
Searching XmlDocument with XPath 646
Searching XDocument with LINQ 649
Validating XML Content 651
A Basic Schema 651
Validating with XmlDocument 652
Validating with XDocument 654
xvii
CONTENTS
Transforming XML Content 654
A Basic Stylesheet 655
Using XslCornpiledTransform 656
Using the Xml Control 657
Transforming XML with UNO. to XML 658
XML Data Binding 660
Nonhierarchical Binding 660
Using XPath 662
Nested Grids 665
Hierarchical Binding with the TreeView 667
Using XSLT 669
Binding to XML Content from Other Sources 671
Updating XML Through the XmlDataSource 672
XML and the AD0.NET DataSet 672
Converting the DataSet to XML 673
Accessing a DataSet As XML 675
Summary 678
Part 3: Building ASP.NET Websites 679
Chapter 15: User Controls 681
User Control Basics 681
Creating a Simple User Control 682
Converting a Page to a User Control 684
Adding Code to a User Control 684
Handling Events 684
Adding Properties 685
Using Custom Objects 688
Adding Events 690
Exposing the Inner Web Control 694
Dynamically Loading User Controls 695
Portal Frameworks 695
xviii
CONTENTS
Partial Page Caching ,
699
VaryByControl 699
Sharing Cached Controls 701
Summary 702
; Chapter 16: Themes and Master Pages 703
Cascading Style Sheets 703
Creating a Stylesheet 703
Applying Stylesheet Rules 706
Themes 709
Theme Folders and Skins 709
Applying a Simple Theme 711
Handling Theme Conflicts 712
Creating Multiple Skins for the Same Control,
713
Skins with Templates and Images 714
Using CSS in a Theme 717
Applying Themes Through a Configuration File 717
Applying Themes Dynamically 718
Standardizing Website Layout, 720
Master Page Basics 720
A Simple Master Page 721
A Simple Content Page 723
Default Content 725
Master Pages with Tables and CSS Layout 726
Master Pages and Relative Paths 729
Applying Master Pages Through a Configuration File 730
Advanced Master Pages 730
Interacting with the Master Page Class 730
Dynamically Setting a Master Page 732
Nesting Master Pages 732
Summary 734
XIX
s- CONTENTS
ii Chapter 17: Website Navigation.. 735
Pages with Multiple Views 736
The MultiView Control 736
The Wizard Control 741
Site Maps 751
Defining a Site Map 752
Binding to a Site Map 753
Breadcrumbs 754
Showing a Portion of the Site Map 757
The Site Map Objects 760
Adding Custom Site Map Information 762
Creating a Custom SiteMapProvider 763
Security Trimming 770
URL Mapping and Routing 772
URL Mapping 772
URL Routing 773
The TreeView Control 774
The TreeNode 775
Populating Nodes on Demand 778
TreeView Styles 779
The Menu Control 783
Menu Styles 786
Menu Templates 788
Summary 789
Chapter 18: Website Deployment ....791
Installing and Configuring IIS 791
Installing IIS 7 791
Managing IIS 7 793
Deploying a Website 795
Deploying by Copying Files 796
Using Web Deployment 801
xx
CONTENTS
Using FTP Deployment 809
Managing a Website 817
Creating a New Site 817
Creating Virtual Directories 818
Using the VirtualPathProvider 819
Using Application Pools 823
Using Application Warm-Up 826
Extending the Integrated Pipeline 828
Creating the Handler 828
Deploying the Handler 829
Configuring the Handler 829
Testing the Handler 830
Summary 831
Part 4: Security 833
II Chapter 19: The ASP.NET Security Model 835
What It Means to Create Secure Software 835
Understanding Potential Threats 835
Secure Coding Guidelines 836
Understanding Gatekeepers 837
Understanding the Levels of Security 838
Authentication,
838
Authorization 839
Confidentiality and Integrity 840
Pulling It All Together 841
Understanding Secure Sockets Layer 842
Understanding Certificates 843
Understanding SSL 843
Configuring SSL in IIS 7.x 845
Summary 849
xxi
CONTENTS
Chapter 20: Forms Authentication 851
Introducing Forms Authentication 851
Why Use Forms Authentication? 852
Why Would You Not Use Forms Authentication? 854
Why Not Implement Cookie Authentication Yourself? 855
The Forms Authentication Classes 856
Implementing Forms Authentication 857
Configuring Forms Authentication 857
Denying Access to Anonymous Users 861
Creating a Custom Login Page 862
Custom Credentials Store 868
Persistent Cookies in Forms Authentication 869
IIS 7.x and Forms Authentication 871
Summary 876
Chapter 21: Membership < 877
Introducing the ASP.NET Membership API 877
Using the Membership API 880
Configuring Forms Authentication 882
Creating the Data Store 883
Configuring Connection String and Membership Provider 890
Creating and Authenticating Users 893
Using the Security Controls 897
The Login Control 898
The LoginStatus Control 909
The LoginView Control 910
The PasswordRecovery Control 911
The ChangePassword Control 916
The CreateUserWizard Control 917
Configuring Membership in IIS 7.x 922
Configuring Providers and Users 922
Using the Membership API with Other Applications 924
xxii
CONTENTS
Using the Membership Class 926
Retrieving Users from the Store 927
Updating Users in the Store 929
Creating and Deleting Users 930
Validating Users 931
Summary 931
Chapter 22: Windows Authentication. .........933
Introducing Windows Authentication 933
Why Use Windows Authentication? 933
Why Would You Not Use Windows Authentication? 935
Mechanisms for Windows Authentication 935
Implementing Windows Authentication 942
Configuring IIS 7.x 942
Configuring ASP.NET 944
Deeper Into the IIS 7.x Pipeline 945
Denying Access to Anonymous Users 948
Accessing Windows User Information 950
Impersonation 956
Impersonation and Delegation in Windows 956
Configured Impersonation 958
Programmatic Impersonation 959
Summary 962
if Chapter 23: Authorization and Roles 963
URL Authorization 963
Authorization Rules 964
File Authorization 970
Authorization Checks in Code 970
Using the lslnRole{) Method 970
Using the PrincipalPermission Class 971
Using the Roles API for Role-Based Authorization 974
Using the LoginView Control with Roles 981
xxiii
CONTENTS
Accessing Roles Programmatically 981
Using the Roles API with Windows Authentication 984
Authorization and Roles in IIS 7.x 986
Authorization with ASP.NET Roles in IIS 7.x 989
Managing ASP.NET Roles with IIS 7.x 991
Summary 993
Chapter 24: Profiles 995
Understanding Profiles 995
Profile Performance 996
How Profiles Store Data 997
Profiles and Authentication 998
Profiles vs. Custom Data Components 998
Using the SqIProfileProvider 998
Creating the Profile Tables 999
Configuring the Provider 1002
Defining Profile Properties 1003
Using Profile Properties 1004
Profile Serialization 1006
Profile Groups 1008
Profiles and Custom Data Types 1008
The Profiles API 1012
Anonymous Profiles 1015
Custom Profile Providers 1017
The Custom Profile Provider Glasses 1018
Designing the FactoredProfileProvider 1020
Coding the FactoredProfileProvider 1021
Testing the FactoredProfileProvider 1025
Summary 1028
Chapter 25: Cryptography 1029
Encrypting Data: Confidentiality Matters 1029
The .NET Cryptography Namespace 1030
xxiv
CONTENTS
Understanding the .NET Cryptography Classes 1033
Symmetric Encryption Algorithms 1035
Asymmetric Encryption 1036
The Abstract Encryption Classes 1037
The ICryptoTransform Interface 1037
The CryptoStream Class 1038
Encrypting Sensitive Data 1039
Managing Secrets 1039
Using Symmetric Algorithms 1041
Using Asymmetric Algorithms 1047
Encrypting Sensitive Data in a Database 1049
Encrypting the Query String 1054
Wrapping the Query String 1054
Creating a Test Page 1057
Summary 1059
I Chapter 26: Custom Membership Providers ...1061
Architecture of Custom Providers 1061
Basic Steps for Creating Custom Providers 1063
Overall Design of the Custom Provider 1063
Designing and Implementing the Custom Store 1065
Implementing the Provider Classes 1072
Using the Custom Provider Classes 1092
Summary 1097
Part 5: Advanced User interface ..1099
Chapter 27: Custom Server Controls 1101
Custom Server Control Basics 1101
Creating a Bare-Bones Custom Control 1102
Using a Custom Control 1104
Custom Controls in the Toolbox 1105
Creating a Web Control That Supports Style Properties 1108
XXV
« CONTENTS
The Rendering Process 1111
Dealing with Different Browsers 1113
The HtmlTextWriter 1113
Browser Detection 1114
Browser Properties 1115
Overriding Browser Type Detection 1117
Adaptive Rendering 1117
Control State and Events 1119
View State 1119
Control State 1121
Postback Data and Change Events 1123
Triggering a Postback 1125
Extending Existing Web Controls 1127
Composite Controls 1127
Derived Controls 1130
Summary 1133
Chapter 28: Graphics, GDI+, and Charting 1135
The ImageMap Control 1135
Creating Hotspots 1136
Handling Hotspot Clicks 1137
A Custom Hotspot 1139
Drawing with GDI+ 1141
Simple Drawing 1141
Image Format and Quality 1143
The Graphics Class 1145
Using a GraphicsPath 1148
Pens 1149
Brushes 1152
Embedding Dynamic Graphics in a Web Page 1154
Using the PNG Format 1155
Passing Information to Dynamic Images 1155
Custom Controls That Use GDI+ 1158
xxvi
CONTENTS
Using the Chart Control 1163
Creating a Basic Chart 1163
Populating a Chart with Data 1170
Summary 1178
Chapter 29: JavaScript and Ajax Techniques . 1179
JavaScript Essentials 1179
The HTML Document Object Model 1180
Client-Side Events 1181
Script Blocks 1184
Manipulating HTML Elements 1185
Debugging JavaScript 1186
Basic JavaScript Examples 1189
Creating a JavaScript Page Processor 1190
Using JavaScript to Download Images Asynchronously 1193
Rendering Script Blocks 1198
Script Injection Attacks 1199
Request Validation 1200
Disabling Request Validation 1201
Extending Request Validation 1203
Custom Controls with JavaScript 1205
Pop-Up Windows 1205
Rollover Buttons 1210
Frames 1213
Frame Navigation 1214
Inline Frames 1216
Understanding Ajax 1217
The XMLHttpRequest Object 1218
An Ajax Example 1220
Using Ajax with Client Callbacks 1224
Creating a Client Callback 1225
Client Callbacks "Under the Hood" 1231
xxvii
CONTENTS
Client Callbacks in Custom Controls 1232
Summary 1237
Chapter 30: ASP.NET AJAX ..1239
Introducing ASP.NET AJAX 1239
ASP.NET AJAX on the Client: The Script Libraries 1240
ASP.NET AJAX on the Server: The ScriptManager 1241
Server Callbacks 1242
Web Services in ASP.NET AJAX 1243
Placing a Web Method in a Page 1250
ASP.NET AJAX Application Services 1252
ASP.NET AJAX Server Controls 1259
Partial Rendering with the UpdatePanel 1260
Timed Refreshes with the Timer 1268
Time-Consuming Updates with UpdateProgress 1269
Managing Browser History 1272
Deeper into the Client Libraries 1276
Understanding the Client Model 1276
Object-Oriented Programming in JavaScript 1277
The Web-Page Framework 1286
Control Extenders 1291
Installing the ASP.NET AJAX Control Toolkit 1292
The AutoCompleteExtender 1294
The ASP.NET AJAX Control Toolkit 1297
Summary 1302
Chapter 31: Portals with Web Part Pages 1303
Typical Portal Pages 1304
Basic Web Part Pages 1305
Creating the Page Design 1306
WebPartManager and WebPartZone Controls 1307
Adding Web Parts to the Page 1309
Customizing the Page 1313
xxviii
CONTENTS
Creating Web Parts 1316
Simple Web Part Tasks 1316
Developing Advanced Web Parts.... 1325
Web Part Editors 1335
Connecting Web Parts 1341
Custom Verbs and Web Parts 1350
User Controls and Advanced Web Parts 1351
Uploading Web Parts Dynamically 1354
Authorizing Web Parts 1360
Final Tasks for Personalization 1360
Summary 1361
Chapter 32: MVC 1363
Choosing Between MVC and Web Forms 1363
Creating a Basic MVC Application ,1364
Creating the Model 1365
Creating the Controller 1365
Creating the Index View 1366
Testing the (Incomplete) Application 1367
Completing the Controller and Views 1368
Modifying the Site.Master File 1371
Extending the Basic MVC Application 1371
Configuring Routing 1371
Adding Error Handling 1373
Adding Authentication 1374
Consolidating Data Store Access 1375
Adding Support for Foreign Key Constraints 1378
Customizing Views 1378
Modifying the View 1379
Adding View Data 1381
Adding to the Model 1383
xxix
CONTENTS
Validating Data 1388
Performing Basic Validation 1388
Adding Validation Annotations 1390
Using Action Results 1393
Returning JSON Data 1394
Calling Another Controller Method 1395
Summary 1396
if Chapter 33: Dynamic Data . . 1397
Creating a Dynamic Data Application 1397
Creating the Dynamic Data Site 1397
Exploring the Dynamic Data Site 1400
Understanding the Anatomy of a Dynamic Data Project 1403
Customizing a Dynamic Data Site 1404
Customizing with Templates 1404
Customizing with Routes 1414
Customizing with Metadata 1423
Customizing Validation 1430
Summary 1435
Chapter 34: Silverlight 1437
Understanding Silverlight 1438
Silverlight vs. Flash 1439
Silverlight System Requirements 1441
Creating a Silverlight Solution 1442
Silverlight Compilation 1443
The Entry Page 1445
Creating a Silverlight Project 1449
Designing a Silverlight Page 1450
Understanding XAML 1454
Setting Properties 1455
The XAML Code-Behind 1456
Handling Events 1457
XXX
CONTENTS
Browsing the Silverlight Class Libraries 1459
Layout 1460
The Canvas 1460
The Grid 1466
Animation 1471
Animation Basics 1471
Defining an Animation 1472
The Storyboard Class 1472
An Interactive Animation Example 1475
Transforms 1479
Using Web Services with Silverlight 1483
Creating the Web Service 1484
Adding a Web Reference ...1484
Calling the Web Service 1485
Configuring the Web Service URL 1487
Cross-Domain Web Service Calls 1488
Summary 1489
Index 1491
xxxi