■CHAPITRE 10 Contrôles de données enrichies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
Le GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
Définir des colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
Formatage du GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
Champs de formatage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
Styles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Valeurs spécifiques au formatage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
Sélection de ligne GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Utilisation de la sélection pour créer un formulaire principal-détails . . . . . . . . . . . . . . . . . . . . 398
L'événement SelectedIndexChanged . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Utilisation d'un champ de données comme bouton de sélection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Tri du GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Tri avec le SqlDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Tri avec ObjectDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Tri et sélection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Tri avancé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
xiv ■TABLE DES MATIÈRES
Pagination du GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
Pagination automatique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
Pagination personnalisée avec ObjectDataSource. . . . . . . . . . . . . . . . . . . . . . 408
Personnalisation de la barre de téléavertisseur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Modèles GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
Utilisation de plusieurs modèles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
Modification de modèles dans Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
Liaison à une méthode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
Gestion des événements dans un modèle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
Modification avec un modèle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
Le ListView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Regroupement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
Pagination . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428
Le DetailsView et le FormView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
La vue Détails . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
Le FormView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
Grilles avancées. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
Résumés dans GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
Une vue parent/enfant dans une seule table. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
Modification d'un champ à l'aide d'une table de recherche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
Servir des images à partir d'une base de données. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
Détection des conflits de concurrence. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
■CHAPITRE 11 Mise en cache et pages asynchrones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Comprendre la mise en cache ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Mise en cache des sorties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
Mise en cache de sortie déclarative. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
Mise en cache et chaîne de requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Mise en cache avec des paramètres de chaîne de requête spécifiques. . . . . . . . . . . . . . . . . . . . . 454
Contrôle de mise en cache personnalisé. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Mise en cache avec la classe HttpCachePolicy. . . . . . . . . . . . . . . . . . . . . . . . . . . 456
Substitution post-cache et mise en cache des fragments. . . . . . . . . . . . . . . . . . . . 457
Profils de cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459
Configuration du cache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
Mise en cache des données. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
Ajout d'éléments au cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
Un simple test de cache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
Priorités du cache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
Mise en cache avec les contrôles de source de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
Dépendances du cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Dépendances des éléments de fichier et de cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Dépendances agrégées. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
■TABLE DES MATIÈRES xv
Le rappel de l'élément supprimé. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Comprendre les notifications du cache SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
Notifications de cache dans SQL Server 2000 et SQL Server 7 . . . . . . . . . . . . 474
Notifications de cache dans SQL Server 2005 et SQL Server 2008 . . . . . . . . 479
Dépendances du cache personnalisé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
Une dépendance de cache personnalisée de base. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
Une dépendance de cache personnalisée utilisant des files d'attente de messages. . . . . . . . . . . . . . . 483
Pages asynchrones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
Création d'une page asynchrone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
Interrogation de données dans une page asynchrone. . . . . . . . . . . . . . . . . . . . . . . . . . . 488
Gestion des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
Utilisation de la mise en cache avec des tâches asynchrones . . . . . . . . . . . . . . . . . . . . . . . . . . 492
Plusieurs tâches asynchrones et délais d'attente. . . . . . . . . . . . . . . . . . . . . . . . 495
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
■CHAPITRE 12 Fichiers et flux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
Travailler avec le système de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
Les classes de répertoires et de fichiers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
Les classes DirectoryInfo et FileInfo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
La classe DriveInfo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503
Travailler avec des attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
Filtrer les fichiers avec des caractères génériques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
Récupération des informations sur la version du fichier. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
La classe Chemin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507
Un navigateur de fichiers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
Lecture et écriture de fichiers avec Streams. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
Fichiers texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
Fichiers binaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Téléchargement de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
Rendre les fichiers sécurisés pour plusieurs utilisateurs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
Compression. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
Sérialisation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
■CHAPITRE 13 LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
Bases de LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
Exécution différée. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
Comment fonctionne LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
Expressions LINQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
Expressions LINQ « Sous le capot ». . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
LINQ vers DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544
Ensembles de données typés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Valeurs nulles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
xvi ■TABLE DES MATIÈRES
LINQ vers SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
Classes d'entités de données. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
Le DataContext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
Requêtes LINQ to SQL « sous le capot ». . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
LINQ to SQL et composants de base de données. . . . . . . . . . . . . . . . . . . . . . . . . . . 554
Sélection d'un enregistrement ou d'une valeur unique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
Génération automatique de classes de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
Relations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563
Génération de méthodes pour les procédures stockées. . . . . . . . . . . . . . . . . . . . . . . . . 571
Validation des modifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
Le LinqDataSource. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
Affichage des données. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
Obtenir des données associées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
Modification des données. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Validation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586
■CHAPITRE 14 XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
Quand l’utilisation de XML a-t-elle du sens ?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
Une introduction à XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
Les avantages du XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589
XML bien formé. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
Espaces de noms XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
Schémas XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592
Traitement XML basé sur le flux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594
Écriture de fichiers XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594
Lecture de fichiers XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Traitement XML en mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600
Le XmlDocument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
Le XPathNavigator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
Le XDocument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Recherche de contenu XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
Recherche avec XmlDocument. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
Recherche de XmlDocument avec XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
Recherche dans XDocument avec LINQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617
Validation du contenu XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
Un schéma de base. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
Validation avec XmlDocument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
Validation avec XDocument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
Transformation du contenu XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
Une feuille de style de base. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
Utilisation de XslCompiledTransform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623
■TABLE DES MATIÈRES xvii
Utilisation du contrôle XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
Transformer XML avec LINQ to XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
Liaison de données XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
Liaison non hiérarchique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
Utilisation de XPath. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
Grilles imbriquées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632
Liaison hiérarchique avec TreeView . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
Utilisation de XSLT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
Liaison au contenu XML provenant d’autres sources. . . . . . . . . . . . . . . . . . . . . . . . 637
Mise à jour de XML via XmlDataSource . . . . . . . . . . . . . . . . . . . . . . . . 637
XML et le jeu de données ADO.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638
Conversion du DataSet en XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639
Accès à un DataSet en tant que XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642
PARTIE 3 ■ ■ ■ Création de sites Web ASP.NET
■CHAPITRE 15 Contrôles utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
Bases du contrôle utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
Création d'un contrôle utilisateur simple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 646
Conversion d'une page en contrôle utilisateur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
Ajout de code à un contrôle utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648
Gestion des événements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648
Ajout de propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649
Utilisation d'objets personnalisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 651
Ajout d'événements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 654
Exposition du contrôle Web interne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
Chargement dynamique des contrôles utilisateur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
Cadres de portail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658
Mise en cache partielle des pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
VaryByControl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662
Partage des contrôles mis en cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
■CHAPITRE 16 Thèmes et pages maîtres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
Feuilles de style en cascade. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
Création d'une feuille de style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
Application des règles de feuille de style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668
xviii ■TABLE DES MATIÈRES
Thèmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670
Dossiers et skins thématiques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671
Appliquer un thème simple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672
Gestion des conflits de thèmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
Création de plusieurs skins pour le même contrôle . . . . . . . . . . . . . . . . . . . . . . . 674
Skins avec modèles et images. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
Utiliser CSS dans un thème . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677
Application de thèmes via un fichier de configuration . . . . . . . . . . . . . . . . . . . . . 677
Application dynamique de thèmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678
Standardisation de la mise en page du site Web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
Notions de base de la page maître. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
Une simple page maître. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681
Une page de contenu simple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683
Contenu par défaut. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684
Pages maîtres avec tableaux et mise en page CSS. . . . . . . . . . . . . . . . . . . . . . . . . 685
Pages maîtres et chemins relatifs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
Application de pages maîtres via un fichier de configuration. . . . . . . . . . . . . . . . . 688
Pages maîtres avancées. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Interagir avec la classe de page maître . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Définition dynamique d'une page maître. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690
Pages maîtres imbriquées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693
■CHAPITRE 17 Navigation sur le site Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
Pages avec plusieurs vues. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
Le contrôle MultiView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696
Le contrôle Assistant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 700
Plans des sites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707
Définir un plan de site . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
Liaison à un plan du site. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710
Fil d'Ariane. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
Affichage d'une partie du plan du site . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713
Les objets du plan du site. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716
Ajout d'informations de plan de site personnalisé. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
Création d'un SiteMapProvider personnalisé. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
Mappage d'URL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725
Découpage de sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 726
Le contrôle TreeView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728
Le TreeNode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 729
Remplissage des nœuds à la demande. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 731
Styles d'arborescence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
■TABLE DES MATIÈRES xix
Le contrôle de menu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 737
Styles de menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 740
Modèles de menus. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 743
■CHAPITRE 18 Déploiement de sites Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
Services d'informations Internet (IIS). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
Sites Web IIS et répertoires virtuels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746
Console de gestion IIS et configuration IIS . . . . . . . . . . . . . . . . . . . . . 747
Mappage de sites Web, de répertoires virtuels et de fichiers avec des URL. . . . . . . . . . . . . 748
Plongée dans l'architecture d'IIS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750
Installation d'IIS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765
Gestion des sites Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 771
Gestion des répertoires virtuels et des sites Web avec IIS 5.x et IIS 6.0. . . . . . . 772
Gestion des pools d'applications dans IIS 6.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778
Gestion des répertoires virtuels et des sites Web avec IIS 7.0. . . . . . . . . . . . . . . 784
Gestion des pools d'applications dans IIS 7.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 796
Déploiement de vos applications ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798
Vérification de l'installation d'ASP.NET sur IIS 5.x et IIS 6.0. . . . . . . . . . . . . . 800
Exécution côte à côte d’ASP.NET sur IIS 5.x et IIS 6.0. . . . . . . . . . . . . . . 801
Exécution côte à côte d’ASP.NET sur IIS 7.0 . . . . . . . . . . . . . . . . . . . . . . . . 803
Configuration des paramètres d'exécution HTTP lors du déploiement sur IIS 5.x. . . . . . . . 803
Modèles de compilation dans ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 804
Déploiement avec Visual Studio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 808
Projets de déploiement Web Visual Studio 2005 . . . . . . . . . . . . . . . . . . . . . . 809
Le VirtualPathProvider dans ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815
Surveillance de l'état de santé dans ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 819
Comprendre la structure de base. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
Événements et prestataires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 823
PARTIE 4 ■ ■ ■ Sécurité
■CHAPITRE 19 Le modèle de sécurité ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 827
Ce que signifie créer un logiciel sécurisé. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 827
Comprendre les menaces potentielles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828
Directives de codage sécurisé. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828
Comprendre les gardiens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 829
Comprendre les niveaux de sécurité. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 830
Authentification. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 831
Autorisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 832
xx ■TABLE DES MATIÈRES
Confidentialité et intégrité. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 833
Rassembler tout cela. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 833
Sécurité des services d'informations Internet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835
Authentification et autorisation sur IIS 5.x et IIS 6.0 . . . . . . . . . . . . . . . 835
Configuration de la sécurité sur IIS 7.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 838
Comprendre la couche de sockets sécurisés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843
Architecture de sécurité ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 852
Authentification. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853
Autorisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855
Le contexte de sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855
API d'adhésion et de rôles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 858
■CHAPITRE 20 Authentification par formulaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 859
Présentation de l'authentification par formulaires. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 859
Pourquoi utiliser l'authentification par formulaires ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 860
Pourquoi n’utiliseriez-vous pas l’authentification par formulaire ? . . . . . . . . . . . . . . . . . . . . 862
Pourquoi ne pas mettre en œuvre vous-même l’authentification par cookies ? . . . . . . . . . . . . . . . . 863
Les classes d'authentification par formulaires. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 864
Implémentation de l'authentification par formulaires. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865
Configuration de l'authentification par formulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865
Refuser l'accès aux utilisateurs anonymes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869
Création d'une page de connexion personnalisée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869
Magasin d'informations d'identification personnalisées. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876
Cookies persistants dans l'authentification par formulaires. . . . . . . . . . . . . . . . . . . . . . . . 877
IIS 7.0 et authentification par formulaires. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 878
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 884
■CHAPITRE 21 Adhésion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885
Présentation de l'API d'adhésion ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885
Utilisation de l'API d'adhésion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 888
Configuration de l'authentification par formulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 889
Création du magasin de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 890
Configuration de la chaîne de connexion et du fournisseur d'adhésion . . . . . . . . . . . . . 896
Création et authentification des utilisateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 900
Utilisation des contrôles de sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 902
Le contrôle de connexion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 904
Le contrôle LoginStatus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 914
Le contrôle LoginView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915
Le contrôle de récupération de mot de passe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 916
Le contrôle ChangePassword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 921
Le contrôle CreateUserWizard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 922
■TABLE DES MATIÈRES xxi
Configuration de l'adhésion dans IIS 7.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 926
Configuration des fournisseurs et des utilisateurs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 926
Utilisation de l'API d'adhésion avec d'autres applications. . . . . . . . . . . . . . . . . . 928
Utilisation de la classe d'adhésion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
Récupération des utilisateurs du Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
Mise à jour des utilisateurs dans le magasin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933
Création et suppression d'utilisateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933
Validation des utilisateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 934
Utilisation de l'adhésion dans Windows Forms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 935
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 937
■CHAPITRE 22 Authentification Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 939
Présentation de l'authentification Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 939
Pourquoi utiliser l'authentification Windows ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 940
Pourquoi n’utiliseriez-vous pas l’authentification Windows ? . . . . . . . . . . . . . . . . . . 941
Mécanismes d'authentification Windows . . . . . . . . . . . . . . . . . . . . . . . . . . 942
Implémentation de l'authentification Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 948
Configuration d'IIS 5.x ou IIS 6.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 948
Configuration d'IIS 7.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 950
Configuration d'ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 952
Refuser l'accès aux utilisateurs anonymes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 955
Accès aux informations utilisateur Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 957
Usurpation d'identité. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 962
Usurpation d'identité dans Windows 2000 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 963
Usurpation d'identité sous Windows XP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 964
Usurpation d'identité et délégation sur Windows Server 2003 . . . . . . . . . . . . . 964
Usurpation d'identité sous Windows Vista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 967
Usurpation d'identité et délégation sur Windows Server 2008 . . . . . . . . . . . . . 968
Usurpation d'identité configurée. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 968
Usurpation d'identité programmatique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 970
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 973
■CHAPITRE 23 Autorisation et rôles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975
Autorisation d'URL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975
Règles d'autorisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 976
Autorisation de fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 981
Vérifications d'autorisation dans le code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 982
Utilisation de la méthode IsInRole(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 982
Utilisation de la classe PrincipalPermission . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 983
Utilisation de l'API Roles pour l'autorisation basée sur les rôles . . . . . . . . . . . . . . . . . . . . . . . . 985
Utilisation du contrôle LoginView avec des rôles. . . . . . . . . . . . . . . . . . . . . . . . . . . . 991
Accès aux rôles par programmation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 992
Utilisation de l'API Roles avec l'authentification Windows. . . . . . . . . . . . . . . . . . . 994
xxii ■TABLE DES MATIÈRES
Protection des ressources non-ASP.NET dans IIS 5 et 6 . . . . . . . . . . . . . . . . . . . . . . . . 997
Ajout d'un mappage de type de fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997
Écriture d'un gestionnaire HTTP personnalisé. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 998
Autorisation et rôles dans IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1000
Autorisation avec les rôles ASP.NET dans IIS 7.0 . . . . . . . . . . . . . . . . . . . . . . . 1002
Gestion des rôles ASP.NET avec IIS 7.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1005
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1006
■CHAPITRE 24 Profils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009
Comprendre les profils. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009
Performances du profil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009
Comment les profils stockent les données. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1010
Profils et authentification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011
Profils et composants de données personnalisés. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011
Utilisation du SqlProfileProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1012
Création des tables de profils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1012
Configuration du fournisseur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1015
Définition des propriétés du profil. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1016
Utilisation des propriétés du profil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1017
Sérialisation du profil. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1018
Groupes de profils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1020
Profils et types de données personnalisés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1021
L'API Profils. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1024
Profils anonymes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1026
Fournisseurs de profils personnalisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1029
Les classes du fournisseur de profil personnalisé. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1029
Conception du FactoredProfileProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1031
Codage du FactoredProfileProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1033
Test du FactoredProfileProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1037
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1040
■CHAPITRE 25 Cryptographie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1041
Chiffrement des données : la confidentialité compte. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1041
L'espace de noms de cryptographie .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1042
Comprendre les classes de cryptographie .NET. . . . . . . . . . . . . . . . . . . . . . . . . . 1046
Algorithmes de chiffrement symétriques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1047
Chiffrement asymétrique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1048
Les classes de chiffrement abstraites. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1049
L'interface ICryptoTransform. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1050
La classe CryptoStream. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1050
■TABLE DES MATIÈRES xxiii
Cryptage des données sensibles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1051
Gestion des secrets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1052
Utilisation d'algorithmes symétriques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1053
Utilisation d'algorithmes asymétriques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1058
Chiffrement des données sensibles dans une base de données . . . . . . . . . . . . . . . . . . . . . . . . . . 1061
Chiffrement de la chaîne de requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1065
Enveloppement de la chaîne de requête. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1066
Création d'une page de test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1069
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1070
■CHAPITRE 26 Fournisseurs d'adhésions personnalisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1071
Architecture des fournisseurs personnalisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1071
Étapes de base pour créer des fournisseurs personnalisés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1073
Conception globale du fournisseur personnalisé. . . . . . . . . . . . . . . . . . . . . . . . . . . 1073
Conception et mise en œuvre du Custom Store. . . . . . . . . . . . . . . . . . . . 1074
Implémentation des classes de fournisseur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1082
Utilisation des classes de fournisseur personnalisé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1102
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1106
PARTIE 5 ■ ■ ■ Interface utilisateur avancée
■CHAPITRE 27 Contrôles de serveur personnalisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1109
Bases du contrôle de serveur personnalisé. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1109
Création d'un contrôle personnalisé Bare-Bones. . . . . . . . . . . . . . . . . . . . . . . . . . . 1110
Utilisation d'un contrôle personnalisé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1112
Contrôles personnalisés dans la boîte à outils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1113
Création d'un contrôle Web prenant en charge les propriétés de style . . . . . . . . . . . . . . 1114
Le processus de rendu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1118
Gérer différents navigateurs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1119
Le HtmlTextWriter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1119
Détection du navigateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1120
Propriétés du navigateur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1122
Remplacement de la détection du type de navigateur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1124
Rendu adaptatif. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1125
État et événements du contrôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1127
Afficher l'état. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1127
État de contrôle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1129
Données de publication et événements de modification. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1131
Déclenchement d'une publication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1133
Extension des contrôles Web existants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1135
Contrôles composites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1135
Fin des contrôles dérivés de la barre latérale. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1138
xxiv ■TABLE DES MATIÈRES
Contrôles de modèle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1141
Création d'un contrôle modèle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1141
Utilisation de modèles personnalisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1143
Styles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1148
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1150
■CHAPITRE 28 Prise en charge au moment de la conception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1151
Les acteurs clés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1151
Attributs au moment de la conception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1152
La fenêtre Propriétés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1153
Attributs et héritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1157
L'icône de la boîte à outils. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1158
Ressources Web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1159
Création d'une ressource. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1159
Récupération d'une ressource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1160
Substitution de texte. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1161
Sérialisation du code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1162
Convertisseurs de types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1162
Attributs de sérialisation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1170
Éditeurs de caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1172
Concepteurs de contrôles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1174
HTML au moment de la conception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1175
Balises intelligentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1177
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1182
■CHAPITRE 29 Graphiques dynamiques et GDI+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1183
Le contrôle ImageMap. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1183
Création de points chauds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1184
Gestion des clics sur les points d'accès. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1185
Un point d'accès personnalisé. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1186
Dessiner avec GDI+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1188
Dessin simple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1189
Format et qualité des images. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1191
La classe graphique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1192
Utilisation d'un GraphicsPath. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1194
Stylos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1195
Pinceaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1198
Intégration de graphiques dynamiques dans une page Web . . . . . . . . . . . . . . . . . . . . . . . . . . 1199
Utilisation du format PNG. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1200
Transmission d'informations aux images dynamiques. . . . . . . . . . . . . . . . . . . . . . . . . . 1201
Contrôles personnalisés utilisant GDI+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1204
Cartographie avec GDI+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1208
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1213
■TABLE DES MATIÈRES xxv
■CHAPITRE 30 Portails avec pages de composants WebPart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1215
Pages de portail typiques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1216
Pages de composants WebPart de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1217
Création de la conception de la page. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1218
Contrôles WebPartManager et WebPartZone . . . . . . . . . . . . . . . . . . . . . . 1219
Ajout de composants WebPart à la page. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1221
Personnalisation de la page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1224
Création de composants WebPart. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1226
Tâches simples de composants WebPart. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1227
Développement de composants WebPart avancés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1235
Éditeurs de composants WebPart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1244
Connexion de composants WebPart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1250
Verbes et composants WebPart personnalisés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1258
Contrôles utilisateur et composants WebPart avancés. . . . . . . . . . . . . . . . . . . . . . . . . . . 1259
Téléchargement dynamique de composants WebPart. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1262
Autorisation des composants WebPart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1268
Tâches finales de personnalisation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1268
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1269
PARTIE 6 ■ ■ ■ Programmation côté client
■CHAPITRE 31 Techniques JavaScript et Ajax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1273
Les essentiels de JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1273
Le modèle objet du document HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1274
Événements côté client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1275
Blocs de script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1277
Manipulation des éléments HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1279
Débogage de JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1280
Exemples JavaScript de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1282
Création d'un processeur de page JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1282
Utilisation de JavaScript pour télécharger des images de manière asynchrone. . . . . . . . . . . . . . 1285
Rendu des blocs de script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1290
Attaques par injection de scripts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1291
Validation de la demande. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1291
Désactivation de la validation des demandes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1292
Contrôles personnalisés avec JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1294
Fenêtres contextuelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1294
Boutons de survol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1298
Cadres. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1301
Navigation dans les cadres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1302
Cadres en ligne. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1303
xxvi ■TABLE DES MATIÈRES
Comprendre Ajax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1304
L'objet XMLHttpRequest. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1305
Un exemple Ajax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1307
Utilisation d'Ajax avec les rappels clients. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1311
Création d'un rappel client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1311
Rappels clients « sous le capot ». . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1317
Rappels clients dans les contrôles personnalisés. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1318
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1322
■CHAPITRE 32 ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1323
Présentation d'ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1323
ASP.NET AJAX sur le client : les bibliothèques de scripts . . . . . . . . . . . . . . . . . . 1325
ASP.NET AJAX sur le serveur : Le ScriptManager . . . . . . . . . . . . . . . . . . 1325
Rappels du serveur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1326
Services Web dans ASP.NET AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1327
Le proxy de services Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1334
Placer une méthode Web dans une page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1336
Services d'applications ASP.NET AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1337
Contrôles du serveur ASP.NET AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1344
Rendu partiel avec UpdatePanel. . . . . . . . . . . . . . . . . . . . . . . . . . . 1344
Actualisations chronométrées avec la minuterie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1351
Mises à jour fastidieuses avec UpdateProgress. . . . . . . . . . . . . . . . . . . . 1352
Approfondissez les bibliothèques clientes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1355
Comprendre le modèle client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1356
Programmation orientée objet en JavaScript. . . . . . . . . . . . . . . . . . . . . . . 1357
Le cadre de pages Web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1364
Extensions de contrôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1369
Installation de la boîte à outils de contrôle ASP.NET AJAX . . . . . . . . . . . . . . . . . . . . . . . 1370
L'AutoCompleteExtender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1371
La boîte à outils de contrôle ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1374
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1378
■CHAPITRE 33 Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1379
Comprendre Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1379
Silverlight contre Flash. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1380
Adoption de Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1382
Silverlight et WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1382
Installation de Silverlight et des extensions Visual Studio . . . . . . . . . . . . . . . 1383
Création d'un projet Silverlight . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1384
La page d'entrée HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1385
Le script d'initialisation Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1386
La page XAML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1388
Le code-behind XAML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1391
■TABLE DES MATIÈRES xxvii
Propriétés et événements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1392
Compilation Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1393
Les essentiels de Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1394
Classes .NET Framework dans Silverlight . . . . . . . . . . . . . . . . . . . . . . . . . . . 1395
La Toile. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1396
Texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1401
Interagir avec HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1402
Stockage isolé. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1406
Silverlight et ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1408
ASP.NET Futures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1408
Communication entre Silverlight et ASP.NET . . . . . . . . . . . . . . . . . . 1412
Dessiner en 2D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1412
Formes simples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1413
Chemins et géométries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1417
Pinceaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1425
Transparence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1427
Animations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1429
Les bases de l'animation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14h30
Définir une animation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14h30
Un exemple d'animation interactive. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1434
Se transforme. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1437
Résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1440
■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1441
Développer