Вторник, 21.11.2017, 13:03
Приветствую Вас Гость | RSS

Лекции

Меню сайта
Форма входа
Категории раздела
ТАУ (Теория автоматического управления) [31]
лекции по ТАУ
Экология [151]
учебник
Бухгалтерский учет и налогообложение в строительстве [56]
Дементьев А.Ю. - Практическое пособие
Психология [104]
Пип
информатика [80]
с# Карли Ватсон
современные стулья [0]
новинки
Поиск
Главная » 2010 » Февраль » 11 » Управление конфигурацией данных
01:00
Управление конфигурацией данных
Управление конфигурацией данных
Программа рассылки новостей может быть настроена со спе-
циальными подтверждениями, именем и электронным адресом
администратора, и некоторыми другими опциями (со всеми воз-
можными опциями мы вскоре познакомимся). Использование же-
стко заданных в программе значений этих опций является плохим
подходом, так как при возникновении у администратора необходи-
мости изменить некоторую опцию (например, свой адрес элект-
ронной почты), ему придется вносить соответствующие изменения
в исходный код, компилировать весь проект заново и загружать
новый модуль. Это серьезная проблема, особенно если админист-
ратор сайта не является программистом. Поэтому мы будем хра-
нить все установки в виде внешнего файла, из которого их будет
очень просто считывать и записывать, а также выводить на стра-
ницу, позволяя администратору с легкостью изменять любые
значения без повторной компиляции и перезагрузки.
XML-файл установок
Все установки обычно хранятся в базе данных или в текстовом файле. Если
выбрать базу данных, то потребуется завести целую таблицу для хранения всего
лишь нескольких установок. Можно бы хранить все установки либо в одной строке
(со многими столбцами), либо по одной установке в каждой строке. Такое решение
оказывается весьма простым — просто еще одна таблица и еще один класс в мо-
дуле NewsMailerDB, однако оно означает неэффективное использование ресурсов
базы данных. Хорошим решением является использование XML-файла, который
обладает вполне подходящим форматом для хранения установок приложения.
В .NET Framework также предусмотрены классы, позволяющие легко считывать
и записывать все установки и представлять их в виде свойств класса несколькими
строками кода. Этот код будет рассмотрен ниже, а пока начнем с объяснения са-
мих установок.
Файл NewsMaiier. settings используется для хранения строки соединения с ба-
зой данных всех установок, а также приложения за исключением касающихся
внешнего представления приложения. Все возможные установки перечислены
в приводимой ниже таблице.
Установки NewsSubject, [Un]SubscriptionSubject И [Un]SubscriptionMessage
могут содержать в себе специальные теги, например, #subscriberFirstName# или
806 Практический пример
#ListDescription#, которые будут заменяться на соответствующие им значения
перед отправкой каждого сообщения. Позднее в настоящем разделе мы детально
разберем эту возможность.
Название установки Тип
Допускается
значение null Описание
SenderName
SenderEmail
NewsSubject
string
string
string
Да
Нет
Нет
Signature
SubscriptionSubject
SubscriptionMessage
UnSubscriptionSubj ect
UnSubscriptionMessage
SendSubscriptionEmail
SendUnSubscriptionEmai1
SubscribeURL
string
string
string
string
string
bool
bool
string
Да
Нет
Да
Нет
Да
Нет
Нет
Нет
Имя отправителя новостей
Адрес электронной почты отправителя
новостей
Предмет новостного сообщения,
использующийся по умолчанию.
У администратора есть возможность
создать сообщение, добавив произвольный
текст к этой строке непосредственно
из страницы
Подпись, которая будет автоматически
добавляться в конец сообщения
Предмет сообщения, отправляемого
по электронной почте в качестве
подтверждения успешной подписки
Тело сообщения, отправляемого
по электронной почте в качестве
подтверждения успешной подписки
Предмет сообщения, отправляемого
по электронной почте в качестве
подтверждения успешного отказа
от подписки
Тело сообщения, отправляемого
по электронной почте в качестве
подтверждения успешного отказа
от подписки
Если это значение равно t r u e , то новые
подписчики будут получать по электронной
почте подтверждение о том, что подписка
прошла успешно
Если это значение равно t r u e ,
то существующие подписчики будут
получать по электронной почте сообщение
о том, что их подписка завершена
Полный URL страницы Subscribe.ASP.NET,
который используется для добавления или
удаления пользователя из списка
В этой таблице приводятся различные типы установок; все установки хранятся
в XML-файле в виде строк. Этот тип обозначает тип свойства класса, которому
(свойству) соответствует значение данной установки. Столбец "Допускается значе-
ние null" имеет аналогичный смысл: в нем описываются установки, которые могут
отсутствовать в файле установок. Не существует никакого файла со схемой, кото-
рая позволяла бы получать подтверждение того, что та или иная установка на
самом деле присутствует в файле установок — страница ASP.NET, которая ис-
пользуется для их считывания и изменения, отвечает за сохранение допустимости
структуры файла.
Практический пример 2 — Менеджер рассылки новостей в режиме онлайн 807
XML-файл выглядит приблизительно следующим образом:

<AppSettings> :
<SenderName>NewsMailer Team</SenderName> •. ' :
<SenderEmail>admin@newsmailerserver.com</SenderEmail>
<NewsSubject>News 4 you: #ListName#</ NewsSubject>
; , <Signature>The NewsMailer Team</Signature> :
<SubscrSubject>Welcome to the mailing list #ListName#</SubscrSubject>
<SubscrMessage>Welcome dear subscriber</SubscrMessage>
<UnSubscrSubj ect>Bye bye from #ListName#</UnS'ubscrSubj ect>
<UnSubscrMessage>You've been removed from #ListName#</UnSubscrMessage>
<SendSubscrEmail>true</SendSubscrEmail>
<SendUnSubscrEmail>true</SendUnSubscrEmail>
<SubscribeURL>http://localhost/newsmailer/subscribe.aspx</SubscribeURL>
• ••,'•••<•/ A p p S e t t i n g s >
Модуль NewsMailerConfig
Сериализация объекта — это процесс сохранения состояния данного объекта
в памяти или в виде постоянного двоичного или ASCII-файла. Под состоянием
объекта понимается множество всех его свойств, значений и ссылок на другие
объекты. Напротив, десериализация приводит к созданию нового объекта, состоя-
ние которого определяется данными, хранящимися в некотором файле. .NET Framework
существенно упрощает выполнение сериализации и десериализации за счет
множества классов, которые позволяют работать с несколькими различными фор-
матами хранения.
Если вы используете VS.NET, создайте для начала новый проект типа class
Library и переименуйте установленный по умолчанию файл класса в AppConfig.cs.
Если вы набираете текст с помощью текстового редактора, то сохраните этот файл
в директории NewsMaiier\config. Ниже приводится сводная таблица класса
AppSettings, который отвечает за создание XML-файлов, подобных приведенному
выше, из сериализованных экземпляров. Этот файл состоит из множества общих
свойств, имена которых совпадают с именами соответствующих свойств из XML-
файла.
Все свойства класса AppSettings помечены атрибутом XmlElement. Это сделано
именно так, поскольку требуется, чтобы все эти свойства могли быть сериализова-
ны в виде XML, а для этого используется класс xmiseriaiizer из пространства
имен System.Xml.Serialization. Поскольку класс AppSettings не обладает мето-
дами, позволяющими ему сериализовать и десериализовать себя, эта задача возла-
гается на класс поддержки AppConfig, также хранящийся в файле AppConfig.cs.
Вот содержимое этого класса:
Класс AppConfig
Метод Описание
public static AppSettings GetSettings (string fileName) Находит XML-файл, в котором хранятся
все установки, и создает объект класса
AppSettings, содержащий эти данные
public static void SaveSettings (string fileName, Получает объект AppSettings
AppSettings data) и записывает хранящиеся в нем данные
в указанный XML-файл
808 Практический пример
Эти два метода достаточно сложны, поэтому мы объясним их более подробно.
Для начала приведем код метода GetSettingsO:
public static AppSettings GetSettings(string fileName)
;: HttpContext = HttpContext.Current;
AppSettings data = (AppSettings)context.Cache["AppSettings*];
if (data == null)
{
XmlSerializer serializer = new XmlSerializer(typeof(AppSettings));
try
{
// создать файловый поток для чтения XML-документа
: FiieStream fs = new FileStream(filename. FileMode,Open);
XmlReader ~ new XmlTextReader (fs);
: i;; : // посмотреть состояние объекта :
data - (AppSettings)seriallizer.Deserialize(reader);
reader.CloseO ;
: : : ; ; context.Cache.Insert(•AppSettings", data,
: new CacheDependency(filename));
} ' "'..' ..;,-:
:;
• : catch (System.10.FileNotFoundException) ; :
{ ••'.'• ' ' :.--:.: ••:•
// если файл не найден, вернуть новый пустой класс
data = new AppSettings () ;
) ' I • l l l l i l l
return data;
}
Прежде всего данный метод осуществляет проверку, не находится ли объект
с данными установками в кэш-памяти, куда он попадает при первом обращении
к методу. Если объект уже находится в кэш-памяти, то метод GetSettingsO про-
сто возвращает эти данные. Если объект в кэш-памяти отсутствует, то сначала со-
здается объект XmlSerializer, затем осуществляется открытие параметра файла,
указанного в качестве первого, после чего для потока файла создается объект
XmlTextReader. В завершение состояние объекта извлекается посредством метода
Deserialize () объекта XmlSerializer, а ПОЛученНЫЙ В результате всех ЭТИХ дей-
ствий объект AppSettings помещается в кэш-память для последующего использо-
вания.
В этой программе есть несколько примечательных моментов. Первый заключа-
ется в том, что путь к файлу с установками не "зашит" в программу, а передается
в качестве параметра. Это необходимо, поскольку данный код будет откомпилиро-
ван в модуль и может быть использован произвольным клиентом, поэтому файл
с установками может располагаться в различных местах.
Вторым любопытным моментом является способ, с помощью которого установ-
ки переносятся в кэш. Обратите внимание на следующую строку кода:
Context.Cache.Insert("AppSettings", data, new CacheDependency(fileMame));
Третий параметр означает, что информация, хранящаяся в кэш-памяти, зависит
от файла, который передается в качестве параметра. Если этот файл обновляется,
то информация, хранящаяся в кэш-памяти, более не считается правильной, поэто-
му при повторном обращении к установкам необходимо выполнить десериализа-
цию файла еще раз. Тот факт, что состояние файла отслеживается автоматически,
Практический пример 2 — Менеджер рассылки новостей в режиме онлайн 809
является замечательной особенностью кэширования в ASP.NET, которая позволя-
ет вносить изменения в содержимое файла установок с помощью произвольного
редактора, перезагружать файл и при этом знать, что все установки будут перезаг-
ружены в кэш-память.
И последний момент: когда состояние объекта перезагружается из файла, то
все установки, хранящиеся в XML-файле в виде строк, автоматически приводятся
к тому типу, которым обладает соответствующее свойство.
Метод Savesettingso обладает структурой, аналогичной структуре метода Get-
Settings О:
" public static void SaveSettings(string FileName, AppSettings data)
{
XmlSerializer =; new XmlSerializer (typeof (AppSettings) );
II Создать XmiTextWriter используя FileStream
FileStream fs = new FileStream(fileName, FileMode.Create);
XmiTextWriter writer = new XmiTextWriter (fs, new UTF8 Encoding'() ) ;
// Осуществить сериализацию, используя XmiTextWriter
serializer.Serialize(writer, data);
writer.Close();
ЩщЩташш
i *j
- Ш References
|
I L~ Ш AssembiyInfoConf.es
ЁЗ- • Ш NewsMailerDB
^ Solution Explorer | <d$ Cia?> View
Единственный новый момент заключается в том, что некото-
рые символы, например '<' и '>', кодируются, поскольку с точки
зрения XML они обладают особым смыслом (они используются
для обрамления XML-тегов). Способ такого кодирования задает-
ся В КОНСТрукторе объекта XmiTextWriter.
Компиляция модуля
Если вы вели разработку в Visual Studio.NET, то ваш Solution
Explorer должен принять вид, изображенный на рисунке слева.
При этом в режиме Class
картинка, представленная на
View должна выводиться следующая
рисунке справа.
Управление
пользовательским интерфейсом
Разработка базы данных и бизнес-классов завершена, т. е.
большая часть работы уже выполнена. Теперь мы собираемся за-
няться разработкой пользовательского интерфейса приложения,
а также использовать бизнес-классы для чтения и записи данных
из базы данных.
Прежде чем переходить к рассмотрению кода на ASP.NET
и С#, взглянем на некоторую часть результатов, к которым мы
стремимся (см. рис. на стр. 810).
Страница, изображенная на указанном рисунке, позволяет ад-
министратору просматривать имеющиеся в наличии списки рас-
сылки, создавать, уничтожать или редактировать эти списки,
а также переходить к списку подписчиков или к другим страницам
приложения. В таблице на данной странице показаны все списки,
которые были получены из базы данных, в ней также выводятся
• ^ Е Я Е
е - о w«
и
1•
>.. • ,t,\M,i '-, ~*
miiTHiii
-г,ф (JetOc{«!s(ir»t)
•**£ Bases ^tnd Merf^ces
*i|# AdtffUMtrinQj »Ь*ЧЬ string)
-%ф 6atSJw<rlO0fttHrinfl)
• ? F : . - * Г .
810 Практический пример
IS <VewsM«ili?r vi,0 Copynght 20
11 Usls f Subsetors i SoniJFn
jjs^nd 5fi^ £rnsi to a list *•
ШШЯ
ij? 2Г i VB.NST
j j f Ш z * A S P J M S T г *
<iil i fcmvs l i i s t o r
i
ШИШ
Visual Basic.NET- оё¥« rui ц
rd 1 Settings i
I! <**
Щ
1>
их свойства и предусматривается воз-
можность их сортировки по значению
одного из следующих свойств: ID,
Name, Description. Все ИКОНКИ, ВЫВО-
дящиеся в таблице (рисунки, распо-
ложенные левее столбца ID И правее
столбца Description), представляют
собой гиперссылки на другие страни-
цы, позволяющие выполнять какие-
либо другие действия над данным
списком или над данной строкой.
Ниже приводится перечень иконок,
которые могут располагаться внутри
таблицы с описанием выполняемых
ими действий.
Если вы когда-либо программиро-
вали на обычном ASP, то вы, вероятно,
думаете, что для этой таблицы потре-
буется большой объем сложного кода,
позволяющего управлять гиперссылка-
ми, рисунками, изменением цвета строк,
сортировкой данных и т. п. Но вы уди-
витесь, насколько просто всего этого
можно добиться с помощью ASP.NET
и нескольких строк кода на С#.
Все приложение состоит из несколь-
ких страниц ASP.NET, большинство из
которых относится к административно-
му разделу. На диаграмме (см. стр. 811)
приводится стандартное расположение
страницы, а также полный список всех
страниц, имен файлов, в которых они
хранятся, и соответствующих файлов
и классов с кодом поддержки.
Иконка Описание
_
Редактирование записи
Удаление записи
Переход на страницу, на которой выводятся
подписчики данного списка рассылки
Переход на страницу, на которой выводятся
прошлые сообщения, отправленные
в соответствии с данным списком рассылки
Переход на страницу, на которой составляется
и отправляется новое сообщение подписчикам,
входящим в данный список рассылки
Создание
пользовательских управляющих элементов
Если есть некоторые составные части пользовательского интерфейса, которые
требуется использовать более, чем на одной странице, то следует подумать о том,
каким образом можно использовать код повторно без копирования и переноса его
из одной страницы в другую. В данной программе мы хотим иметь возможность
общего использования заголовка и нижней части страницы, которые соответствен-
но представляют собой верхнее меню и маленькую иконку, расположенную внизу
справа непосредственно под таблицей и позволяющую возвращаться на начало
страницы. В традиционном ASP потребовалось бы включить два отдельных файла
посредством директивы <I--#INCLUDE -->, однако в ASP.NET есть лучшая альтер-
натива — пользовательские управляющие элементы. С их помощью можно выде-
лить общий код в отдельный файл, который может быть в дальнейшем использован
везде, где в этом возникнет необходимость, путем присваивания имени импортиру-
емому управляющему элементу, изменения его общих свойств или вызова общих
Практический пример 2 — Менеджер рассылки новостей в режиме онлайн 811
Меню
(Header.ascx)
Страница ASBNET
Нижняя часть
(Footer.ascx)
Страницы ASP.NET
Страницы управления Прочие страницы
щ
i l l
ь о
Модуль NewsMailer.dll (классы кода поддержки)
со со
Si 8%
&9
методов, которыми он обладает. Другими словами, это не просто участок кода,
вставляемый в нашу страницу, он представляет собой графический компонент,
обладающий собственным именем и атрибутами. Являясь серверным компонентом,
он, как и другие серверные компоненты ASP.NET, обрабатывается на сервере,
а все, что получает браузер пользователя, — это стандартный HTML, совмести-
мый с любым браузером.
В нашем проекте используются два пользовательских управляющих элемента:
Пользовательский
управляющий элемент Описание
Header.ascx
Footer.ascx
Осуществляет добавление заголовка, общего для всех страниц web-сайта.
Этот управляющий элемент состоит из трех частей:
• Раздел заголовка, представленного в виде таблицы,
в которой хранятся текст и логотип.
• Еще одна таблица, в которой хранятся ссылки на другие web-страницы.
• Надпись, представляющая собой текст, который описывает
каждую из ссылок, когда на нее указывает курсор мыши.
Содержит всего лишь образ ссылки, которая переносит пользователя
обратно на начало страницы.
812 Практический пример
Использование пользовательских
управляющих элементов на web-странице
Чтобы использовать управляющий элемент из web-страницы, необходимо заре-
гистрировать его из этой страницы, указав имя исходного файла и префикс, позво-
ляющий отличать его от других серверных управляющих элементов. Следующие
две строки должны быть включены в начало страницы:
<%@ Register TagPrefix=!lNewsMailer" TagName--"Header" src-"Header.ascx" %>
<%@ Register TagPrefJ.x-!1NewsMailer" TagName="Footer" src="Footer.ascx11 %>
Ниже приводится код, который позволяет добавить пользовательские управля-
ющие Элементы Header И Footer на обычную Страницу:
<html>
<head>
<title>NewsMailer: Subscribers</title>
<link rel="stylesheet" HREF="Styles.ess" TYPE="text/ess">
</head>
<body>
<!— Insert the menu user control — >
<NewsMailer:Header id="Menu" runat="server" />
<b> Some HTML code</b>
runat^"server" />
а>/ «*• fwvkm tafe
<!— Insert the footer — >
<NewsMailer:Footer id="Footer"
</body>
</html>
Страница управления списками
На ранее представленном рисунке страница управления списками рассылки
изображена в том виде, в каком она появляется на экране сразу после загрузки.
Однако ее внешний вид может претерпевать определенные изменения в зависи-
мости от предпринимаемых дей-
ствий. Вот что вы увидите, если
нажмете на иконку с изображе-
нием блокнота и ручки, располо-
женную у самого левого края,
для того чтобы отредактировать
список (см. рис. слева).
Свойства Name И Description
текущей страницы выводятся
внутри двух текстовых окон, и у
администратора есть возмож-
ность изменить эти значения,
после чего щелкнуть мышью
либо на зеленой иконке с галоч-
кой, чтобы сохранить эти изме-
нения в базе данных, либо на X,
для того чтобы отказаться от этой операции. Обратите внимание на то, что стол-
бец ID не подлежит редактированию, поскольку он используется в качестве счет-
чика и его значение не может быть изменено, а также на то, что списки
отсортированы по имени, а не по ID, как прежде. Для сортировки необходимо
щелкнуть мышью на заголовке того столбца, по значениям которого вы хотите
произвести сортировку.
Hosting offers izt ASP.NgT applications
vjsva? BssfciiST • ftfcwi and tips
Практический пример 2 — Менеджер 'рассылки новостей в режиме онлайн 813
Для того чтобы добавить новый список, администратор должен щелкнуть мышью
на кнопке Button, расположенной слева вверху основной страницы. Вот к какому
результату это приведет:
Add New Mame iOescription
I
На экран выводятся два пустых текстовых окна, и администратор заполняет их,
вводя названия и описание того списка рассылки, который он собирается созда-
вать. Выполнение этой операции может быть подтверждено или отменено посред-
ством двух иконок, расположенных с левой стороны. В обоих случаях (это также
справедливо и для редактирования) текстовые окна убираются, а картинка возвра-
щается к своему первоначальному состоянию. Если нажать иконку для редактиро-
вания новой строки, то такой эффект достигается почти автоматически, и тогда
при добавлении новой строки приходится обрабатывать события управляющих
элементов для вывода или свертывания текстовых окон самостоятельно. Этот про-
цесс оказывается намного проще, чем может показаться на первый взгляд — для
его осуществления необходимо написать всего лишь несколько строк кода, к чему
мы перейдем буквально через минуту.
Страница Lists\aspx
Это страница ASP.NET, в которой описывается пользовательский интерфейс;
в ней может также храниться код описания сценария, как и на страницах ASP.
Одно из наиболее значимых преимуществ ASP.NET заключается в том, что код
оказывается отделенным от пользовательского интерфейса за счет использования
файлов с кодом поддержки — этот термин мы будем очень часто использовать по
- ходу настоящего раздела (и который мы уже несколько раз использовали, не давая
ему определения). В файле с кодом поддержки находится один или более классов,
которые обрабатывают все события, возникающие в web-странице. Разделение этих
двух уровней позволяет web-дизайнеру вносить изменения во внешнее представле-
ние web-страниц без необходимости разбираться в запутанном коде на VBScript
или Jscript, который распределен по всей странице вперемешку с HTML-кодом.
Файлы с кодом поддержки могут быть откомпилированы в отдельный модуль, что
существенно упрощает установку приложения (поскольку в этом случае приходит-
ся загружать только один DLL-файл вместо нескольких исходных файлов с кодами
на С#) и повышает уровень обеспечения безопасности вашего приложения в том
смысле, что если кто-то получит доступ к серверу, то он не сможет также быстро
прочитать бизнес-код, как в случае с ASP.
Чтобы создать страницу Lists.aspx в VS.NET, выберите пункт меню Project |
Add Web Form. При работе в любом другом редакторе просто создайте новый файл
В папке NewsMailer.
Исходный код для этой страницы слишком велик, чтобы приводить его цели-
ком, поэтому будем останавливаться только на тех его участках, которые представ-
ляют для нас интерес как для программистов на С#. В первой строке содержится
описание того, какой базовый класс используется при обработке событий, возни-
кающих на данной странице:
<%@ Page language=nc#" Inherits^"NewsMailer.Lists" %>
814 Практический пример
В этом классе содержится весь код, который выполняется при загрузке данной
страницы при нажатии клавиши, а также когда мы хотим добавить, удалить или
отредактировать какой-либо список рассылки. Этот класс, называющийся Lists,
входит в состав пространства имен NewsMaiier и компилируется в отдельный мо-
дуль NewsMaiier.dll, к рассмотрению которого мы перейдем позднее. Страница
автоматически просматривает папку с именем bin в корневой web-папке, находит
модуль и реализует наследование от этого класса. Файл, в котором содержится ис-
ходный код на С# (в данном случае это файл Lists.cs), представляет собой файл
с кодом поддержки.
Двигаясь далее по телу страницы, мы обнаруживаем форму с кодом для середи-
ны web-страницы, расположенной между заголовком и нижней частью страницы.
Первое, на что мы обращаем внимание,— это кнопка Create в верхнем левом углу
непосредственно под заголовком. При нажатии этой кнопки появляются два тек-
стовых окна и две иконки — для подтверждения и для отказа от данной операции,
которые были продемонстрированы ранее. Остальная часть страницы остается без
изменений. Ниже приводится код для этой кнопки:
....... .... ... . . : , <asp:TableRow ID=fiCreateNewRown> : /•.•''•."•••'..•' .
: <asp:TableCell ColumnSpan+ *3"> -y'^{'-">^•: ; : .
<asp:Button runat="server" Text-"Create"
ID=HCreate_Clic}cfl Width="80px"
OnClick="Create_Click1' Width="80pxn
/>
• ; : .'• ••:•• • .•• •, •• • < / a s p : T a b l e C e l l > • •• ••• .•.•••••••••.•,.•,•:•.••••• •• . • • • •• : •,. : • • ••• „ • / . .
</asp:TableRow> • .• '••;'••/• ' /•• .• V - - . ^ - ' : . ; :
Далее идет строка таблицы, по умолчанию являющаяся невидимой, но которая
становится видимой при щелчке мышью на кнопке Create. Эта часть программы
позволяет модифицировать список и принять сделанные изменения или отказаться
от них:
<asp:TableRow ID="AddNewContrclsRow11 Visible^"false">
<asp:TableCell>
<asp:Image ImageURL="./Images/imgSpacer.gif"
• Width=n15px"•.;Height ="lpx" runat="server" /•>••:
<asp:LinkButton ID="AddNew" runat-"server" />
Text="<img beorder=0 scr=./Images/imgOK.gif
• Alt='Add new list'>" .
: OnClick-"AddNew_Click" • :
. ; • . . ; , : . .. /> • • • •
<asp:Image ImageUKL="./Images/imgSpacer.gif"
Width="15px" Height="lpx" runat-"server" />
<asp:LinkButton ID="CancelAddNew" ;• :
runat="server" CausesValidation="false?l
Text="<img beorder=0 scr=./Images/imgCancel.gif
Alt='Cancel editing mode'>"
OnClick-11 Cancel AddNew_C.lick11
/> '§шшшйi : ^ ш ш ш ^ м ш щ : \ • •-•;.':.:"
• ••••• : ш
</asp:TableCell>
</asp:Table Cell VerticalAlign="Top">
<asp:TextBox runat="server" Class="TextBox"
ID="NewListName" Width="150px" />
: <asp:ReguiredFieldValidatbr Id="ValidateNewName" ;
: - runat="server" COntrplToValidate="NewListName/
Displays"dynamicM<br>* Name is required
. </asp:RequiredFieldValidator>
</asp:TableCell>
Практический пример 2 — Менеджер рассылки новостей в режиме онлайн 815
</asp:Table Cell VerticalAlign="Top">
<asp:TextBox runat—"server" Class="TextBox"
ID="NewListDescr" Width="450px" />
</asp:TableCell>
</asp:TableRow>
Обратите внимание на то, что все серверные управляющие элементы, к кото-
рым требуется обеспечить доступ программным путем, обладают атрибутом ID,
а весь код располагается внутри серверной формы. Также обратите внимание на
то, что при создании нового списка рассылки задание его имени является необхо-
димым, ЧТО Обеспечивается управляющим элементом RequiredFieldValidator. На-
значение свойства controiTovaiidate (управляющий элемент, подлежащий проверке)
очевидно, а свойство Display, которому присваивается значение dynamic, означает,
что область для сообщения об ошибке будет выделяться в динамическом режиме.
Одним из наиболее интересных серверных управляющих элементов является
элемент табличного вывода, который в нашем приложении используется для выво-
да списков рассылки. Этот управляющий элемент обладает широким спектром
функциональных возможностей, для использования которых требуется всего лишь
несколько строк кода: отличающиеся стили для подлежащих изменению строк,
сортировка данных и постраничное разбиение данных. Однако наиболее важным
представляется то, что этот управляющий элемент является полностью настраива-
емым и основанным на использовании шаблонов. С помощью программного шаб-
лона можно определить содержимое каждого столбца и указать способ, которым
эти данные должны выводиться.
Именно здесь задаются свойства управляющего элемента для табличного выво-
да данных:
<asp:DataGrid id="ListsGrid" runat="srver"
CssClass="Grid_General"
HeaderStyle~CssClass=HGrid_HeaderH
ItemStyle-CssClass="Grid_Item"
AlternatingItemStyle~CssClass="Grid_AlternatingItein"
' Ai lowSort ing-11 True"
: AutoGeneratedColumns^"False"
DataKeyField="ID"
OnEditCornmand="ListsGrid_Edit"
OnCancelCommand="ListsGrid_CancelEditu
OnUpdateCoramand="ListsGrid_Update"
OnDeleteCommand="ListsGrid_Delete"
OnSortCommand="ListsGrid_SortM >
Задаются стили, которые будут использоваться при выводе различных состав-
ляющих таблицы, кроме того, мы определяем, что эти данные могут быть отсорти-
рованы, а также задаем столбец в исходной таблице, который будет использоваться
в качестве первичного ключа данных таблицы (свойство DataKeyFieid). В послед-
них строках описываются процедуры обработки событий, вызываемые для реали-
зации различных операций над таблицей.
Далее требуется объявить, каким образом будет представлен каждый столбец.
Нам необходимы следующие столбцы:
• Допускающий щелчок мышью рисунок для редактирования строки
• Допускающий нажатие мышью рисунок для удаления строки
• Столбец для вывода названия списка
• Столбец для вывода описания списка
816 Практический пример
• Допускающий щелчок мышью рисунок для перехода к странице,
где выводятся подписчики списка, который находится в текущей строке
• Допускающий щелчок мышью рисунок для перехода к странице,
на которой выводятся ранее отправленные сообщения
для данного списка
• Допускающий щелчок мышью рисунок для перехода к странице,
которая позволяет отправить новое сообщение по электронной почте
« всем подписчикам данного списка
Поскольку табличное представление данных до сих пор в книге не встречалось,
то мы подробно остановимся на его реализации. Ниже приводится код, необходи-
мый для вывода первых двух столбцов:
• • • • • • • • • • • . • • . . . :, .,•. < C o l u m n s > ' ' : • , . . • • • • . • • . • . . . • . • : • • • • • . • • • . . • • . • . . • • . • • '• • ^
<asp:EditCoimandColumn :
ItemStyle-Width="25px"
EditText="<img border=0 Alt='Edit this list'
src=./Images/imgEdit.gif>"
CancelText="<img border=0 src=./Images/imgCancel.gif>"
UpdateText="<img border-0 src=. /Images/imgOK.gd f>"
/ > • Л ^ • : • ,
<asp: ButtonColumn
ItemStyle~Width="25px"
Text="<img border=0 Alt='Delete this list'
• . •';.,. , ' src=. / I m a g e s / i m g D e l e t e . g i f > " •••• • ""''" .'• '
СommahdName="de1ete"
EditcoiumnButton — это особый столбец, содержащий ссылку на начало редак-
тирования, a Buttoncolumn позволяет создавать обычные кнопки или ссылки. Для
выполнения любой операции, которая может потребоваться, необходимо обраба-
тывать событие click. Обратите внимание на то, что для представления кнопок
свойство столбца Text задается с помощью тега <img>. Если включить в программу
обычную строку вместо этой HTML-строки, то мы получаем стандартную кнопку
с надписью в виде этой строки.
Ниже приводится программа для вывода столбцов, содержащих поля списка ID,
Name И Description!
<asp:BoundColumn HeaderText=llIDlt ItemStyle-Width="30px11
DataField=nID" Readonly-"True" SortExpression="IDM />
<asp:TemplateCclumn HeaderText=tlName" SortExpression="Name"
itemStyle-Width="l£opx"
<ItemTemplate>
<asp:Label runat="server" Text='<%#
DataBinder.Eval(Container.Dataltem, "Name") %>' />
</ItemTemplate>
<EditItemTemplate>
<asp;TextBox ID="EditListName11 runat-"server"
Text-^<%# DataBinder.Eval (Container. Dataltem, "Name") %>.'
Class="TextBox"
Width="150px11
<asp:ReguiredFieldValidator Id="ValidateEditName11
runat="server"
ControlToValidate="EditListName"
Display="dynamic">* Name is required
</asp:RequiredFieldValidator>
</EditItemTemplate>
</asp:TemplateColumn>
Практический пример 2 — Менеджер рассылки новостей в режиме онлайн 817
<asp:TemplateColumn HeaderText="Description"
• SortExpression="Description">
<ItemTempIate>
<asp:Label runat~"server" Text='<%#
DataBinder.Eval(Container.Dataltem, "Description") %>' />
</ItemTemplate> .:•••
<EditItemTemplate> ;.
<asp:TextBox ID="EditListDescrn runat=Hserver"
Text='<%# DataBinder.Eval (Container.Dataltern,
"Description") %>'
: Class="TextBox"
Width=n380px"
/ > • . . . ' • • ••
</EditItemTemplate>
</asp:TemplateColumn>
Первый столбец описывается в этой программе как обычный, не подлежащий
редактированию столбец. Два других столбца позволяют продемонстрировать, ка-
ким образом по шаблону можно создавать столбец, использующий управляющий
элемент Label для вывода значения или управляющий элемент TextBox для его ре-
дактирования. Соответствующее представление создается автоматически, когда мы
входим в режим редактирования для данной строки или покидаем его. Обратите
вниманиела то, что текст в управляющем элементе Label и в управляющих эле-
ментах TextBox обрабатывается С ПОМОЩЬЮ метода DataBinder.Eval (), который
возвращает значение соответствующего столбца для считываемой строки, а для
добавления нового списка требуется задать его имя.
Три остальных столбца представляют собой ссылки, которые позволяют пере-
ходить на страницы с дополнительной информацией:
<asp:HyperLinkColumn :
DataNavigateUrlField=HID"
: DataNavigateUrlFormatStrings"Subscribers.aspx?ListID={0}"
: DataTextFormatString="<img border^O Alt ='Show subscribers'
src=./Images/in\gAddresses.gif >"
DataTextField="ID"
/>
<asp:HyperLinkColumn
DataNavigateUrlField^ID" :
DataNavigateUrlFormatString:="NewsHistory.aspx?ListID={0}"
DataTextFormatString=H<img border=0 Alt='Show past news for
this list' :s.rc=. /Images/imgMessage.gif>"
DataTextField="IDM
; •. / > • • • ; : ^ : v V / r : .v. " ^ i ^ •^•.••:-'-: V / ' ' ' •'• " " ' ,'.' ' :\
<asp:HyperLinkColumn
DataNavigateUrlField="ID"
DataNavi&ateUrlFonnatString-"SendEmail;aspx?ListID={d}"
DataTextFormatString=n<img border=0 Alt='Send a new mail
for this list' src=./Images/imgMail.gif>"
DataTextField="ID" :
• : . /> ;•• . - ' • : • . : . ; ' :
Эти нередактируемые гиперссылки представляются в виде образов, а URL-адреса,
на которые они указывают, создаются с помощью шаблона строки, описываемого
в DataNavigateUriFormatstring: вместо маркера {0} вставляется ID соответствую-
щей строки.
Класс BasePage
Прежде чем приступить к изучению файла Lists.cs с кодом поддержки, о кото-
ром упоминалось в предыдущем разделе, представим базовый класс, который бу-
дет использоваться всеми классами из файлов с кодом поддержки, используемыми
818 Практический пример
в этом примере. Этот класс называется BasePage, и он является производным от
класса System.web.ui.Page. Его описание сведено в следующую таблицу:
Класс BasePage
Метод Описание
public string GetConnString () Извлекает строку соединения с базой данных
из файла web.config — файла, в котором хранятся
все установки конфигурации данного приложения
public string GetSettingsFile () Извлекает имя файла, в котором хранятся все установки
данного приложения, также находящегося в файле web.config
Этот класс обладает двумя общими методами, которые наследуются всеми про-
изводными классами. Это пример правильного использования объектно-ориенти-
рованного подхода, поскольку строка соединения и имя файла с установками могут
понадобиться ддя всех этих классов, и наилучшим решением будет поместить функ-
циональную возможность доступа к этой информации в одном классе, вместо того
чтобы копировать и переносить ее каждый раз, когда у какого-либо класса возни-
кает в ней необходимость. Обе функции реализованы весьма простым способом —
они осуществляют поиск строки соединения и имени файла с установками в приве-
денном ниже разделе файла web.config, после чего помещают эту информацию
в кэш-память:
<configuration>
: <appSettings>
<add key="ConnString" value="Provider=Microsof t.Jet.OLEDB.4.0;
Data Source=E:\Projects\NewsMailer\DB\NewsMailer.mdb" />
<add key="SettingsFilen value="NewsMailer.Settings" />
</appSettings>
</configuration>
Необходимо изменить вышеупомянутый ключ connstring так, чтобы он правиль-
но указывал на файл базы данных.
Код поддержки для Lists, aspx
После определения базового класса перейдем к рассмотрению того, что нахо-
дится в файл^е Lists.aspx с кодом поддержки.
Класс Lists
В СПИСКе ДИреКТИВ using ЭТОТ КЛаСС наХОДИТСЯ В Пространстве Имен NewsMailer
И является ПРОИЗВОДНЫМ ОТ BasePage:
namespace MewsMailer
{
public class Lists : MewsMailer.BasePage
После объявления нескольких защищенных управляющих элементов Web Form,
мы подходим к тому месту, где реализованы функциональные возможности страни-
цы. Ниже приводится обработчик, который запускается при загрузке страницы:
. protected void Page_Load(object sender, EventArgs e)
Щ Ш / - ' ' '{ ' ' ' : ; ' : \ V " : ' ;' •;;••;•."'."••. ••", ' _ -."••. х / Г / Т Ч ^ : ••.•;•;•;•;' •:• : V . . ; : : у - .-;._•:;;.
if (IPage.IsPostBack)
— 819
метод BindGrido, который наполняет таб-
protected void BindGrid ()
Datavicw myDV = lists.GetLists(,.TablestO].Defaultview;
2 «
ListGrid.DataSource = myDV;
Ust.Grid.DataBindO;
вторного запроса к базе данных
Н.„ .
вд» -
в „о„е„т „ерв о г о
данные вообще не
для вывода строк.
Сортировка списков
ShowAddNewControls{false);
bistsGrid.Editltemlndex = -l;
s —
о т п Р а в к и но-
в ы в о д и и ы е
выводимые
и вызывается метод
820 Практический пример
.11 установить атрибут SortExpression, который будет использоваться
//для сортировки данных в методе -BindGr id
ListsGrid.Attributes["SortExpression}=e.SortExpression.ToString{);
BindGrid();
} -. -.-. • ; Ш :--ъ
Прежде всего эта функция прячет управляющие элементы для включения нового
списка, если они видимы в данный момент. Затем она отменяет режим редактиро-
вания строки, если он был. установлен. Наконец, она получает выражение сорти-
ровки, по которому будет осуществляться фактическая сортировка, и название
столбца, а затем обновляет содержимое управляющего элемента табличного пред-
ставления данных, вызывая метод BindGr id ().



Категория: информатика | Просмотров: 1378 | Добавил: basic | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Календарь
«  Февраль 2010  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

krutoto.ucoz.ru
Бесплатный конструктор сайтов - uCoz