■ГЛАВА 10. Богатые элементы управления данными. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
Гридвиев. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
Определение столбцов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
Форматирование GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
Форматирование полей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
Стили. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Значения, специфичные для форматирования. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
Выбор строки GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Использование выбора для создания формы Master-Details. . . . . . . . . . . . . . . . . . . . 398
Событие SelectedIndexChanged. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Использование поля данных в качестве кнопки выбора. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Сортировка GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Сортировка с помощью SqlDataSource. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Сортировка с помощью ObjectDataSource. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Сортировка и отбор. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Расширенная сортировка. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
xiv ■СОДЕРЖАНИЕ
Пейджинг GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
Автоматический пейджинг. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
Пользовательская нумерация страниц с помощью ObjectDataSource. . . . . . . . . . . . . . . . . . . . . . 408
Настройка панели пейджера. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Шаблоны GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
Использование нескольких шаблонов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
Редактирование шаблонов в Visual Studio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
Привязка к методу. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
Обработка событий в шаблоне. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
Редактирование с помощью шаблона. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
СписокView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Группировка. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
Пейджинг. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428
DetailsView и FormView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
Подробное представление. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429
Формавиев. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
Расширенные сетки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
Сводки в GridView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
Родительское/дочернее представление в одной таблице. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
Редактирование поля с помощью таблицы поиска. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
Обслуживание изображений из базы данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
Обнаружение конфликтов параллелизма. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
■ГЛАВА 11 Кэширование и асинхронные страницы. . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Понимание кэширования ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Кэширование вывода. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
Декларативное кэширование вывода. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
Кэширование и строка запроса. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Кэширование с определенными параметрами строки запроса. . . . . . . . . . . . . . . . . . . . . 454
Пользовательский контроль кэширования. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Кэширование с помощью класса HttpCachePolicy. . . . . . . . . . . . . . . . . . . . . . . . . . . 456
Замена пост-кэша и кэширование фрагментов. . . . . . . . . . . . . . . . . . . . 457
Профили кэша. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459
Конфигурация кэша. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
Кэширование данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
Добавление элементов в кэш. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
Простой тест кэша. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
Приоритеты кэша. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
Кэширование с помощью элементов управления источниками данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
Зависимости кэша. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Зависимости файлов и элементов кэша. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Агрегатные зависимости. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
■СОДЕРЖАНИЕ xv
Обратный вызов удаления элемента. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Общие сведения об уведомлениях кэша SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . 473
Кэшировать уведомления в SQL Server 2000 и SQL Server 7. . . . . . . . . . . . 474
Кэшировать уведомления в SQL Server 2005 и SQL Server 2008. . . . . . . . 479
Пользовательские зависимости кэша. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
Базовая зависимость пользовательского кэша. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
Пользовательская зависимость кэша с использованием очередей сообщений. . . . . . . . . . . . . . . 483
Асинхронные страницы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
Создание асинхронной страницы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
Запрос данных на асинхронной странице. . . . . . . . . . . . . . . . . . . . . . . . . . . 488
Обработка ошибок. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
Использование кэширования с асинхронными задачами. . . . . . . . . . . . . . . . . . . . . . . . . . 492
Множественные асинхронные задачи и таймауты. . . . . . . . . . . . . . . . . . . . . . . . 495
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496
■ГЛАВА 12 Файлы и потоки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
Работа с файловой системой. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
Классы каталогов и файлов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
Классы DirectoryInfo и FileInfo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500
Класс DriveInfo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503
Работа с атрибутами. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
Фильтрация файлов с помощью подстановочных знаков. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
Получение информации о версии файла. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
Класс пути. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507
Файловый браузер. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
Чтение и запись файлов с помощью потоков. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
Текстовые файлы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
Бинарные файлы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Загрузка файлов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
Обеспечение безопасности файлов для нескольких пользователей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
Сжатие. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
Сериализация. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
■ГЛАВА 13 LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
Основы LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
Отложенное исполнение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
Как работает LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
LINQ-выражения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
Выражения LINQ «под капотом». . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
LINQ для набора данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544
Типизированные наборы данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Нулевые значения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
xvi ■СОДЕРЖАНИЕ
LINQ-SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
Классы сущностей данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
Контекст данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
Запросы LINQ to SQL «под капотом». . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
LINQ to SQL и компоненты базы данных. . . . . . . . . . . . . . . . . . . . . . . . . . . 554
Выбор одной записи или значения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
Автоматическое создание классов данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
Отношения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563
Генерация методов для хранимых процедур. . . . . . . . . . . . . . . . . . . . . . . . . 571
Фиксация изменений. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
Источник ЛинкДанных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
Отображение данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
Получение связанных данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
Редактирование данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Валидация. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586
■ГЛАВА 14 XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
Когда использование XML имеет смысл? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
Введение в XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
Преимущества XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589
Правильно сформированный XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
Пространства имен XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
XML-схемы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592
Потоковая обработка XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594
Написание XML-файлов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594
Чтение XML-файлов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Обработка XML в памяти. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600
XmlДокумент. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
XPathNavigator. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
XДокумент. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Поиск XML-контента. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
Поиск с помощью XmlDocument. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
Поиск XmlDocument с помощью XPath. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
Поиск XDocument с помощью LINQ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617
Проверка содержимого XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
Базовая схема. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
Проверка с помощью XmlDocument. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
Проверка с помощью XDocument. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
Преобразование XML-контента. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
Базовая таблица стилей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
Использование XslCompiledTransform. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623
■СОДЕРЖАНИЕ xvii
Использование элемента управления XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
Преобразование XML с помощью LINQ в XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
Привязка XML-данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
Неиерархическое связывание. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
Использование XPath. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
Вложенные сетки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632
Иерархическая привязка с помощью TreeView. . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
Использование XSLT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
Привязка к XML-контенту из других источников. . . . . . . . . . . . . . . . . . . . . . . . 637
Обновление XML через XmlDataSource. . . . . . . . . . . . . . . . . . . . . . . . 637
XML и набор данных ADO.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638
Преобразование набора данных в XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639
Доступ к набору данных как XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642
ЧАСТЬ 3 ■ ■ ■ Создание веб-сайтов ASP.NET
■ГЛАВА 15 Пользовательские элементы управления. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
Основы управления пользователями. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
Создание простого пользовательского элемента управления. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 646
Преобразование страницы в пользовательский элемент управления. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
Добавление кода в пользовательский элемент управления. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648
Обработка событий. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648
Добавление свойств. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649
Использование пользовательских объектов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 651
Добавление событий. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 654
Раскрытие внутреннего веб-контроля. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
Динамическая загрузка пользовательских элементов управления. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
Платформы портала. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658
Частичное кэширование страниц. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
ВариБиКонтроль. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662
Совместное использование кэшированных элементов управления. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
■ГЛАВА 16 Темы и мастер-страницы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
Каскадные таблицы стилей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
Создание таблицы стилей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
Применение правил таблицы стилей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668
xviii ■СОДЕРЖАНИЕ
Темы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670
Папки тем и скины. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671
Применение простой темы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672
Разрешение тематических конфликтов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
Создание нескольких скинов для одного и того же элемента управления. . . . . . . . . . . . . . . . . . . . . . . 674
Скины с шаблонами и изображениями. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
Использование CSS в теме. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677
Применение тем через файл конфигурации. . . . . . . . . . . . . . . . . . . . . 677
Динамическое применение тем. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678
Стандартизация макета веб-сайта. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
Основы мастер-страницы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
Простая мастер-страница. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681
Простая страница с контентом. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683
Контент по умолчанию. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684
Мастер-страницы с таблицами и макетом CSS. . . . . . . . . . . . . . . . . . . . . . . . . 685
Главные страницы и относительные пути. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
Применение главных страниц через файл конфигурации. . . . . . . . . . . . . . . . . 688
Расширенные мастер-страницы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Взаимодействие с классом мастер-страницы. . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Динамическая установка главной страницы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690
Вложение мастер-страниц. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693
■ГЛАВА 17 Навигация по веб-сайту. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
Страницы с несколькими представлениями. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
Элемент управления MultiView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696
Мастер управления. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 700
Карты сайта. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707
Определение карты сайта. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
Привязка к карте сайта. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710
Хлебные крошки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
Показ части карты сайта. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713
Объекты карты сайта. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716
Добавление пользовательской информации о карте сайта. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
Создание пользовательского SiteMapProvider. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
Сопоставление URL-адресов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725
Обрезка безопасности. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 726
Элемент управления TreeView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728
Древовидный узел. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 729
Заполнение узлов по требованию. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 731
Стили TreeView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
■СОДЕРЖАНИЕ XIX
Управление меню. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 737
Стили меню. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 740
Шаблоны меню. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 743
■ГЛАВА 18. Развертывание веб-сайта. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
Информационные службы Интернета (IIS). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
Веб-сайты IIS и виртуальные каталоги. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746
Консоль управления IIS и конфигурация IIS. . . . . . . . . . . . . . . . . . . . . 747
Сопоставление веб-сайтов, виртуальных каталогов и файлов с URL-адресами. . . . . . . . . . . . . 748
Погружение в архитектуру IIS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750
Установка IIS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765
Управление веб-сайтами. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 771
Управление виртуальными каталогами и веб-сайтами с помощью IIS 5.x и IIS 6.0. . . . . . . 772
Управление пулами приложений в IIS 6.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778
Управление виртуальными каталогами и веб-сайтами с помощью IIS 7.0. . . . . . . . . . . . . . . 784
Управление пулами приложений в IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 796
Развертывание приложений ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798
Проверка установки ASP.NET в IIS 5.x и IIS 6.0. . . . . . . . . . . . . . 800
Параллельное выполнение ASP.NET в IIS 5.x и IIS 6.0. . . . . . . . . . . . . . . 801
Параллельное выполнение ASP.NET в IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . . 803
Настройка параметров времени выполнения HTTP при развертывании в IIS 5.x. . . . . . . . 803
Модели компиляции в ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 804
Развертывание с помощью Visual Studio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 808
Проекты веб-развертывания Visual Studio 2005. . . . . . . . . . . . . . . . . . . . . . 809
VirtualPathProvider в ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815
Мониторинг работоспособности в ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 819
Понимание базовой структуры. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
События и провайдеры. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 823
ЧАСТЬ 4 ■ ■ ■ Безопасность
ГЛАВА 19. Модель безопасности ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 827
Что значит создавать безопасное программное обеспечение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 827
Понимание потенциальных угроз. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828
Рекомендации по безопасному кодированию. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828
Понимание гейткиперов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 829
Понимание уровней безопасности. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 830
Аутентификация. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 831
Авторизация. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 832
xx ■СОДЕРЖАНИЕ
Конфиденциальность и честность. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 833
Собрав все это вместе. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 833
Безопасность информационных служб Интернета. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835
Аутентификация и авторизация в IIS 5.x и IIS 6.0. . . . . . . . . . . . . . . 835
Конфигурация безопасности в IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 838
Понимание уровня защищенных сокетов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843
Архитектура безопасности ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 852
Аутентификация. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853
Авторизация. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855
Контекст безопасности. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855
API членства и ролей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 858
■ГЛАВА 20. Аутентификация с помощью форм. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 859
Представляем аутентификацию с помощью форм. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 859
Зачем использовать аутентификацию с помощью форм? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 860
Почему бы вам не использовать аутентификацию с помощью форм? . . . . . . . . . . . . . . . . . . . . 862
Почему бы не реализовать аутентификацию с помощью файлов cookie самостоятельно? . . . . . . . . . . . . . . . . 863
Классы проверки подлинности с помощью форм. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 864
Реализация аутентификации с помощью форм. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865
Настройка аутентификации с помощью форм. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865
Запрет доступа анонимным пользователям. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869
Создание пользовательской страницы входа. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869
Магазин пользовательских учетных данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876
Постоянные файлы cookie при проверке подлинности с помощью форм. . . . . . . . . . . . . . . . . . . . . . . . 877
IIS 7.0 и проверка подлинности с помощью форм. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 878
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 884
■ГЛАВА 21. Членство. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885
Представляем API членства ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885
Использование API членства. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 888
Настройка аутентификации с помощью форм. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 889
Создание хранилища данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 890
Настройка строки подключения и поставщика членства. . . . . . . . . . . . . 896
Создание и аутентификация пользователей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 900
Использование элементов управления безопасностью. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 902
Контроль входа в систему. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 904
Элемент управления LoginStatus. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 914
Элемент управления LoginView. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915
Элемент управления восстановлением пароля. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 916
Элемент управления ChangePassword. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 921
Элемент управления CreateUserWizard. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 922
■СОДЕРЖАНИЕ XXI
Настройка членства в IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 926
Настройка поставщиков и пользователей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 926
Использование API членства с другими приложениями. . . . . . . . . . . . . . . . . . 928
Использование класса членства. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
Получение пользователей из магазина. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
Обновление пользователей в магазине. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933
Создание и удаление пользователей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933
Проверка пользователей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 934
Использование членства в Windows Forms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 935
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 937
■ГЛАВА 22 Аутентификация Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 939
Знакомство с аутентификацией Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 939
Зачем использовать проверку подлинности Windows? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 940
Почему бы вам не использовать проверку подлинности Windows? . . . . . . . . . . . . . . . . . . 941
Механизмы аутентификации Windows. . . . . . . . . . . . . . . . . . . . . . . . . . 942
Реализация аутентификации Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 948
Настройка IIS 5.x или IIS 6.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 948
Настройка IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 950
Настройка ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 952
Запрет доступа анонимным пользователям. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 955
Доступ к информации пользователя Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 957
Олицетворение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 962
Олицетворение в Windows 2000. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 963
Олицетворение в Windows XP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 964
Олицетворение и делегирование в Windows Server 2003. . . . . . . . . . . . . 964
Олицетворение в Windows Vista. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 967
Олицетворение и делегирование в Windows Server 2008. . . . . . . . . . . . . 968
Настроенное олицетворение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 968
Программное олицетворение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 970
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 973
■ГЛАВА 23 Полномочия и роли. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975
URL-авторизация. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975
Правила авторизации. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 976
Авторизация файлов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 981
Проверка авторизации в коде. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 982
Использование метода IsInRole(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 982
Использование класса PrincipalPermission. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 983
Использование API ролей для авторизации на основе ролей. . . . . . . . . . . . . . . . . . . . . . . . 985
Использование элемента управления LoginView с ролями. . . . . . . . . . . . . . . . . . . . . . . . . . . . 991
Программный доступ к ролям. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 992
Использование API ролей с проверкой подлинности Windows. . . . . . . . . . . . . . . . . . . 994
xxii ■СОДЕРЖАНИЕ
Защита ресурсов, отличных от ASP.NET, в IIS 5 и 6. . . . . . . . . . . . . . . . . . . . . . . . 997
Добавление сопоставления типов файлов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 997
Написание собственного обработчика HTTP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 998
Авторизация и роли в IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1000
Авторизация с помощью ролей ASP.NET в IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . 1002
Управление ролями ASP.NET с помощью IIS 7.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1005
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1006
■ГЛАВА 24 Профили. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009
Понимание профилей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009
Производительность профиля. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009
Как профили хранят данные. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1010
Профили и аутентификация. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011
Профили и пользовательские компоненты данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011
Использование SqlProfileProvider. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1012
Создание таблиц профилей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1012
Настройка провайдера. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1015
Определение свойств профиля. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1016
Использование свойств профиля. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1017
Сериализация профиля. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1018
Профильные группы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1020
Профили и пользовательские типы данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1021
API профилей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1024
Анонимные профили. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1026
Поставщики пользовательских профилей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1029
Классы поставщиков пользовательских профилей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1029
Проектирование FactoredProfileProvider. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1031
Кодирование FactoredProfileProvider. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1033
Тестирование FactoredProfileProvider. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1037
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1040
■ГЛАВА 25 Криптография. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1041
Шифрование данных: конфиденциальность имеет значение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1041
Пространство имен криптографии .NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1042
Понимание классов криптографии .NET. . . . . . . . . . . . . . . . . . . . . . . . . . 1046
Алгоритмы симметричного шифрования. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1047
Асимметричное шифрование. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1048
Абстрактные классы шифрования. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1049
Интерфейс ICryptoTransform. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1050
Класс CryptoStream. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1050
■СОДЕРЖАНИЕ xxiii
Шифрование конфиденциальных данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1051
Управление секретами. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1052
Использование симметричных алгоритмов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1053
Использование асимметричных алгоритмов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1058
Шифрование конфиденциальных данных в базе данных. . . . . . . . . . . . . . . . . . . . . . . . . . 1061
Шифрование строки запроса. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1065
Перенос строки запроса. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1066
Создание тестовой страницы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1069
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1070
■ГЛАВА 26 Пользовательские поставщики членства. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1071
Архитектура пользовательских поставщиков. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1071
Основные шаги по созданию пользовательских поставщиков. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1073
Общий дизайн индивидуального поставщика. . . . . . . . . . . . . . . . . . . . . . . . . . . 1073
Проектирование и реализация собственного магазина. . . . . . . . . . . . . . . . . . . . 1074
Реализация классов провайдеров. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1082
Использование пользовательских классов поставщиков. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1102
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1106
ЧАСТЬ 5 ■ ■ ■ Расширенный пользовательский интерфейс
■ГЛАВА 27 Пользовательские элементы управления сервером. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1109
Основы пользовательского управления сервером. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1109
Создание простого пользовательского элемента управления. . . . . . . . . . . . . . . . . . . . . . . . . . . 1110
Использование пользовательского элемента управления. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1112
Пользовательские элементы управления на панели инструментов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1113
Создание веб-элемента управления, поддерживающего свойства стиля. . . . . . . . . . . . . . 1114
Процесс рендеринга. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1118
Работа с разными браузерами. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1119
HtmlTextWriter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1119
Обнаружение браузера. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1120
Свойства браузера. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1122
Переопределение определения типа браузера. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1124
Адаптивный рендеринг. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1125
Состояние и события управления. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1127
Посмотреть состояние. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1127
Контрольное состояние. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1129
Данные обратной передачи и события изменения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1131
Запуск постбека. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1133
Расширение существующих веб-элементов управления. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1135
Композитные элементы управления. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1135
Завершить производные элементы управления боковой панели. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1138
xxiv ■СОДЕРЖАНИЕ
Элементы управления шаблоном. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1141
Создание элемента управления шаблоном. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1141
Использование индивидуальных шаблонов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1143
Стили. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1148
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1150
■ГЛАВА 28 Поддержка во время разработки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1151
Ключевые игроки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1151
Атрибуты времени разработки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1152
Окно свойств. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1153
Атрибуты и наследование. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1157
Значок панели инструментов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1158
Веб-ресурсы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1159
Создание ресурса. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1159
Получение ресурса. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1160
Замена текста. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1161
Сериализация кода. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1162
Преобразователи типов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1162
Атрибуты сериализации. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1170
Типовые редакторы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1172
Конструкторы управления. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1174
HTML времени разработки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1175
Смарт-теги. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1177
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1182
ГЛАВА 29 Динамическая графика и GDI+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1183
Элемент управления ImageMap. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1183
Создание горячих точек. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1184
Обработка кликов по горячим точкам. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1185
Пользовательская точка доступа. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1186
Рисование с помощью GDI+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1188
Простой рисунок. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1189
Формат и качество изображения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1191
Класс графики. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1192
Использование GraphicsPath. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1194
Ручки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1195
Кисти. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1198
Встраивание динамической графики в веб-страницу. . . . . . . . . . . . . . . . . . . . . . . . . . 1199
Использование формата PNG. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1200
Передача информации в динамические изображения. . . . . . . . . . . . . . . . . . . . . . . . . . 1201
Пользовательские элементы управления, использующие GDI+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1204
Диаграммы с помощью GDI+. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1208
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1213
■СОДЕРЖАНИЕ xxv
■ГЛАВА 30 Порталы со страницами веб-частей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1215
Типичные страницы портала. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1216
Основные страницы веб-частей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1217
Создание дизайна страницы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1218
Элементы управления WebPartManager и WebPartZone. . . . . . . . . . . . . . . . . . . . . . 1219
Добавление веб-частей на страницу. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1221
Настройка страницы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1224
Создание веб-частей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1226
Простые задачи веб-части. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1227
Разработка расширенных веб-частей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1235
Редакторы веб-частей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1244
Соединение веб-частей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1250
Пользовательские команды и веб-части. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1258
Пользовательские элементы управления и расширенные веб-части. . . . . . . . . . . . . . . . . . . . . . . . . . . 1259
Динамическая загрузка веб-частей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1262
Авторизация веб-частей. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1268
Итоговые задания по персонализации. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1268
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1269
ЧАСТЬ 6 ■ ■ ■ Программирование на стороне клиента
ГЛАВА 31. Методы JavaScript и Ajax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1273
Основы JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1273
Объектная модель HTML-документа. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1274
Клиентские события. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1275
Блоки сценариев. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1277
Манипулирование HTML-элементами. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1279
Отладка JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1280
Базовые примеры JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1282
Создание процессора страниц JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1282
Использование JavaScript для асинхронной загрузки изображений. . . . . . . . . . . . . . 1285
Рендеринг блоков скриптов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1290
Атаки путем внедрения сценариев. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1291
Запросить проверку. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1291
Отключение проверки запроса. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1292
Пользовательские элементы управления с помощью JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1294
Всплывающие окна. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1294
Кнопки переворачивания. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1298
Рамки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1301
Рамочная навигация. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1302
Встроенные фреймы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1303
xxvi ■СОДЕРЖАНИЕ
Понимание Аякса. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1304
Объект XMLHttpRequest. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1305
Пример Ajax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1307
Использование Ajax с обратными вызовами клиента. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1311
Создание обратного вызова клиента. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1311
Обратные вызовы клиентов «под капотом». . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1317
Обратные вызовы клиента в пользовательских элементах управления. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1318
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1322
■ГЛАВА 32 ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1323
Знакомство с ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1323
ASP.NET AJAX на клиенте: библиотеки сценариев. . . . . . . . . . . . . . . . . . 1325
ASP.NET AJAX на сервере: ScriptManager. . . . . . . . . . . . . . . . . . 1325
Обратные вызовы сервера. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1326
Веб-службы в ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1327
Прокси-сервер веб-службы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1334
Размещение веб-метода на странице. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1336
Службы приложений ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1337
Серверные элементы управления ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1344
Частичный рендеринг с помощью UpdatePanel. . . . . . . . . . . . . . . . . . . . . . . . . . . 1344
Обновление по времени с помощью таймера. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1351
Обновления с помощью UpdateProgress занимают много времени. . . . . . . . . . . . . . . . . . . . 1352
Глубже в клиентские библиотеки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1355
Понимание модели клиента. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1356
Объектно-ориентированное программирование на JavaScript. . . . . . . . . . . . . . . . . . . . . . . 1357
Структура веб-страницы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1364
Расширители управления. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1369
Установка набора средств управления ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . 1370
AutoCompleteExtender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1371
Набор средств управления ASP.NET AJAX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1374
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1378
■ГЛАВА 33 Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1379
Понимание Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1379
Silverlight против Flash. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1380
Внедрение Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1382
Silverlight и WPF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1382
Установка Silverlight и расширений Visual Studio. . . . . . . . . . . . . . . 1383
Создание проекта Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1384
HTML-страница входа. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1385
Сценарий инициализации Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1386
Страница XAML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1388
Код XAML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1391
■СОДЕРЖАНИЕ xxvii
Свойства и события. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1392
Серебряная компиляция. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1393
Основы Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1394
Классы .NET Framework в Silverlight. . . . . . . . . . . . . . . . . . . . . . . . . . . 1395
Холст. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1396
Текст. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1401
Взаимодействие с HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1402
Изолированное хранилище. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1406
Silverlight и ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1408
Фьючерсы ASP.NET. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1408
Взаимодействие между Silverlight и ASP.NET. . . . . . . . . . . . . . . . . . 1412
Рисование в 2D. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1412
Простые фигуры. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1413
Пути и геометрии. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1417
Кисти. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1425
Прозрачность. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1427
Анимация. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1429
Основы анимации. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14:30
Определение анимации. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14:30
Пример интерактивной анимации. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1434
Трансформирует. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1437
Краткое содержание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1440
■ИНДЕКС . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1441
Расширять