Быстрое освоение приемов разработки веб-сайта с помощью ASP.NET Starter Kits

ASP.NET и Visual Studio .NET безусловно облегчили разработку Web-приложений. Однако создание Web-сайтов ASP.NET все еще требует определенных усилий с вашей стороны. Вам по-прежнему нужно проектировать весьма солидное приложение, разрабатывать для него надежный, повторно используемый код и проводить его тщательное тестирование. Вполне вероятно, что посреди этого процесса вы зададитесь вопросом: «Неужели до меня никто не сталкивался с этой проблемой? А вдруг я снова изобретаю колесо?». С некоторыми сценариями сталкиваются большинство ASP.NET-разработчиков. К таким сценариям относится создание сайта сообщества, учет времени (tracking time) по проекту или создание портала для своей компании. Было бы неплохо опереться на хорошо продуманный фундамент, а не начинать все «с нуля» — пусть даже все равно понадобится настройка и расширение готового решения. Именно эта идея и реализована в ASP.NET Starter Kits.

ASP.NET Starter Kits — это набор из пяти полностью рабочих приложений-примеров от Microsoft. Вы можете скачать их по ссылке www.asp.net/starterkits (EN). В набор входят приложение — витрина магазина электронной коммерции, Web-сайт сообщества, портал, примеры отчетов и приложение для учета времени по проекту. Цель этих приложений — предложить разработчику несколько полезных стартовых Web-сайтов и образцы хорошего ASP.NET-кода, пригодного для обучения и в качестве отправной точки. Все пять наборов поставляются с полным исходным кодом, работают с хранилищами данных SQL Server или Microsoft Data Engine (MSDE) и существуют в версиях на Visual Basic, C# и J#. Кроме того, есть версии, рассчитанные на Visual Studio .NET [с ASPX-страницами и страницами отделенного кода (codebehind pages)], и SDK-версии (без страниц отделенного кода). Таким образом, вы можете работать с наборами в своей любимой среде — будь то Visual Studio .NET, ASP.NET Web Matrix или любой другой редактор. В этой статье я сначала расскажу о пяти наборах ASP.NET Starter Kits, а затем сосредоточусь в основном на Community Starter Kit и покажу, как расширить его под конкретные потребности.

Наборы Commerce и Portal

Commerce Starter Kit создает приложение — витрину электронного магазина для вымышленной компании, продающей шпионское оборудование, IBuySpy. Приложение основано на трехуровневой архитектуре, в нем реализованы кэширование, аутентификация на основе форм и корзина покупателя. Кроме того, в набор входит компонент Web-сервиса B2B (Business-to-Business). Это отличное приложение для обучения, особенно если вам нужно создать свое приложение электронной коммерции.

Portal Starter Kit создает приложение-портал для IBuySpy — для той же вымышленной компании, что и в Commerce Starter Kit. Набор содержит 10 модулей: announcements, contacts, discussion, events, html/text, image, links, quicklinks, xml/xsl и пользовательский модуль.

Набор Time Tracker

Time Tracker Starter Kit  — это интранет-приложение для учета времени и биллинга без биллингового компонента. Оно сравнительно простое и содержит три вкладки: Log, Reports и Administration. Вкладка Administration предназначена для конфигурирования проектов, Log — для учета времени, а Reports — для генерации отчетов по проекту или отдельному сотруднику.

 Вкладка Log в Time Tracker Starter Kit

Time Tracker Starter Kit демонстрирует несколько интересных архитектурных особенностей ASP.NET, в том числе трехуровневую архитектуру, аутентификацию на основе форм и средствами Windows, динамическое создание диаграмм с помощью GDI+ и мобильный клиентский интерфейс.

Набор Reports

Reports Starter Kit отличается от остальных тем, что это не единое приложение, а серия из восьми отчетов, которые можно запустить с тестовыми данными. Вам доступна документация и исходный код этих отчетов. Ничто не мешает вам скопировать их код и вставить его в собственное приложение. Этот набор аналогичен ASP.NET QuickStarts, поставляемому с Microsoft .NET Framework SDK и Visual Studio .NET. Примеры включают простые табличные отчеты, два варианта иерархических отчетов, кросс-вкладки (cross tabs) и несколько диаграмм на основе GDI+.

Набор Community

Community Starter Kit — гвоздь программы. Не прилагая особых усилий и ничего не зная о том, как он работает, вы можете с его помощью быстро создать Web-сайт для группы пользователей, клуба, семьи или сообщества. Кроме того, он позволяет разрабатывать простые новостные и информационные сайты. В некоторых областях функциональность Community перекрывается с функциональностью Portal, но первый в большей мере рассчитан на некоммерческую организацию, легче в настройке и поддержке.

Community Starter Kit поддерживает разнообразные типы контента, в том числе статьи, фотогалереи и списки мероприятий (event listings). Он также поддерживает некоторые дополнительные функции, обычно присутствующие на многих сайтах сообществ, в том числе рекламу, модерирование, квоты закачки (upload), рейтинги, комментарии, опросы, уведомления об изменении контента, автоматическое цензурирование, тематические разделы (topics), Web-окна (Web boxes), новости (newsletters), скины и защиту.

Реклама обрабатывается парой элементов управления AdRotator: один соответствует баннеру стандартного размера 46860 пикселов, а второй — 125×125 пикселов. При включенном модерировании раздела контент должен быть одобрен модератором до публикации на сайте. Вы можете настроить квоты закачки для каждого пользователя, ограничив объем загружаемых на сайт изображений и файлов. Кроме того, Community Starter Kit поддерживает квоту закачки для всего сообщества, что позволяет Интернет-провайдеру обеспечивать хостинг нескольких сообществ в одном боксе (single box) без опасений, что одно из них займет все доступное дисковое пространство.

Вы можете разрешить поддержку рейтингов и комментариев для определенного типа контента, например для книг или статей. Пользователи могут оценивать элемент контента по шкале от 1 до 5 и при желании писать свои комментарии (дополнительно или вместо рейтинга).

Community Starter Kit поддерживает создание опросов и вывод их результатов. То есть вы можете опросить пользователей, например, по таким вопросам: «Какой .NET-язык разработки вы предпочитаете?» или «Как звали первого барабанщика группы Led Zeppelin?». Существует возможность автоматического уведомления пользователей о появлении новых материалов в разделе. Поддерживается даже цензурирование, так что грубые выражения автоматически удаляются из контента без каких-либо действий с вашей стороны.

Набор Community позволяет создать список тематических разделов, что заставляет пользователей классифицировать свои материалы. Например, новостной сайт по .NET Framework может содержать такие разделы, как ASP.NET, управляемый C++, Web-сервисы и т. д.

Community Starter Kit также позволяет размещать выдержки из важнейших материалов на полях страниц с помощью различных Web-окон. Так, Web-окно можно использовать для рекламы самой популярной или последней статьи, ссылок, материалов, доступных для скачивания, или фотографий на домашней странице. Web-окно цитирования выводит на странице случайные цитаты.

В наборе предусмотрены два механизма репликации контента: сервисная подписка (service subscriptions) и окна Web-сервисов (Web Service boxes). Сервисная подписка позволяет брать контент из раздела другого сайта, построенного на основе Community Starter Kit, и показывать его на своем сайте. Например, вы можете подписаться на раздел обсуждений на другом сайте сообщества и выводить его на своем так, будто эта ваш раздел. Как и Web-окна, окна Web-сервисов выводят выдержки из текстов на полях страницы, но в отличие от первых последние могут получать контент с других сайтов. Вы можете подписаться на получение материалов с другого сайта на основе Community Starter Kit, публикующего контент в виде Web-сервиса XML, или на RSS-сервис вроде http://msdn.microsoft.com/msdnmag/rss/recent.xml. Любой раздел стороннего сайта можно сделать доступным с помощью Web-сервисов XML и протокола SOAP (протокол RSS в этом случае пока не поддерживается). К таким разделам можно обращаться, используя сервисную подписку или окна Web-сервисов.

Есть также возможность рассылки новостей членам сообщества. Соответствующий компонент поддерживает шаблоны и встраивание специальных тэгов для включения полей вроде Username, FullName и Password и специфичных для контента полей типа NewArticles, NewBooks и NewDownloads.

Ядро Community Starter Kit поддерживает концепцию скинов, или тем (themes), что позволяет радикально менять внешний вид сайта, просто выбирая другую тему со страницы администрирования. Скины и темы мы рассмотрим детальнее чуть позже. Community Starter Kit предоставляет весьма серьезную систему защиты, классифицирующую членов в соответствии со стандартными ролями (аноним, аутентифицированный пользователь, модератор, администратор) или созданными вами. Вы можете сделать так, чтобы лишь пользователи конкретных групп могли просматривать, добавлять, редактировать или удалять контент в определенных разделах. Рис. 2 иллюстрирует ряд функций, поддерживаемых Community Starter Kit. Здесь в вымышленном сообществе Ballard .NET используется тема Professional. Обратите внимание на опрос в верхней части страницы и на окно, озаглавленное «.NET Tips & Tricks», справа внизу на странице. Это окно Web-сервиса.

 Пример Web-сайта сообщества

Создание сообщества

После того как вы скачаете и установите Community Starter Kit, первое, что вы захотите сделать, — удалить данные образца сайта. Для этого щелкните ссылку Login внизу панели навигации (navigation bar) и зарегистрируйтесь как Admin с паролем Admin. (Смените пароль как можно быстрее, иначе возникнет угроза безопасности.) После успешного входа в систему на панели навигации появится новая ссылка (Admin). Щелкнув эту ссылку, вы попадете в раздел администрирования сайта. Прокрутите страницу вниз до ссылки Delete Content. Вернувшись на основную страницу сообщества после удаления контента, вы увидите, что часть контента все же сохранилась. Чтобы заменить контент на свой, вернитесь на страницу администрирования, щелкните Edit Sections, выберите раздел Home и задайте название сайта, описание и логотип. Edit Sections позволяет изменить базовую разметку основной страницы, выбрать тему и включить дополнительные функции (например, вывод Web-окон или окон Web-сервисов) для основной страницы.

После разметки основной страницы добавьте разделы к сайту. Число разделов сайта не ограничено. Типы разделов (или модулей), которые можно создать, перечислены в таблице.

Тип раздела Описание
Articles Список статей, новости, списки FAQ (часто задаваемых вопросов) и советы.
Books Информация о книгах. Поддерживаются фотографии обложек книг и множество полей, в том числе автор, индекс ISBN, издатель и цена.
Custom Modules Контент пользовательского элемента управления.
Discuss Форум. Поддерживаются отмеченные сообщения (pinned posts), заблокированные сообщения (locked posts) и оповещения (announcements).
Downloads Файлы, доступные для скачивания.
Events Информация о мероприятиях, интересных для данного сообщества. Можно указать дату публикации сведений о мероприятии (visibility date), и тогда информация об этом мероприятии до поры до времени будет скрыта.
HTML Page Содержимое HTML-страницы, например страницы Contact Us.
Links Гиперссылки.
Parent Section Контейнер для других разделов. Страница по умолчанию — тоже родительский раздел, но вы  можете добавить и другие родительские разделы.
Photo Gallery Галерея изображений. Поддерживается автоматическая генерация микрокартинок (thumbnails).

Для добавления раздела щелкните ссылку Edit Sections на странице администрирования. Вы можете создать несколько разделов одного типа. Так, на рисунке показано два раздела одного типа: News и Article. Для организации группы сходных разделов пользуйтесь родительскими разделами. Например, если вы хотите распределить файлы для скачивания по категориям, создайте родительский раздел с несколькими разделами Downloads, скажем, User Contributions, Controls и Speaker Presentations.

На странице Edit Sections можно включать дополнительные функции, влияющие на отдельные разделы, например поддержку модерирования или уведомлений по электронной почте. Также можно публиковать контент раздела в виде Web-сервиса сообщества.

Архитектура Community Starter Kit

Хотя многие Web-сайты генерируются динамически в зависимости от текущих данных, большинство по-прежнему в основном статичны. Это не всегда плохо, но чем больше контента генерируется динамически, тем больше возможностей в настройке сайта. Community Starter Kit полностью управляется данными. Не считая страниц, предназначенных для администрирования, он включает всего одну ASPX-страницу, на которой нет никакого контента. Весь контент хранится в базе данных SQL Server или MSDE. Одна установленная копия Community Starter Kit способна поддерживать несколько сообществ; такая поддержка настраивается под специальной учетной записью ISPAdmin.

Когда Web-сервер получает запрос на страницу, относящуюся к Community, этот запрос обрабатывается HTTP-модулем CommunitiesModule; он определяет сообщество, раздел, страницу и пользователя, связанного с запросом. Полученными данными он заполняет объекты CommunityInfo, SectionInfo, PageInfo и UserInfo соответственно.

Эти объекты являются элементами набора Items объекта Context. Так как он сохраняется на время обработки запроса и к нему могут обращаться все модули и обработчики, участвующие в этом процессе, его данные доступны странице, обслуживающей запрос (подробнее об объекте Context см. статью Стивена Смита «ASP.NET: Девять способов сохранения состояний в ASP.NET-приложениях» в номере MSDN Magazine за апрель 2003 г. (EN)). Затем CommunitiesModule перенаправляет запрос странице communityDefault.aspx, которая динамически формирует ответ с применением упомянутых объектов, пользовательских элементов управления, вспомогательных классов и таблиц стилей.

Сейчас Community Starter Kit, наверное, не поддерживает все нужные вам функции, но он спроектирован с учетом расширяемости. Если вам что-то не нравится в его работе, вы легко это измените. Этот набор поставляется с полным исходным кодом на Visual Basic .NET, C# и J#. Особенно хорошо адаптируются его темы и элементы модулей.

Работа с темами

Инфраструктура Community Starter Kit основана на ASP.NET-приложении Forums; как и Forums, она использует темы (также называемые скинами) и за счет этого отделяет UI от основного кода. Тема — нечто большее, чем просто таблица стилей. По сути без тем никакого контента не было бы, так как они содержат все элементы управления, выводимые на страницах сайта. Тема состоит из элементов, приведенных в таблице.

Элемент Местонахождение файлов Описание
PageSkins Themes\theme\Skins\PageSkins Определяет разметку основной страницы. Для изменения базовой разметки основной страницы, в том числе количества столбцов и расположения пользовательских элементов управления, измените этот скин.
ContentSkins Themes\theme\Skins\ContentSkins Разметка конкретных страниц, в том числе страниц статей, разделов статей, добавления статей, файлов для скачивания и разделов с файлами для скачивания.
ControlSkins Themes\theme\Skins\ControlSkins Разметка элементов управления, применяемых на страницах, например окна Web-сервисов или элемента управления, выводящего комментарии.
TemplateSkins Themes\theme\Skins\TemplateSkins Разметка шаблонов, используемых элементами управления Repeater и DataList, например ItemTemplate для элемента управления DataList фотогалереи.
Stylesheet Themes\theme\Styles Все базовые стили, используемые на страницах, вроде SectionMenu, а также специфичные для модулей стили вроде Article_IntroCell. Большинство тем (но не все) содержит лишь одну таблицу стилей, default.css. В дополнение к таблицам стилей папка Styles содержит изображения, используемые в таблицах стилей.
Images Themes\theme\Images Изображения, требуемые пользовательским элементам управления.

Для создания новой темы добавьте подпапку в папку Communities\Common\Themes. Имя темы формируется по имени папки. В этой папке создайте дополнительные папки, приведенные в таблице. К счастью, вам не придется заполнять каждую папку темы, так как все темы наследуют от базовой темы Default. Таким образом, если вы не предоставите свой скин, Community Starter Kit воспользуется скином из темы Default.

Хотя тема Default содержит более 75 файлов, для создания базовой темы потребуется всего несколько файлов. Я создал базовую тему Small, которая является фактически копией Default и отличается от нее лишь тем, что размеры шрифтов уменьшены, синий цвет заменен красным и немного изменена разметка для областей страницы по умолчанию. Моя новая тема состоит из шести файлов:

  • Communities\Common\Themes\Small\Images\redshiny3dsquarebullet_7x7.jpg;
  • Communities\Common\Themes\Small\Skins\ControlSkins\Sections_SectionMenu.ascx;
  • Communities\Common\Themes\Small\Skins\PageSkins\Default.ascx;
  • Communities\Common\Themes\Small\Styles\an_red_arrow.gif;
  • Communities\Common\Themes\Small\Styles\Default.css;
  • Communities\Common\Themes\Small\Styles\redyellowstar.gif.

Конечно, чем больше элементов вы определите, тем законченнее будет выглядеть ваша схема. Создать новую схему легче всего на основе существующей, изменив ее скины и стили.

Создание нового модуля

Вы можете создавать новые модули для своего сообщества, хотя это потруднее, чем создать схему. Например, я создал модуль Jobs, обрабатывающий объявления о работе.

Для создания модуля сначала добавьте новую таблицу к базе данных CommunityStarterKit и назовите ее Community_модуль (где модуль — имя нового модуля). Эта таблица будет хранить элементы нового модуля. Первичному ключу таблицы следует присвоить имя модуль_ContentPageID. Создайте также дополнительные поля, необходимые для модуля.

Вам понадобятся хранимые процедуры для добавления новых элементов модуля, редактирования существующих, получения списка элементов и выборки всех полей одного элемента. Хранимые процедуры для модуля Jobs называются Community_JobsAddJob, Community_JobsEditJob, Community_JobsGetJobs и Community_JobsGetJob. Эти процедуры я создал на основе хранимых процедур из модуля Articles, добавив поля, необходимые для хранения объявлений о работе. Community_JobsGetJobs извлекает список объявлений для страницы Jobs_Section. Для разбиения вывода на отдельные страницы модуль вызывает Community_GetPagedSortedContent.

CREATE PROCEDURE Community_JobsGetJobs
(
  @communityID int,
  @username NVarchar(50),
  @sectionID int,
  @pageSize int,
  @pageIndex int,
  @sortOrder NVarchar(50)
)
AS

DECLARE @currentDate DATETIME
SET @currentDate = GetUtcDate()

-- Получить объявления о работе
SELECT
          Job_Company,
          Job_TempStatus,
          Job_TempMonths,
          Job_StartDate,
          Job_Location,
          Job_Education,
          Job_Experience,
          Job_Salary,
          Job_ContactName,
          Job_ContactPhone,
          Job_ContactEmail,
          Job_ContactWeb,
          Content.*
FROM
          dbo.Community_GetPagedSortedContent
          (
                      @communityID,
                      @username,
                      @sectionID,
                      @currentDate,
                      @sortOrder,
                      @pageSize,
                      @pageIndex,
                      default
          ) Content
          JOIN Community_Jobs
                      ON Job_ContentPageID = ContentPage_ID
ORDER BY
          IndexID

Создайте новую папку в Engine\Modules для кода модуля, а в ней — три подпапки: Components, Content и Controls. Для модуля Jobs я создал папки Engine\Modules\Jobs\Components, Engine\Modules\Jobs\Content и Engine\Modules\Jobs\Controls. В папке Components должно быть две библиотеки классов: первая содержит класс, производный от ContentInfo, а вторая — вспомогательный класс, отвечающий за вызов хранимых процедур модуля.

Используя версию Community Starter Kit для Visual Basic .NET, я создал библиотеку классов JobInfo.vb с единственным классом JobInfo. В качестве основы своей библиотеки классов я задействовал ArticleInfo.vb. Конструктор JobInfo принимает единственный параметр, объект DataReader, с помощью которого он получает все поля из таблицы Jobs и записывает их в закрытые переменные. Эти переменные доступны как свойства класса JobInfo.

Imports System
Imports System.Data.SqlClient

Public Class JobInfo
    Inherits ContentInfo

    Private _company As String
    Private _tempStatus As Boolean
    Private _tempMonths As String = String.Empty
    Private _startDate As String = String.Empty
    Private _location As String = String.Empty
    Private _education As String = String.Empty
    Private _experience As String = String.Empty
    Private _salary As String = String.Empty
    Private _contactName As String = String.Empty
    Private _contactPhone As String = String.Empty
    Private _contactEmail As String = String.Empty
    Private _contactWeb As String = String.Empty

    Public Sub New(ByVal dr As SqlDataReader)
        MyBase.New(dr)

        ' Заполнить обязательные поля
        _company = CStr(dr("Job_Company"))
        _tempStatus = CStr(dr("Job_TempStatus"))

        ' Заполнить необязательные поля
        If Not (dr("Job_TempMonths") Is DBNull.Value) Then
            _tempMonths = CStr(dr("Job_TempMonths"))
        End If
        If Not (dr("Job_StartDate") Is DBNull.Value) Then
            _startDate = CStr(dr("Job_StartDate"))
        End If
        If Not (dr("Job_Location") Is DBNull.Value) Then
            _location = CStr(dr("Job_Location"))
        End If
        If Not (dr("Job_Education") Is DBNull.Value) Then
            _education = CStr(dr("Job_Education"))
        End If
        If Not (dr("Job_Experience") Is DBNull.Value) Then
            _experience = CStr(dr("Job_Experience"))
        End If
        If Not (dr("Job_Salary") Is DBNull.Value) Then
            _salary = CStr(dr("Job_Salary"))
        End If
        If Not (dr("Job_ContactName") Is DBNull.Value) Then
            _contactName = CStr(dr("Job_ContactName"))
        End If
        If Not (dr("Job_ContactPhone") Is DBNull.Value) Then
            _contactPhone = CStr(dr("Job_ContactPhone"))
        End If
        If Not (dr("Job_ContactEmail") Is DBNull.Value) Then
            _contactEmail = CStr(dr("Job_ContactEmail"))
        End If
        If Not (dr("Job_ContactWeb") Is DBNull.Value) Then
            _contactWeb = CStr(dr("Job_ContactWeb"))
        End If
    End Sub 'New

    Public Property Company() As String
        Get
            Return _company
        End Get
        Set(ByVal Value As String)
            _company = Value
        End Set
    End Property

' ...и т. д. для остальных свойств

Класс JobUtility обеспечивает интерфейс между модулем Jobs и одноименной хранимой процедурой. Он содержит четыре метода: AddJob, EditJob, GetJobs и GetJobInfo. Метод GetJobs вызывает хранимую процедуру Community_JobsGetJobs и возвращает ArrayList из объектов JobInfo.

Public Shared Function GetJobs(ByVal username As String, _
 ByVal sectionID As Integer, ByVal pageSize As Integer, _
 ByVal pageIndex As Integer, ByVal sortOrder As String) As ArrayList
   Dim conPortal As New _
    SqlConnection(CommunityGlobals.ConnectionString)
   Dim cmdGet As New SqlCommand("Community_JobsGetJobs", conPortal)
   cmdGet.CommandType = CommandType.StoredProcedure
   cmdGet.Parameters.Add("@communityID", CommunityGlobals.CommunityID)
   cmdGet.Parameters.Add("@username", username)
   cmdGet.Parameters.Add("@sectionID", sectionID)
   cmdGet.Parameters.Add("@pageSize", pageSize)
   cmdGet.Parameters.Add("@pageIndex", pageIndex)
   cmdGet.Parameters.Add("@sortOrder", sortOrder)

   Dim colJobs As New ArrayList()

   conPortal.Open()
   Dim dr As SqlDataReader = cmdGet.ExecuteReader()
   While dr.Read()
        colJobs.Add(New JobInfo(dr))
   End While
   conPortal.Close()
   Return colJobs
End Function 'GetJobs

Папка Content должна содержать одну библиотеку классов для каждого базового типа страницы, поддерживаемого модулем. Эти классы станут отделенным кодом (code behind) пользовательских элементов управления. Как минимум, ваш модуль должен содержать классы для страниц следующих типов: добавления элемента, редактирования элемента, вывода списка элементов (для страницы разделов) и вывода отдельного элемента (для страницы с информацией об элементе). Эти классы должны наследовать от классов ContentAddPage, ContentEditPage, ContentListPage и ContentItemPage соответственно. Как вы, наверное, заметили, Content-классы один в один соответствуют вызываемым ими хранимым процедурам.

Я создал четыре библиотеки классов — AddJob.vb, EditJob.vb, JobSection.vb и Job.vb, — каждая из которых основана на Content-классах Articles. Content-классы являются связующим звеном между классом JobInfo и скинами пользовательских элементов управления. Класс Job из библиотеки классов Job.vb отвечает за вывод полной информации по конкретному объявлению.

Imports System
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports ASPNET.StarterKit.Communities

Namespace Jobs
    Public Class Job
        Inherits ContentItemPage

        Private _skinFileName As String = "Jobs_Job.ascx"

        Private _getContentItem As New _
         GetContentItemDelegate(AddressOf JobUtility.GetJobInfo)

        Public Sub New()
            SkinFileName = _skinFileName
            GetContentItem = _getContentItem
        End Sub 'New
    End Class 'Job
End Namespace

Папка Controls будет содержать нестандартные серверные элементы управления для каждого объявления о работе, выводимого на страницах Job и JobSection. Для страницы Job я создал серверные элементы управления JobCompany, JobTempStatus, JobTemp Months, JobStartDate, JobLocation, JobEducation, JobExperience, JobSalary, JobContactName, JobContactPhone, JobContactEmail, JobContactWeb и JobEditContent, а для страницы JobSection — элемент управления ItemJobLocation.

Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.ComponentModel
Imports ASPNET.StarterKit.Communities.Jobs

 _
 Public Class JobCompany
    Inherits WebControl

    Private _text As String

    Public Sub New()
        CssClass = "jobOtherFields"

        ' Получить объект ContentInfo
        If Not (Context Is Nothing) Then
            Dim objJobCompany As JobInfo = _
             CType(Context.Items("ContentInfo"), JobInfo)
            If Not (objJobCompany Is Nothing) Then
                _text = objJobCompany.Company
            End If
        End If
    End Sub 'New

        Public Property [Text]() As String
        Get
            Return _text
        End Get
        Set(ByVal Value As String)
            _text = value
        End Set
    End Property

    Protected Overrides Sub RenderContents( _
     ByVal writer As HtmlTextWriter)
        writer.Write(HttpUtility.HtmlEncode(_text))
    End Sub 'RenderContents
End Class 'JobCompany

Теперь нужно создать пользовательские элементы управления, представляющие контент-скины для базовых страниц модуля, соответствующих ранее созданным классам SkinnedCommunityControl. Вы должны предоставить минимум один набор пользовательских элементов управления (контент-скинов) для темы Default. Контент-скины можно создать и для дополнительных тем.

Я создал три пользовательских элемента управления в папке Themes\Default\Skins\ContentSkins: Jobs_AddJob.ascx, Jobs_JobSection.ascx и Jobs_Job.ascx. Для редактирования объявления элемент управления не предусмотрен, так как Jobs_AddJob.ascx работает за двоих, обеспечивая и добавление, и редактирование объявления. Обратите внимание на ссылки на нестандартные серверные элементы управления JobCompany и JobTempStatus в папке Engine\Modules\Jobs\Controls.

<%@ Control %>
<%@ Register TagPrefix="Community"
Namespace="ASPNET.StarterKit.Communities"
Assembly="ASPNET.StarterKit.Communities" %>

<table cellPadding=5 width=520>
  <tr>
    <td align=right colSpan=2><community:displaytopic id=topicPreview
      runat="Server"></community:DisplayTopic></TD></TR>
  <tr>
    <td class="Job_Label" colSpan=2><community:title id=lblPreviewTitle
      CssClass="Job_Title" Runat="Server"></community:Title></TD></TR>
  <tr>
    <td class="Job_Label">Description: </TD>
    <td><community:briefdescription id=lblPreviewBriefDescription
      CssClass="Job_BriefDescription" Runat="Server">>
      </community:BriefDescription></TD></TR>
  <tr>
    <td class=Job_Label>Company:</TD>
    <td><community:jobcompany id=lblPreviewCompany
      CssClass="Job_OtherFields" Runat="Server"></community:JobCompany>
    </TD></TR>
  <tr>
    <td class="Job_Label">Temporary Job?</TD>
    <td><community:jobtempstatus id=lblPreviewTempStatus
      CssClass="Job_OtherFields" Runat="Server">
      </community:JobTempStatus></TD></TR>
<!-- ...остальной код ASCX-страницы опущен... -->

На этом этапе я добавил стили к таблице стилей по умолчанию (Themes\theme\Styles\default.css) для новых контент-элементов управления (content controls).

.JobSection_SectionTitle {font-weight: bold; font-size: 17px;
    font-variant: small-caps;}
.JobSection_SectionDescription {font-family: verdana, arial, helvetica,
    sans-serif; font-size: 12px; font-weight: normal;}

.Job_Table {border: none;}
.Job_IntroCell {background-color:#EEEEEE;border:#CCCCFF solid 1px;}
.Job_BodyCell {background-color:#FFFFFF;}
.Job_Title {font-weight: bold; font-size: 17px; font-variant:
    small-caps;}
.Job_BriefDescription {font-size: 12px; font-style: italic}
.Job_Label {font-size: 12px; font-weight: bold; font-style: italic;
    background-color:#FFFFFF;}
.Job_OtherFields {font-size: 12px; color: #333333}

Наконец, я добавил записи для страниц элемента (item page) и раздела элемента (item section page) в таблицы Community_PageTypes и Community_NamedPages в базе данных. Это сделать довольно просто благодаря хранимой процедуре Community_MaintenanceInitializeJobs, которую я создал на основе существующей хранимой процедуры Community_MaintenanceInitializeArticles. Запустив ее, я генерирую все необходимые записи.

 Страница JobSection

 Страница Job

Скачать файлы, входящие в модуль Jobs (а также тему Small), можно с сайта MSDN Magazine по ссылке msdn.microsoft.com/msdnmag/code03.aspx (EN) в разделе за август.

Заключение

ASP.NET Starter Kits содержит несколько приложений-примеров, которые полезны как в качестве функциональных шаблонов Web-сайта, так и в качестве образцов кода на Visual Basic .NET, C# и J#. Его наборы представляют наиболее распространенные Web-приложения — для сообществ, электронной коммерции, порталов, генерации отчетов и учета времени по проектам. В этой статье я рассказал об использовании стартовых наборов, а также о способах расширения и адаптации Community Starter Kit (даже при отсутствии Visual Studio .NET). Эти наборы помогут вам быстро приступить к разработке ASP.NET-сайта. Стоит отметить, что некоторые компании, предлагающие Web-хостинг, обеспечивают автоматическое развертывание стартовых наборов и регистрацию учетной записи. Детали см. на www.asp.net/hosters (EN).

Спасибо Стефену Уолтеру (Stephen Walther) за помощь при написании этой статьи.


Пол Литуин (Paul Litwin) — CEO и старший преподаватель в компании Deep Training, предлагающей обучение в области технологии .NET. Председатель конференции Microsoft ASP.NET Connections. Автор и соавтор ряда книг, в том числе «ASP.NET for Developers» (SAMS, 2001). Сейчас работает над новой книгой по ASP.NET.

Истоничк: http://www.microsoft.com/rus/msdn/magazine/archive/2003-08/AspNet_full.asp

Автор: Пол Литуин
Уровень сложности: 1
Эта статья предполагает знание разработки для Web



Опубликовал admin
28 Июл, Четверг 2005г.



Программирование для чайников.