■CAPÍTULO 10 Controles de dados avançados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
O GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
Definindo Colunas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
Formatando o GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
Formatando Campos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
Estilos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Valores específicos de formatação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
Seleção de linha do GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Usando seleção para criar um formulário de detalhes mestre . . . . . . . . . . . . . . . . . . . . 398
O evento SelectedIndexChanged. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Usando um campo de dados como botão de seleção. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Classificando o GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Classificando com o SqlDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Classificando com ObjectDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Classificação e seleção. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Classificação avançada. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
xiv ■ CONTEÚDO
Paginando o GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
Paginação Automática. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
Paginação personalizada com ObjectDataSource. . . . . . . . . . . . . . . . . . . . . . 408
Personalizando a barra do Pager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Modelos de GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
Usando vários modelos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
Editando modelos no Visual Studio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
Vinculação a um método. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
Manipulação de eventos em um modelo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
Editando com um modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
O ListView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Agrupamento. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
Paginação. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428
O DetailsView e o FormView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
O DetailsView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
O FormView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
Grades Avançadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
Resumos no GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
Uma visão pai/filho em uma única tabela. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
Editando um campo usando uma tabela de pesquisa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
Servindo imagens de um banco de dados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
Detectando conflitos de simultaneidade. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
■CAPÍTULO 11 Cache e páginas assíncronas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Compreendendo o cache do ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Cache de saída. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
Cache de saída declarativa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
Cache e a string de consulta. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Armazenamento em cache com parâmetros específicos de string de consulta. . . . . . . . . . . . . . . . . . . . . 454
Controle de cache personalizado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Cache com a classe HttpCachePolicy. . . . . . . . . . . . . . . . . . . . . . . . . . . 456
Substituição Pós-Cache e Cache de Fragmentos . . . . . . . . . . . . . . . . . . . . 457
Perfis de cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459
Configuração de cache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
Cache de dados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
Adicionando Itens ao Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
Um teste de cache simples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
Prioridades de cache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
Cache com os controles de fonte de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
Dependências de cache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Dependências de itens de arquivo e cache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Dependências agregadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
■CONTEÚDO xv
O retorno de chamada do item removido. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Noções básicas sobre notificações de cache SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . 473
Notificações de cache no SQL Server 2000 e SQL Server 7 . . . . . . . . . . . . 474
Notificações de cache no SQL Server 2005 e SQL Server 2008. . . . . . . . 479
Dependências de cache personalizadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
Uma dependência básica de cache personalizado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
Uma dependência de cache personalizada usando filas de mensagens. . . . . . . . . . . . . . . 483
Páginas assíncronas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
Criando uma página assíncrona. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
Consultando dados em uma página assíncrona. . . . . . . . . . . . . . . . . . . . . . . . . . . 488
Tratamento de erros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
Usando cache com tarefas assíncronas. . . . . . . . . . . . . . . . . . . . . . . . . . 492
Várias tarefas assíncronas e tempos limites. . . . . . . . . . . . . . . . . . . . . . . . 495
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
■CAPÍTULO 12 Arquivos e fluxos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
Trabalhando com o sistema de arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
As classes de diretório e arquivo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
As classes DirectoryInfo e FileInfo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
A classe DriveInfo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503
Trabalhando com Atributos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
Filtrar arquivos com curingas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
Recuperando informações de versão do arquivo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
A classe Caminho. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507
Um navegador de arquivos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
Lendo e gravando arquivos com Streams. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
Arquivos de texto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
Arquivos binários. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Fazendo upload de arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
Tornando os arquivos seguros para vários usuários. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
Compressão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
Serialização. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
■CAPÍTULO 13 LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
Noções básicas de LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
Execução Diferida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
Como funciona o LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
Expressões LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
Expressões LINQ “Under the Hood” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
LINQ para DataSet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544
Conjuntos de dados digitados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Valores Nulos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
xvi ■CONTEÚDO
LINQ para SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
Classes de entidades de dados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
O DataContext. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
Consultas LINQ to SQL “sob o capô” . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
LINQ to SQL e componentes de banco de dados. . . . . . . . . . . . . . . . . . . . . . . . . . . 554
Selecionando um único registro ou valor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
Gerando classes de dados automaticamente. . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
Relacionamentos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563
Gerando Métodos para Procedimentos Armazenados. . . . . . . . . . . . . . . . . . . . . . . . . 571
Confirmando Mudanças . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
O LinqDataSource. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
Exibindo dados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
Obtendo dados relacionados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
Editando dados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Validação. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586
■CAPÍTULO 14 XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
Quando usar XML faz sentido? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
Uma introdução ao XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
As vantagens do XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589
XML bem formado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
Espaços de nomes XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
Esquemas XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592
Processamento XML baseado em fluxo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594
Escrevendo arquivos XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594
Lendo arquivos XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Processamento XML na memória . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600
OXmlDocument. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
O XPathNavigator. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
O XDocumento. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Pesquisando conteúdo XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
Pesquisando com XmlDocument. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
Pesquisando XmlDocument com XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
Pesquisando XDocument com LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617
Validando Conteúdo XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
Um esquema básico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
Validando com XmlDocument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
Validando com XDocument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
Transformando conteúdo XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
Uma folha de estilo básica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
Usando XslCompiledTransform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623
■CONTEÚDO xvii
Usando o controle XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
Transformando XML com LINQ to XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
Vinculação de dados XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
Vinculação não hierárquica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
Usando XPath. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
Grades aninhadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632
Vinculação hierárquica com TreeView . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
Usando XSLT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
Vinculação ao conteúdo XML de outras fontes. . . . . . . . . . . . . . . . . . . . . . . . 637
Atualizando XML através do XmlDataSource . . . . . . . . . . . . . . . . . . . . . . . . 637
XML e o conjunto de dados ADO.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638
Convertendo o DataSet em XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639
Acessando um DataSet como XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642
PARTE 3 ■ ■ ■ Construindo sites ASP.NET
■CAPÍTULO 15 Controles do usuário . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
Noções básicas de controle de usuário. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
Criando um controle de usuário simples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 646
Convertendo uma página em um controle de usuário. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
Adicionando código a um controle de usuário. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648
Tratamento de Eventos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648
Adicionando Propriedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649
Usando objetos personalizados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 651
Adicionando Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 654
Expondo o Controle Interno da Web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
Carregando controles de usuário dinamicamente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
Estruturas de portais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658
Cache de página parcial. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
VariarByControl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662
Compartilhando controles em cache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
■CAPÍTULO 16 Temas e páginas mestras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
Folhas de estilo em cascata. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
Criando uma folha de estilo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
Aplicando regras de folha de estilo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668
xviii ■CONTEÚDO
Temas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670
Pastas e skins de temas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671
Aplicando um tema simples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672
Lidando com Conflitos de Tema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
Criando múltiplas skins para o mesmo controle. . . . . . . . . . . . . . . . . . . . . . . 674
Skins com modelos e imagens. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
Usando CSS em um tema. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677
Aplicando Temas Através de um Arquivo de Configuração . . . . . . . . . . . . . . . . . . . . . 677
Aplicando Temas Dinamicamente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678
Padronizando o layout do site. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
Noções básicas da página mestra. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
Uma página mestra simples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681
Uma página de conteúdo simples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683
Conteúdo padrão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684
Páginas mestras com tabelas e layout CSS. . . . . . . . . . . . . . . . . . . . . . . . . 685
Páginas mestras e caminhos relativos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
Aplicando páginas mestras por meio de um arquivo de configuração. . . . . . . . . . . . . . . . . 688
Páginas mestras avançadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Interagindo com a classe Master Page. . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Configurando dinamicamente uma página mestra. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690
Aninhamento de páginas mestras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693
■CAPÍTULO 17 Navegação no site . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
Páginas com múltiplas visualizações. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
O controle MultiView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696
O controle do assistente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 700
Mapas do Site. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707
Definindo um Mapa do Site . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
Vinculação a um mapa do site. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710
Pão ralado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
Mostrando uma parte do mapa do site. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713
Os objetos do mapa do site. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716
Adicionando informações personalizadas do mapa do site. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
Criando um SiteMapProvider personalizado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
Mapeamento de URL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725
Corte de segurança . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 726
O controle TreeView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728
O TreeNode. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 729
Preenchendo nós sob demanda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 731
Estilos de TreeView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
■CONTEÚDO xix
O controle do menu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 737
Estilos de menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 740
Modelos de menu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 743
■CAPÍTULO 18 Implantação do site . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
Serviços de Informações da Internet (IIS). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
Sites e diretórios virtuais do IIS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746
Console de gerenciamento do IIS e configuração do IIS. . . . . . . . . . . . . . . . . . . . . 747
Mapeando sites, diretórios virtuais e arquivos para URLs . . . . . . . . . . . . . 748
Mergulhando na Arquitetura do IIS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750
Instalando o IIS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765
Gerenciando sites. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 771
Gerenciando diretórios virtuais e sites com IIS 5.xe IIS 6.0. . . . . . . 772
Gerenciando pools de aplicativos no IIS 6.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778
Gerenciando diretórios virtuais e sites com IIS 7.0. . . . . . . . . . . . . . . 784
Gerenciando pools de aplicativos no IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 796
Implantando seus aplicativos ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798
Verificando a instalação do ASP.NET no IIS 5.xe IIS 6.0. . . . . . . . . . . . . . 800
Execução lado a lado do ASP.NET no IIS 5.xe IIS 6.0. . . . . . . . . . . . . . . 801
Execução lado a lado do ASP.NET no IIS 7.0 . . . . . . . . . . . . . . . . . . . . . . . . 803
Definindo configurações de tempo de execução HTTP ao implantar no IIS 5.x. . . . . . . . 803
Modelos de compilação em ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 804
Implantando com Visual Studio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 808
Projetos de implantação da Web do Visual Studio 2005 . . . . . . . . . . . . . . . . . . . . . . 809
O VirtualPathProvider no ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815
Monitoramento de integridade em ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 819
Compreendendo a estrutura básica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
Eventos e Provedores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 823
PARTE 4 ■ ■ ■ Segurança
■CAPÍTULO 19 O modelo de segurança do ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 827
O que significa criar software seguro. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 827
Compreendendo ameaças potenciais. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828
Diretrizes de codificação segura. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828
Compreendendo os porteiros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 829
Compreendendo os níveis de segurança. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 830
Autenticação. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 831
Autorização. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 832
xx ■CONTEÚDO
Confidencialidade e Integridade. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 833
Juntando tudo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 833
Segurança dos Serviços de Informações da Internet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835
Autenticação e autorização no IIS 5.xe IIS 6.0. . . . . . . . . . . . . . . 835
Configuração de segurança no IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 838
Compreendendo a camada de soquetes seguros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843
Arquitetura de segurança ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 852
Autenticação. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853
Autorização. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855
O Contexto de Segurança. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855
APIs de associação e funções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 858
■CAPÍTULO 20 Autenticação de formulários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 859
Apresentando a autenticação de formulários. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 859
Por que usar autenticação de formulários? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 860
Por que você não usaria autenticação de formulários? . . . . . . . . . . . . . . . . . . . . 862
Por que não implementar você mesmo a autenticação de cookies? . . . . . . . . . . . . . . . . 863
As classes de autenticação de formulários. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 864
Implementando autenticação de formulários. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865
Configurando a autenticação de formulários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865
Negando acesso a usuários anônimos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869
Criando uma página de login personalizada. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869
Armazenamento de credenciais personalizadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876
Cookies persistentes na autenticação de formulários. . . . . . . . . . . . . . . . . . . . . . . . 877
IIS 7.0 e autenticação de formulários. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 878
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 884
■CAPÍTULO 21 Membros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885
Apresentando a API de associação do ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885
Usando a API de associação. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 888
Configurando a autenticação de formulários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 889
Criando o armazenamento de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 890
Configurando a cadeia de conexão e o provedor de associação. . . . . . . . . . . . . 896
Criando e autenticando usuários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 900
Usando os controles de segurança . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 902
O controle de login. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 904
O controle LoginStatus. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 914
O controle LoginView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915
O controle de recuperação de senha. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 916
O controle ChangePassword. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 921
O controle CreateUserWizard. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 922
■CONTEÚDO xxi
Configurando a associação no IIS 7.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 926
Configurando Provedores e Usuários. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 926
Usando a API Membership com outros aplicativos. . . . . . . . . . . . . . . . . . 928
Usando a classe de membros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
Recuperando usuários da loja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
Atualizando usuários na loja. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933
Criando e Excluindo Usuários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933
Validando Usuários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 934
Usando associação em Windows Forms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 935
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 937
■CAPÍTULO 22 Autenticação do Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 939
Apresentando a autenticação do Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 939
Por que usar a autenticação do Windows? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 940
Por que você não usaria a autenticação do Windows? . . . . . . . . . . . . . . . . . . 941
Mecanismos para autenticação do Windows. . . . . . . . . . . . . . . . . . . . . . . . . . 942
Implementando a autenticação do Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 948
Configurando IIS 5.x ou IIS 6.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 948
Configurando o IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 950
Configurando ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 952
Negando acesso a usuários anônimos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 955
Acessando informações do usuário do Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 957
Personificação. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 962
Representação no Windows 2000. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 963
Representação no Windows XP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 964
Representação e Delegação no Windows Server 2003. . . . . . . . . . . . . 964
Representação no Windows Vista. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 967
Representação e Delegação no Windows Server 2008. . . . . . . . . . . . . 968
Representação configurada. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 968
Representação programática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 970
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 973
■CAPÍTULO 23 Autorização e funções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975
Autorização de URL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975
Regras de autorização. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 976
Autorização de arquivo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 981
Verificações de autorização no código. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 982
Usando o método IsInRole(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 982
Usando a classe PrincipalPermission. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 983
Usando a API de funções para autorização baseada em funções . . . . . . . . . . . . . . . . . . . . . . . . 985
Usando o controle LoginView com funções. . . . . . . . . . . . . . . . . . . . . . . . . . . . 991
Acessando funções programaticamente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 992
Usando a API de funções com autenticação do Windows. . . . . . . . . . . . . . . . . . . 994
xxii ■CONTEÚDO
Protegendo recursos não ASP.NET no IIS 5 e 6 . . . . . . . . . . . . . . . . . . . . . . . . 997
Adicionando um mapeamento de tipo de arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997
Escrevendo um manipulador HTTP personalizado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 998
Autorização e funções no IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1000
Autorização com funções ASP.NET no IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . 1002
Gerenciando funções ASP.NET com IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1005
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1006
■CAPÍTULO 24 Perfis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009
Noções básicas sobre perfis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009
Desempenho do perfil. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009
Como os perfis armazenam dados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1010
Perfis e Autenticação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011
Perfis versus componentes de dados personalizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011
Usando o SqlProfileProvider. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1012
Criando as tabelas de perfis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1012
Configurando o Provedor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1015
Definindo Propriedades do Perfil. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1016
Usando propriedades de perfil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1017
Serialização de perfil. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1018
Grupos de perfis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1020
Perfis e tipos de dados personalizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1021
A API de perfis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1024
Perfis anônimos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1026
Provedores de perfis personalizados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1029
As classes de provedores de perfil personalizado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1029
Projetando o FactoredProfileProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1031
Codificando o FactoredProfileProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1033
Testando o FactoredProfileProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1037
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1040
■CAPÍTULO 25 Criptografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1041
Criptografando dados: a confidencialidade é importante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1041
O namespace de criptografia .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1042
Compreendendo as classes de criptografia .NET. . . . . . . . . . . . . . . . . . . . . . . . . . 1046
Algoritmos de criptografia simétrica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1047
Criptografia Assimétrica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1048
As classes abstratas de criptografia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1049
A interface ICryptoTransform. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1050
A classe CryptoStream. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1050
■ CONTEÚDO XXIII
Criptografando dados confidenciais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1051
Gerenciando segredos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1052
Usando algoritmos simétricos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1053
Usando algoritmos assimétricos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1058
Criptografando dados confidenciais em um banco de dados. . . . . . . . . . . . . . . . . . . . . . . . . . 1061
Criptografando a string de consulta. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1065
Quebrando a string de consulta. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1066
Criando uma página de teste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1069
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1070
■CAPÍTULO 26 Provedores de associação personalizados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1071
Arquitetura de provedores personalizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1071
Etapas básicas para criação de provedores personalizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1073
Design geral do provedor personalizado. . . . . . . . . . . . . . . . . . . . . . . . . . . 1073
Projetando e implementando a loja personalizada. . . . . . . . . . . . . . . . . . . . 1074
Implementando as Classes de Provedores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1082
Usando as classes de provedor personalizadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1102
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1106
PARTE 5 ■ ■ ■ Interface de usuário avançada
■CAPÍTULO 27 Controles de servidor personalizados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1109
Noções básicas de controle de servidor personalizado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1109
Criando um controle personalizado básico . . . . . . . . . . . . . . . . . . . . . . . . . . . 1110
Usando um controle personalizado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1112
Controles personalizados na caixa de ferramentas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1113
Criando um controle da Web que oferece suporte a propriedades de estilo. . . . . . . . . . . . . . 1114
O processo de renderização. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1118
Lidando com diferentes navegadores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1119
O HtmlTextWriter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1119
Detecção de navegador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1120
Propriedades do navegador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1122
Substituindo a detecção do tipo de navegador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1124
Renderização Adaptativa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1125
Estado de controle e eventos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1127
Ver Estado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1127
Estado de controle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1129
Dados de postback e eventos de alteração. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1131
Acionando um postback. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1133
Estendendo controles da Web existentes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1135
Controles Compostos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1135
Fim dos controles derivados da barra lateral. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1138
xxiv ■ CONTEÚDO
Controles de modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1141
Criando um controle de modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1141
Usando modelos personalizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1143
Estilos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1148
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1150
■CAPÍTULO 28 Suporte em tempo de design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1151
Os principais jogadores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1151
Atributos em tempo de design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1152
A janela Propriedades. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1153
Atributos e herança. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1157
O ícone da caixa de ferramentas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1158
Recursos da Web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1159
Criando um recurso. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1159
Recuperando um recurso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1160
Substituição de texto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1161
Serialização de código. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1162
Conversores de tipo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1162
Atributos de serialização. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1170
Editores de tipo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1172
Projetistas de Controle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1174
HTML em tempo de design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1175
Etiquetas inteligentes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1177
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1182
■CAPÍTULO 29 Gráficos Dinâmicos e GDI+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1183
O controle ImageMap. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1183
Criando pontos de acesso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1184
Tratamento de cliques em pontos de acesso. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1185
Um ponto de acesso personalizado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1186
Desenhando com GDI+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1188
Desenho Simples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1189
Formato e qualidade da imagem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1191
A aula de gráficos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1192
Usando um GraphicsPath. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1194
Canetas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1195
Pincéis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1198
Incorporando gráficos dinâmicos em uma página da Web. . . . . . . . . . . . . . . . . . . . . . . . . . 1199
Usando o formato PNG. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1200
Passando informações para imagens dinâmicas. . . . . . . . . . . . . . . . . . . . . . . . . . 1201
Controles personalizados que usam GDI+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1204
Gráficos com GDI+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1208
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1213
■CONTEÚDO xxv
■CAPÍTULO 30 Portais com páginas de Web Parts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1215
Páginas típicas de portal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1216
Páginas básicas de Web Parts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1217
Criando o design da página . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1218
Controles WebPartManager e WebPartZone . . . . . . . . . . . . . . . . . . . . . . 1219
Adicionando Web Parts à página. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1221
Personalizando a página . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1224
Criando Web Parts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1226
Tarefas simples de Web Parts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1227
Desenvolvendo Web Parts Avançadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1235
Editores de Web Parts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1244
Conectando Web Parts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1250
Verbos personalizados e Web Parts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1258
Controles de usuário e Web Parts avançadas. . . . . . . . . . . . . . . . . . . . . . . . . . . 1259
Fazendo upload de Web Parts dinamicamente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1262
Autorizando Web Parts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1268
Tarefas Finais para Personalização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1268
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1269
PARTE 6 ■ ■ ■ Programação do lado do cliente
■CAPÍTULO 31 Técnicas JavaScript e Ajax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1273
Fundamentos de JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1273
O modelo de objeto de documento HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1274
Eventos do lado do cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1275
Blocos de script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1277
Manipulando Elementos HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1279
Depurando JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1280
Exemplos básicos de JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1282
Criando um processador de páginas JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1282
Usando JavaScript para baixar imagens de forma assíncrona. . . . . . . . . . . . . . 1285
Renderizando Blocos de Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1290
Ataques de injeção de script. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1291
Validação de Solicitação. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1291
Desativando validação de solicitação. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1292
Controles personalizados com JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1294
Janelas pop-up. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1294
Botões de rolagem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1298
Quadros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1301
Navegação de quadros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1302
Quadros embutidos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1303
xxvi ■ CONTEÚDO
Compreendendo o Ajax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1304
O objeto XMLHttpRequest. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1305
Um exemplo de Ajax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1307
Usando Ajax com retornos de chamada de cliente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1311
Criando um retorno de chamada do cliente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1311
Retornos de chamada do cliente “nos bastidores”. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1317
Retornos de chamada de cliente em controles personalizados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1318
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1322
■CAPÍTULO 32 ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1323
Apresentando o ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1323
ASP.NET AJAX no cliente: as bibliotecas de scripts. . . . . . . . . . . . . . . . . . 1325
ASP.NET AJAX no servidor: o ScriptManager . . . . . . . . . . . . . . . . . . 1325
Retornos de chamada do servidor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1326
Serviços Web em ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1327
O proxy de serviço da Web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1334
Colocando um método Web em uma página. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1336
Serviços de aplicativos ASP.NET AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1337
Controles de servidor ASP.NET AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1344
Renderização parcial com o UpdatePanel. . . . . . . . . . . . . . . . . . . . . . . . . . . 1344
Atualizações cronometradas com o temporizador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1351
Atualizações demoradas com UpdateProgress. . . . . . . . . . . . . . . . . . . . 1352
Aprofunde-se nas bibliotecas cliente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1355
Compreendendo o modelo do cliente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1356
Programação Orientada a Objetos em JavaScript. . . . . . . . . . . . . . . . . . . . . . . 1357
A estrutura da página da Web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1364
Extensores de controle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1369
Instalando o kit de ferramentas de controle ASP.NET AJAX . . . . . . . . . . . . . . . . . . . . . . . 1370
O AutoCompleteExtender. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1371
O kit de ferramentas de controle ASP.NET AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1374
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1378
■CAPÍTULO 33 Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1379
Compreendendo o Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1379
Silverlight versus Flash. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1380
Adoção do Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1382
Silverlight e WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1382
Instalando o Silverlight e as extensões do Visual Studio . . . . . . . . . . . . . . . 1383
Criando um projeto Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1384
A página de entrada HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1385
O script de inicialização do Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1386
A página XAML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1388
O código XAML por trás. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1391
■CONTEÚDO xxvii
Propriedades e Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1392
Compilação Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1393
Fundamentos do Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1394
Classes do .NET Framework no Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . 1395
A tela. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1396
Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1401
Interagindo com HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1402
Armazenamento isolado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1406
Silverlight e ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1408
Futuros ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1408
Comunicação entre Silverlight e ASP.NET. . . . . . . . . . . . . . . . . . 1412
Desenhando em 2D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1412
Formas Simples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1413
Caminhos e Geometrias. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1417
Pincéis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1425
Transparência . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1427
Animação. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1429
Noções básicas de animação. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1430
Definindo uma Animação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1430
Um exemplo de animação interativa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1434
Transforma. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1437
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1440
■ÍNDICE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1441
Expandir