Регистрация элементов управления осуществляется директивой @Register, которая позволяет использовать в HTML коде страницы user controls и server controls, используя специальный синтаксис (declarative custom server control syntax). Парсер страниц на основе анализа этих директив может связывать теги с заданными типами и при создании страницы встраивать элементы управления уже как контейнеры пользовательских типов – ветви дерева элементов управления страницы.
Директивы должны предшествовать первому использованию объявляемых тегов, чаще их размещают в начале страницы и в случае регистрации нескольких элементов управления, в сайтах с модульной структурой количество таких объявлений может занимать большое количество строк. При изменении расположения элементов управления приходится искать требующие изменения строки в коде всех страниц и пользовательских элементов управления, на которых они зарегистрированы, что довольно неудобно.
В статье описан способ, упрощающий регистрацию элементов управления.
Для директив регистрации мы будем использовать обычный текстовый файл, в котором соберем все директивы @ Register. Так как для объявления user controls можно использовать виртуальные пути, а для server controls указываются лишь пространства имен, мы можем собрать в этом файле все нужные нам ссылки, причем ссылки на файлы ascx будут верными для любой папки проекта. Вот как выглядит этот файл в одном из проектов:
<%@ Register TagPrefix="ch" Namespace="ControlsSharp.HtmlControls" Assembly="ControlsSharp"%> <%@ Register TagPrefix="cw" Namespace="ControlsSharp.WebControls" Assembly="ControlsSharp"%> <%@ Register TagPrefix="c" Namespace="ControlsSharp.CustomControls" Assembly="ControlsSharp"%> <%@ Register TagPrefix="b" Namespace="ControlsBasic.CustomControls" Assembly="ControlsBasic"%> <%@ Register TagPrefix="cu" TagName="bottommenu" Src="~/UserControls/Menu/cu_menu_bottom.ascx" %> <%@ Register TagPrefix="cu" TagName="leftmenu" Src="~/UserControls/Menu/cu_menu_left.ascx" %> <%@ Register TagPrefix="cu" TagName="topmenu" Src="~/UserControls/Menu/cu_menu_top.ascx" %> |
Назовем файл register.inc и поместим в папку /inc нашего веб-проекта.
Этот файл будет содержать все нужные нам ссылки, добавление или изменение регистрации пользовательского или серверного элемента управления мы будем осуществлять именно в нем.
Теперь созданный файл нужно каким-то образом включить в код страницы. Мы сделаем это с помощью директивы SSI (server side includes) #include. Эта директива позволяет включать в код страницы статические и динамические файлы, обрабатывая их на основе маппинга IIS, т.е. указание в качестве источника файла asp или aspx приведет к обработке файла соответствующим процессом и копированию результатов этой обработки в выдаваемую страницу. В ASP директива #include очень широко использовалась и позволяла реализовать модульность сайта. С появлением ASP.NET это стало удобнее делать другими способами, например, с помощью user controls. В следующих версиях ASP.NET модульность будет реализована с использованием master pages. В общем, директива #include потеряла свое значение и была сохранена в основном для обратной совместимостью и для упрощенной миграции ASP проектов на.Net.
Так как у нас простой текстовый файл, никакой обработки произведено не будет, и до выполнения любого динамического контента все содержимое файла будет скопировано в код страницы. Т.е. добавление нашего файла register.inc, например, в начало страницы, это почти то же самое как будто бы мы напишем там все директивы @ Register.
Для того чтобы не зависеть от физического размещения файла, мы снова используем синтаксис с указанием виртуального пути и добавим в код aspx файла вот такую строчку:
Убедитесь, что все работает, если нет, поправьте неверно указанные пути.
Осталось осуществить еще одну операцию. Сейчас, если вы попробуете по ссылке в браузере получить файл /inc/register.inc, вы без труда сможете это сделать. IIS отдает его в ваши руки, так же как в руки злоумышленника, совершенно свободно, хотя там содержатся пути физической структуры вашего сайта.
Для того чтобы этого не происходило, мы используем возможности синхронного обработчика HttpForbiddenHandler, позволяющего защищать файлы определенного типа от выдачи по запросам пользователя. Этот подход удобен и часто используется, например, для защиты файлов баз данных MS Access, используемых в проекте. Для того чтобы файлы с расширение *.inc можно было защитить с помощью этого обработчика нужно сообщить IIS что эти файлы будет обрабатывать процесс ASP.NET, другими словами настроить в IIS маппинг на файлы этого типа.
Подробное описание процесса настройки для IIS описано в статье HOW TO: Use ASP.NET to Protect File Types (http://support.microsoft.com/kb/815152/EN-US/). Нам потребуется создать маппинг только для файлов типа *.inc. После выполнения описанных там шагов, все запросы к файлам с таким расширением будут обрабатываться процессом ASP.NET, и вам останется отредактировать файл web.config следующим образом:
|
Все, теперь при попытке получить файл /inc/register.inc по прямой ссылке пользователь получит ошибку В.
Чтобы не регистрировать aspnet_isapi.dll,
например, ваш провайдер не хочет этого делать можно воспользоваться возможностью
SSI указывать файлы любого типа и схитрить, использовав для файла с директивами
@Register расширение одного из типов, уже маппированных в IIS по умолчанию. Для
этого будут удобны расширения *.cs или *.vb. Эти файлы содержат исходный код и
обычно не копируются на сервер. Если вы вдруг ошиблись и скопировали, по запросу
из браузера их получить не удастся, - при попытке это сделать пользователь
получит ошибку В. Так происходит потому, что
для фалов этого типа маппинг в IIS настроен по умолчанию а соответствующее
расширение уже прописано в секции
Заключение
Описанный способ позволяет регистрировать элементы управления в одном месте для всего проекта. Последующая модификация этого файла требует меньше усилий по сравнению с тем, как если бы пришлось делать это обычным способом. Попробуйте использовать SSI #include внутри самих вставляемых файлов – это позволяет организовать подобие иерархии и наследования, что может быть удобно для крупных проектов
Что такое гостевая книга?
Разумеется, здесь речь идет о наиболее типичной гостевой книге. Прежде всего это система, предоставляющая пользователю возможности для ввода текста, выбора оценки того или иного сайта, а также для указания собственных данных (ФИО, e-mail, http и т.д.). Это также система представления данных, введенных различными пользователями, с возможностью навигации, отправки электронных писем авторам сообщений. Возможны и вариации с различными настройками и с контролем нормативности лексики.
Что нам понадобится
Конечно, предполагается, что читатель знаком с основами ASP- и SQL-программирования (знакомства с первыми частями настоящей статьи для этого будет вполне достаточно). Кроме того, нам потребуется Microsoft SQL Server 7.0 или 2000, какой-нибудь HTML- или текстовый редактор (рекомендую использовать Macromedia Dreamweaver UltraDev 4.0) и немного терпения.
Создание и подготовка базы данных
Для организации хранения введенных пользователями данных вам понадобиться одна таблица, где можно завести поля для хранения имени пользователя, его электронного адреса, страны проживания, адреса сайта, IP-адреса, значения оценки пользователем сайта по пятибалльной шкале и т.д:
В целях удобного встраивания системы в уже существующие сайты рекомендуется спланировать еще одну таблицу, предназначенную для хранения цветовых и других установок. Это позволит в дальнейшем изменять указанные установки без изменений соответствующих параметров в исходных текстах модулей приложения гостевой книги.
- Запустите программу-конфигуратор источников данных (Data Sources ODBC) - Start->Settings->Control Panel->Administrative Tools->Data Sources ODBC.
- Перейдите во вкладку System DSN и создайте новый источник данных, нажав на Add…
- В появившемся списке драйверов выберите драйвер баз данных - Microsoft SQL Server и нажмите на Next.
- В строке Data Source Name задайте имя вашей базы данных (в описываемом примере Gustbook - это имя, по которому вы в дальнейшем будете обращаться к ней).
- В строке Server укажите сервер, к которому будет осуществлено подключение, и нажмите на Next.
- Выберите режим аутентификации With SQL Server…, задайте имя пользователя и пароль для подключения к SQL-серверу; определите протокол связи с сервером (кнопка Client Configuration - TCP/IP) и два раза нажмите на Next, после чего нажмите на Finish.
- Вы увидите статистику о проделанных действиях, а для проверки источника данных можете воспользоваться кнопкой Test Data Source.
- В итоге перед вами появится строка в списке источников данных в вашей системе.
Теперь, когда база данных готова, можно переходить непосредственно к созданию гостевой книги.
Интеграция системы в уже готовый сайт
Понятно, что сама по себе гостевая книга не имеет смысла. Посудите сами: кому нужен сайт, предназначенный исключительно для сбора мнений читателей. Ведь для того чтобы собирать мнения о чем-либо, надо сначала это что-либо представить на их суд. Следовательно, необходимо уделить особое внимание моментам, связанным с упрощением встраивания системы в уже готовые сайты.
В частности, для упрощения настройки системы под характерные особенности того или иного сайта рекомендуется (как уже говорилось выше) создать специальную таблицу для хранения всех этих предпочтений, чтобы заносить в нее определенные значения, специфические для вашего сайта. Очевидное преимущество такого подхода заключается в том, что для осуществления встраивания системы в уже готовый сайт не потребуется производить изменения в исходном коде модулей, нужно изменить только настройки в соответствующей таблице базы данных.
Представим себе пример реализации такой таблицы: .
Как видите, здесь присутствуют поля для хранения информации об имени и пароле доступа к режиму настройки системы, о цветах основного фона сообщения пользователей, верхней и нижней рамок (поля Mid_Color, Top_Color, Bot_Color соответственно), о цвете и размере заголовка формы, служащей для ввода пользователем данных (поля Form_Color и FormTitleSize соответственно), о цвете, размере и начертании шрифра текста самого сообщения, информационных полей, а также самих страниц с гостевой книгой (поля MessageFontColor, MessageFontSize, MessageFontFace, InfoFontColor, InfoFontSize, InfoFontFace, PageFontColor, PageFontSize и PageFontFace соответственно), полей-переключателей для включения режима автоматической отправки уведомлений о поступлении новых сообщений по электронной почте ответственному лицу (например, менеджеру или администратору сайта), поля хранения электронного адреса ответственного лица, текста сообщения с благодарностями за оставленное пользователем сообщение, со списком недопустимых слов и переключателем режима их фильтрации (если последний включен, то слова, находящиеся в списке недопустимых, будут автоматически заменяться в тексте сообщения на звездочки и таким образом будет осуществлен контроль за нормативностью лексики текстов сайта).
Развитие системы интеграции гостевой книги подразумевает организацию и Web-интерфейса для настройки всех рассмотренных нами параметров (полей таблицы администрирования).
Интеграция системы в уже готовый сайт в чистом виде может создавать некоторые сложности и при восприятии исходного текста, и в дальнейшем, если, например, потребуется временно отключить гостевую книгу на том или ином сайте. Поэтому попытаемся разработать систему таким образом, чтобы ее интеграция в готовый сайт не составила особого труда. Для этого необходимо сформировать независимый модуль системы и включить его в текст основного сайта там, где это необходимо. Так, к примеру, текст страницы вашего сайта может выглядеть следующим образом: