■CAPÍTULO 10 Controles de datos enriquecidos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
El GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
Definición de columnas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
Formatear el GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
Campos de formato. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
Estilos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Valores específicos del formato. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
Selección de fila de GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Uso de la selección para crear un formulario maestro-detalles. . . . . . . . . . . . . . . . . . . . 398
El evento SelectedIndexChanged. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Uso de un campo de datos como botón de selección. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Ordenando el GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Ordenando con SqlDataSource. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Ordenar con ObjectDataSource. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Clasificación y Selección. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Clasificación avanzada. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
xiv ■ CONTENIDO
Paginando el GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
Localización automática. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
Paginación personalizada con ObjectDataSource. . . . . . . . . . . . . . . . . . . . . . 408
Personalización de la barra de buscapersonas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Plantillas GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
Usando múltiples plantillas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
Edición de plantillas en Visual Studio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
Vinculación a un método. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
Manejo de eventos en una plantilla. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
Edición con una plantilla. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
El ListView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Agrupación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
Paginación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428
DetallesView y FormView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
La vista de detalles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
El FormView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
Cuadrículas avanzadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
Resúmenes en GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
Una vista principal/secundaria en una sola tabla. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
Edición de un campo mediante una tabla de búsqueda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
Servir imágenes desde una base de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
Detección de conflictos de concurrencia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
■CAPÍTULO 11 Almacenamiento en caché y páginas asincrónicas. . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Comprender el almacenamiento en caché de ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Almacenamiento en caché de resultados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
Almacenamiento en caché de salida declarativa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
Almacenamiento en caché y cadena de consulta. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Almacenamiento en caché con parámetros de cadena de consulta específicos. . . . . . . . . . . . . . . . . . . . . 454
Control de almacenamiento en caché personalizado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Almacenamiento en caché con la clase HttpCachePolicy. . . . . . . . . . . . . . . . . . . . . . . . . . . 456
Sustitución posterior al caché y almacenamiento en caché de fragmentos. . . . . . . . . . . . . . . . . . . . 457
Perfiles de caché. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459
Configuración de caché. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
Almacenamiento en caché de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
Agregar elementos al caché. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
Una prueba de caché sencilla. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
Prioridades de caché. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
Almacenamiento en caché con los controles de origen de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
Dependencias de caché. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Dependencias de elementos de archivos y caché. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Dependencias agregadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
■CONTENIDO xv
La devolución de llamada del artículo eliminado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Comprensión de las notificaciones de caché de SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . 473
Notificaciones de caché en SQL Server 2000 y SQL Server 7. . . . . . . . . . . . 474
Notificaciones de caché en SQL Server 2005 y SQL Server 2008. . . . . . . . 479
Dependencias de caché personalizadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
Una dependencia de caché personalizada básica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
Una dependencia de caché personalizada mediante colas de mensajes. . . . . . . . . . . . . . . 483
Páginas asincrónicas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
Creando una página asincrónica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
Consulta de datos en una página asincrónica. . . . . . . . . . . . . . . . . . . . . . . . . . . 488
Manejo de errores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
Uso del almacenamiento en caché con tareas asincrónicas. . . . . . . . . . . . . . . . . . . . . . . . . . 492
Múltiples tareas asincrónicas y tiempos de espera. . . . . . . . . . . . . . . . . . . . . . . . 495
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
■CAPÍTULO 12 Archivos y secuencias. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
Trabajar con el sistema de archivos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
Las clases de directorio y archivo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
Las clases DirectoryInfo y FileInfo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
La clase DriveInfo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503
Trabajar con atributos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
Filtrar archivos con comodines. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
Recuperar información de la versión del archivo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
La clase de ruta. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507
Un explorador de archivos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
Lectura y escritura de archivos con Streams. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
Archivos de texto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
Archivos binarios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Subiendo archivos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
Hacer que los archivos sean seguros para varios usuarios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
Compresión. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
Publicación por entregas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
■CAPÍTULO 13 LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
Conceptos básicos de LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
Ejecución Diferida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
Cómo funciona LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
Expresiones LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
Expresiones LINQ "Bajo el capó". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
LINQ al conjunto de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544
Conjuntos de datos escritos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Valores nulos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
xvi ■CONTENIDO
LINQ a SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
Clases de entidades de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
El contexto de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
Consultas de LINQ a SQL "bajo el capó" . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
LINQ to SQL y componentes de bases de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . 554
Seleccionar un único registro o valor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
Generando clases de datos automáticamente. . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
Relaciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563
Generación de métodos para procedimientos almacenados. . . . . . . . . . . . . . . . . . . . . . . . . 571
Realizar cambios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
El LinqDataSource. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
Visualización de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
Obteniendo datos relacionados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
Edición de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Validación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586
■CAPÍTULO 14 XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
¿Cuándo tiene sentido utilizar XML? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
Una introducción a XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
Las ventajas de XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589
XML bien formado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
Espacios de nombres XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
Esquemas XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592
Procesamiento XML basado en secuencias. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594
Escritura de archivos XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594
Lectura de archivos XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Procesamiento XML en memoria. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600
El documento Xml. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
El navegador XPath. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
El documento X. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Búsqueda de contenido XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
Buscando con XmlDocument. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
Buscando XmlDocument con XPath. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
Buscando XDocument con LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617
Validación de contenido XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
Un esquema básico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
Validando con XmlDocument. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
Validando con XDocument. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
Transformando contenido XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
Una hoja de estilo básica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
Usando XslCompiledTransform. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623
■CONTENIDO xvii
Usando el control XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
Transformando XML con LINQ a XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
Enlace de datos XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
Vinculación no jerárquica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
Usando XPath. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
Cuadrículas anidadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632
Enlace jerárquico con TreeView. . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
Usando XSLT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
Enlace a contenido XML de otras fuentes. . . . . . . . . . . . . . . . . . . . . . . . 637
Actualización de XML a través de XmlDataSource. . . . . . . . . . . . . . . . . . . . . . . . 637
XML y el conjunto de datos ADO.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638
Conversión del conjunto de datos a XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639
Accediendo a un conjunto de datos como XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642
PARTE 3 ■ ■ ■ Creación de sitios web ASP.NET
■CAPÍTULO 15 Controles de usuario. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
Conceptos básicos de control de usuario. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
Creando un control de usuario simple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 646
Convertir una página en un control de usuario. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
Agregar código a un control de usuario. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648
Manejo de Eventos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648
Agregar propiedades. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649
Usando objetos personalizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 651
Agregar eventos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 654
"Exponiendo el control de la red interna". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
Carga dinámica de controles de usuario. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
Marcos de portal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658
Almacenamiento en caché de páginas parciales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
Variar por control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662
Compartir controles en caché. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
■CAPÍTULO 16 Temas y páginas maestras. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
Hojas de estilo en cascada. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
Creando una hoja de estilo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
Aplicar reglas de hojas de estilo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668
xviii ■CONTENIDO
Temas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670
Carpetas de temas y máscaras. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671
Aplicar un tema simple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672
Manejo de conflictos temáticos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
Creación de múltiples máscaras para el mismo control. . . . . . . . . . . . . . . . . . . . . . . 674
Máscaras con plantillas e imágenes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
Usando CSS en un tema. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677
Aplicar temas a través de un archivo de configuración. . . . . . . . . . . . . . . . . . . . . 677
Aplicar temas dinámicamente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678
Estandarización del diseño del sitio web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
Conceptos básicos de la página maestra. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
Una página maestra sencilla. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681
Una página de contenido simple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683
Contenido predeterminado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684
Páginas maestras con tablas y diseño CSS. . . . . . . . . . . . . . . . . . . . . . . . . 685
Páginas maestras y rutas relativas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
Aplicación de páginas maestras a través de un archivo de configuración. . . . . . . . . . . . . . . . . 688
Páginas maestras avanzadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Interactuando con la clase Master Page. . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Configuración dinámica de una página maestra. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690
Anidamiento de páginas maestras. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693
■CAPÍTULO 17 Navegación por el sitio web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
Páginas con múltiples vistas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
El control MultiView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696
El control del asistente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 700
Mapas del sitio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707
Definición de un mapa del sitio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
Vinculación a un mapa del sitio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710
Pan rallado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
Mostrando una parte del mapa del sitio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713
Los objetos del mapa del sitio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716
Agregar información personalizada del mapa del sitio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
Creación de un SiteMapProvider personalizado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
Mapeo de URL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725
Recorte de seguridad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 726
El control TreeView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728
El nodo del árbol. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 729
Poblando nodos bajo demanda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 731
Estilos de vista de árbol. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
■CONTENIDO xix
El control del menú. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 737
Estilos de menú. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 740
Plantillas de menú. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 743
■CAPÍTULO 18 Implementación del sitio web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
Servicios de información de Internet (IIS). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
Sitios web y directorios virtuales de IIS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746
Consola de administración de IIS y configuración de IIS. . . . . . . . . . . . . . . . . . . . . 747
Asignación de sitios web, directorios virtuales y archivos a URL. . . . . . . . . . . . . 748
Profundizando en la arquitectura de IIS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750
Instalación de IIS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765
Gestión de sitios web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 771
Gestión de directorios virtuales y sitios web con IIS 5.x e IIS 6.0. . . . . . . 772
Gestión de grupos de aplicaciones en IIS 6.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778
Gestión de directorios virtuales y sitios web con IIS 7.0. . . . . . . . . . . . . . . 784
Gestión de grupos de aplicaciones en IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 796
Implementación de sus aplicaciones ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798
Verificación de la instalación de ASP.NET en IIS 5.x e IIS 6.0. . . . . . . . . . . . . . 800
Ejecución en paralelo de ASP.NET en IIS 5.x e IIS 6.0. . . . . . . . . . . . . . . 801
Ejecución en paralelo de ASP.NET en IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . . 803
Configuración de los ajustes de tiempo de ejecución HTTP al implementar en IIS 5.x. . . . . . . . 803
Modelos de compilación en ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 804
Implementación con Visual Studio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 808
Proyectos de implementación web de Visual Studio 2005. . . . . . . . . . . . . . . . . . . . . . 809
VirtualPathProvider en ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815
Monitoreo de salud en ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 819
Comprensión de la estructura básica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
Eventos y Proveedores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 823
PARTE 4 ■ ■ ■ Seguridad
■CAPÍTULO 19 El modelo de seguridad ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 827
Qué significa crear software seguro. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 827
Comprender las amenazas potenciales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828
Directrices de codificación segura. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828
Comprender a los guardianes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 829
Comprender los niveles de seguridad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 830
Autenticación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 831
Autorización. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 832
xx ■CONTENIDO
Confidencialidad e Integridad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 833
Reuniéndolo todo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 833
Seguridad de los servicios de información de Internet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835
Autenticación y autorización en IIS 5.x e IIS 6.0. . . . . . . . . . . . . . . 835
Configuración de seguridad en IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 838
Comprender la capa de sockets seguros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843
Arquitectura de seguridad ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 852
Autenticación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853
Autorización. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855
El contexto de seguridad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855
API de membresía y roles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 858
■CAPÍTULO 20 Autenticación de formularios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 859
Presentamos la autenticación de formularios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 859
¿Por qué utilizar la autenticación de formularios? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 860
¿Por qué no utilizaría la autenticación de formularios? . . . . . . . . . . . . . . . . . . . . 862
¿Por qué no implementar usted mismo la autenticación de cookies? . . . . . . . . . . . . . . . . 863
Las clases de autenticación de formularios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 864
Implementación de autenticación de formularios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865
Configurar la autenticación de formularios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865
Denegar el acceso a usuarios anónimos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869
Crear una página de inicio de sesión personalizada. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869
Tienda de credenciales personalizadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876
Cookies persistentes en autenticación de formularios. . . . . . . . . . . . . . . . . . . . . . . . 877
IIS 7.0 y autenticación de formularios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 878
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 884
■CAPÍTULO 21 Membresía . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885
Presentamos la API de membresía de ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885
Usando la API de membresía. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 888
Configurar la autenticación de formularios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 889
Creando el almacén de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 890
Configuración de cadena de conexión y proveedor de membresía. . . . . . . . . . . . . 896
Creación y autenticación de usuarios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 900
Usando los controles de seguridad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 902
El control de inicio de sesión. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 904
El control de estado de inicio de sesión. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 914
El control LoginView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915
El control de recuperación de contraseña. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 916
El control de cambio de contraseña. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 921
El control CreateUserWizard. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 922
■CONTENIDO xxi
Configuración de membresía en IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 926
Configuración de Proveedores y Usuarios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 926
Uso de la API de membresía con otras aplicaciones. . . . . . . . . . . . . . . . . . 928
Usando la clase de membresía. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
Recuperar usuarios de la tienda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
Actualización de Usuarios en la Tienda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933
Crear y eliminar usuarios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933
Validación de usuarios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 934
Uso de membresía en Windows Forms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 935
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 937
■CAPÍTULO 22 Autenticación de Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 939
Presentamos la autenticación de Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 939
¿Por qué utilizar la autenticación de Windows? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 940
¿Por qué no utilizaría la autenticación de Windows? . . . . . . . . . . . . . . . . . . 941
Mecanismos de autenticación de Windows. . . . . . . . . . . . . . . . . . . . . . . . . . 942
Implementación de la autenticación de Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 948
Configuración de IIS 5.x o IIS 6.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 948
Configurando IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 950
Configurando ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 952
Denegar el acceso a usuarios anónimos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 955
Acceso a la información del usuario de Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 957
Suplantación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 962
Suplantación en Windows 2000. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 963
Suplantación en Windows XP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 964
Suplantación y delegación en Windows Server 2003. . . . . . . . . . . . . 964
Suplantación en Windows Vista. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 967
Suplantación y delegación en Windows Server 2008. . . . . . . . . . . . . 968
Suplantación configurada. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 968
Suplantación programática. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 970
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 973
■CAPÍTULO 23 Autorización y funciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975
Autorización de URL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975
Reglas de autorización. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 976
Autorización de Archivo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 981
Verificaciones de autorización en código. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 982
Usando el método IsInRole(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 982
Usando la clase PrincipalPermission. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 983
Uso de la API de roles para autorización basada en roles. . . . . . . . . . . . . . . . . . . . . . . . 985
Usando el control LoginView con roles. . . . . . . . . . . . . . . . . . . . . . . . . . . . 991
Acceso a roles mediante programación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 992
Uso de la API de roles con autenticación de Windows. . . . . . . . . . . . . . . . . . . 994
xxii ■CONTENIDO
Protección de recursos que no son ASP.NET en IIS 5 y 6. . . . . . . . . . . . . . . . . . . . . . . . 997
Agregar una asignación de tipo de archivo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997
Escribir un controlador HTTP personalizado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 998
Autorización y roles en IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1000
Autorización con Roles ASP.NET en IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . 1002
Gestión de funciones de ASP.NET con IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1005
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1006
■CAPÍTULO 24 Perfiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009
Comprensión de los perfiles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009
Rendimiento del perfil. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009
Cómo los perfiles almacenan datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1010
Perfiles y autenticación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011
Perfiles frente a componentes de datos personalizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011
Usando SqlProfileProvider. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1012
Creando las tablas de perfil. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1012
Configurando el Proveedor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1015
Definición de propiedades del perfil. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1016
Usando las propiedades del perfil. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1017
Serialización de perfiles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1018
Grupos de perfiles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1020
Perfiles y tipos de datos personalizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1021
La API de perfiles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1024
Perfiles anónimos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1026
Proveedores de perfiles personalizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1029
Las clases de proveedores de perfiles personalizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1029
Diseño de FactoredProfileProvider. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1031
Codificando FactoredProfileProvider. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1033
Probando FactoredProfileProvider. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1037
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1040
■CAPÍTULO 25 Criptografía. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1041
Cifrado de datos: la confidencialidad importa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1041
El espacio de nombres de criptografía .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1042
Comprensión de las clases de criptografía .NET. . . . . . . . . . . . . . . . . . . . . . . . . . 1046
Algoritmos de cifrado simétrico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1047
Cifrado asimétrico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1048
Las clases de cifrado abstracto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1049
La interfaz ICryptoTransform. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1050
La clase CryptoStream. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1050
■CONTENIDO xxiii
Cifrado de datos confidenciales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1051
Manejo de secretos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1052
Usando algoritmos simétricos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1053
Usando algoritmos asimétricos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1058
Cifrar datos confidenciales en una base de datos. . . . . . . . . . . . . . . . . . . . . . . . . . 1061
Cifrar la cadena de consulta. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1065
Envolviendo la cadena de consulta. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1066
Creando una página de prueba. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1069
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1070
■CAPÍTULO 26 Proveedores de membresía personalizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1071
Arquitectura de Proveedores Personalizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1071
Pasos básicos para crear proveedores personalizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1073
Diseño General del Proveedor Personalizado. . . . . . . . . . . . . . . . . . . . . . . . . . . 1073
Diseño e Implementación de la Tienda Personalizada. . . . . . . . . . . . . . . . . . . . 1074
Implementación de las clases de proveedores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1082
Uso de las clases de proveedores personalizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1102
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1106
PARTE 5 ■ ■ ■ Interfaz de usuario avanzada
■CAPÍTULO 27 Controles de servidor personalizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1109
Conceptos básicos del control de servidor personalizado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1109
Creación de un control personalizado básico. . . . . . . . . . . . . . . . . . . . . . . . . . . 1110
Usando un control personalizado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1112
Controles personalizados en la caja de herramientas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1113
Crear un control web que admita propiedades de estilo. . . . . . . . . . . . . . 1114
El proceso de renderizado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1118
Manejo de diferentes navegadores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1119
El HTMLTextWriter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1119
Detección del navegador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1120
Propiedades del navegador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1122
Anulación de la detección del tipo de navegador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1124
Representación adaptativa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1125
Estado de control y eventos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1127
Ver estado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1127
Estado de control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1129
Datos de devolución y eventos de cambio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1131
Activar una devolución de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1133
Ampliación de los controles web existentes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1135
Controles compuestos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1135
Finalizar controles derivados de la barra lateral. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1138
xxiv ■CONTENIDO
Controles de plantilla. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1141
Creando un control de plantilla. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1141
Uso de plantillas personalizadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1143
Estilos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1148
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1150
■CAPÍTULO 28 Soporte en tiempo de diseño. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1151
Los jugadores clave. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1151
Atributos en tiempo de diseño. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1152
La ventana Propiedades. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1153
Atributos y Herencia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1157
El icono de la caja de herramientas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1158
Recursos web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1159
Creando un recurso. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1159
Recuperar un recurso. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1160
Sustitución de texto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1161
Serialización de código. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1162
Convertidores de tipos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1162
Atributos de serialización. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1170
Editores de tipos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1172
Diseñadores de controles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1174
HTML en tiempo de diseño. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1175
Etiquetas inteligentes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1177
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1182
■CAPÍTULO 29 Gráficos dinámicos y GDI+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1183
El control ImageMap. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1183
Creando puntos de acceso. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1184
Manejo de clics en puntos de acceso. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1185
Un punto de acceso personalizado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1186
Dibujar con GDI+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1188
Dibujo sencillo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1189
Formato y calidad de imagen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1191
La clase de gráficos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1192
Usando una ruta de gráficos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1194
Bolígrafos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1195
Pinceles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1198
Incrustar gráficos dinámicos en una página web. . . . . . . . . . . . . . . . . . . . . . . . . . 1199
Usando el formato PNG. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1200
Pasar información a imágenes dinámicas. . . . . . . . . . . . . . . . . . . . . . . . . . 1201
Controles personalizados que utilizan GDI+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1204
Gráficos con GDI+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1208
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1213
■ CONTENIDO xxv
■CAPÍTULO 30 Portales con páginas de elementos web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1215
Páginas típicas del portal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1216
Páginas de elementos web básicos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1217
Creando el diseño de la página. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1218
Controles WebPartManager y WebPartZone. . . . . . . . . . . . . . . . . . . . . . 1219
Agregar elementos web a la página. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1221
Personalizando la página. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1224
Creación de elementos web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1226
Tareas simples de elementos web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1227
Desarrollo de elementos web avanzados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1235
Editores de elementos web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1244
Conexión de elementos web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1250
Verbos personalizados y elementos web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1258
Controles de usuario y elementos web avanzados. . . . . . . . . . . . . . . . . . . . . . . . . . . 1259
Carga de elementos web dinámicamente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1262
Autorización de elementos web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1268
Tareas Finales de Personalización. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1268
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1269
PARTE 6 ■ ■ ■ Programación del lado del cliente
■CAPÍTULO 31 Técnicas de JavaScript y Ajax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1273
Conceptos básicos de JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1273
El modelo de objetos de documento HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1274
Eventos del lado del cliente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1275
Bloques de guión. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1277
Manipulación de elementos HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1279
Depuración de JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1280
Ejemplos básicos de JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1282
Creando un procesador de páginas JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1282
Uso de JavaScript para descargar imágenes de forma asincrónica. . . . . . . . . . . . . . 1285
Representación de bloques de script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1290
Ataques de inyección de scripts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1291
Solicitar Validación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1291
Deshabilitar la validación de solicitudes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1292
Controles personalizados con JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1294
Ventanas emergentes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1294
Botones de desplazamiento. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1298
Marcos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1301
Navegación por cuadros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1302
Marcos en línea. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1303
xxvi ■CONTENIDO
Entendiendo al Ajax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1304
El objeto XMLHttpRequest. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1305
Un ejemplo de Ajax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1307
Usando Ajax con devoluciones de llamadas de clientes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1311
Creando una devolución de llamada de cliente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1311
Devoluciones de llamadas de clientes "bajo el capó". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1317
Devoluciones de llamadas de clientes en controles personalizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1318
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1322
■CAPÍTULO 32 ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1323
Presentamos ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1323
ASP.NET AJAX en el cliente: las bibliotecas de scripts. . . . . . . . . . . . . . . . . . 1325
ASP.NET AJAX en el servidor: ScriptManager. . . . . . . . . . . . . . . . . . 1325
Devoluciones de llamada del servidor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1326
Servicios Web en ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1327
El proxy de servicio web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1334
Colocar un método web en una página. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1336
Servicios de aplicaciones ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1337
Controles del servidor ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1344
Renderizado parcial con UpdatePanel. . . . . . . . . . . . . . . . . . . . . . . . . . . 1344
Actualizaciones programadas con el temporizador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1351
Actualizaciones que requieren mucho tiempo con UpdateProgress. . . . . . . . . . . . . . . . . . . . 1352
Profundizando en las bibliotecas cliente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1355
Comprender el modelo de cliente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1356
Programación orientada a objetos en JavaScript. . . . . . . . . . . . . . . . . . . . . . . 1357
El marco de la página web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1364
Extensores de control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1369
Instalación del kit de herramientas de control ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . 1370
El extensor de autocompletar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1371
El kit de herramientas de control ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1374
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1378
■CAPÍTULO 33 Luz plateada. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1379
Entendiendo Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1379
Silverlight frente a Flash. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1380
Adopción de Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1382
Silverlight y WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1382
Instalación de Silverlight y las extensiones de Visual Studio. . . . . . . . . . . . . . . 1383
Creando un proyecto Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1384
La página de entrada HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1385
El script de inicialización de Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1386
La página XAML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1388
El código subyacente XAML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1391
■CONTENIDO xxvii
Propiedades y Eventos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1392
Compilación de Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1393
Conceptos básicos de Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1394
Clases de .NET Framework en Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . 1395
El lienzo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1396
Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1401
Interactuando con HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1402
Almacenamiento Aislado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1406
Silverlight y ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1408
Futuros ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1408
Comunicación entre Silverlight y ASP.NET. . . . . . . . . . . . . . . . . . 1412
Dibujo en 2D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1412
Formas simples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1413
Caminos y Geometrías. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1417
Pinceles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1425
Transparencia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1427
Animación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1429
Conceptos básicos de animación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1430
Definición de una animación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1430
Un ejemplo de animación interactiva. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1434
Se transforma. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1437
Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1440
■ÍNDICE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1441
Expandir