Вы находитесь на странице: 1из 902

В.М.

Снетков

Программирование
на ASP.NET
В.М. СН"",,,В

Программирование на ASP.NET
2-е и здани е, и с п равле нное

С нетков В.М .

Национальный ОжРЬПЫЙ Университет " ИНТ УИТ"

2016

,
В.М. СН"",,,В Програм",ирование на ASP. NET
Прогр амм ировани е на ASP. NEТ/ В. М. Сне"ПФв - М.: Национ альный (}п.;рьпый
Униве р ситет" ИНТУИТ ", 2016
Кур с посвящен технологии прогр а ммирова ния web-прило жений на AS P. NEТ с
и спо льзованием Visua! Studio 2005.
В ку р с е по рроб но рассказывается об этапах создания web-са йmв, прогр аммировании
форм , сер верных и пользовательских элементах управления. Расска зывается о
средствах форм аmрования стра ниц, технологии ADO.NEТ, работе с файлам и и
каталогам и и упра влении бе зопаС НО СTh Ю са Йта .

(с) 000 " И НТУИТ. РУ", 2010-2016


(с) Сне"ПФв В. М . , 2010-2016
в.м. СН"",,,В П рограм ", ирование на AS P.N ET

ОСНОВЫ Visual Studio 2005


Обзор среды разработки VlSua! Studio 2005. Н астройка среды разработки
Visua! Studio 2005. Пр о ц есс разработки страницы. Типы фай лов
AS P.NET Управление ссылками н а сборку Выбор используемого
стандарта НТМL.

Помимо Windows -приложе ний вся мощь IDE сохраняется и для


про е ктиров а ния
Web -сай тов по те хнологии ASP.N ET. Visua! Studio 2005
п оддерживает б и бл иотеку массов Framework 2.0, которая является
усоверше нствованием библиотеки Framework 1.0 (1.1). Сама среда
про ектирова ния VlSua! Studio 2005 также является новой версией среды
Visua! Studio .NET 2003. Мы будем далее р ассматривать возможности
Visua! Studio 2005 при ме нител ьно к пр оектирован ию Web -сайтов ,
пр едназначе ннны х для работы в движке ASP.NET 2.0.

Среда разработки Visua! Studio 2005 пр едоставляет своему польз ователю


(программисту, не п угайте с конечным пользователем!) две
высокоуровневые области функциональности:

1. IDE (lntegrated Deve!opment Environment) среда, позволяющая

р азработч и ку написа ть и отладить код.


2. Компилятор , инспектирующий код разработчика и
прео бразующий его в пром ежугоч ный ба й т-код IL.

Це н тральное место в любой Web -страни ц е за ни мает НТМL -код .


Конечно, все мож но написать и в обычном текстовом редакторе, если в
точности знать и соблюдать весь синтаксис языка НТМL4. Но сейчас
это никто не делает, а пользуется с п ециальными НТМL -редакторам и. В
пр едыдущих версиях VlSua! Studio НТМL -редактор ы были з начитель н о
слабее специализированных редакторов. И самое главное,
вмешивались в HTML - коД, вводимый разработчиком, автоматически
пр еоб р азуя его в громоздкие конструкции. В VlSua! Studio 2005 этот
н едостаток уст р анен, теперь НТМL -редактор только выделяет блоки с
ошибочным кодом.

ПредыдуЩаЯ версия , VlSua! Studio .NET 2003, изначально компилировала


ис ходный НТМL- код активны х страниц до DLL -сборок Visua! Studio
2005 оставляет страницы в исходном НТМL- ф:Jрмате и в таком виде
,
в.м. СН"",,,В Програм ", ирование на ASP. NET

разработчик может перенести их на прОМЫШllенный сервер.


Компиляция же проис ходи т уже на сервере при первом за п уске

страницы , а также в том случае , если в исходный текст страницы в


по следУЮщем были внесены изм енен ия.

VlSual Studio 2005 по зволяет кодировать страницы на разных языках


прогр аммирования , подцерживающих установленный qюрмат среды
испол н ен ия (многоязыковая разработка). Главное услов и е , чтобы в
пр еделах отдельной страницы был использован только один язык.

При отладке Web-страни ц прим еняется такой же арсенал средств , как и


при разработке обычных локальных приложений (точки останова ,
по строковое выполнение , просмотр промежугочных значений
п еременных и т.д.). MSDN (Mk:rosoft Developer Network) - справочная
система разработчика от Мiсrоsоft.

Создание заготовки

Мiсrоsоft постановила, что отныне (начиная с VlSua! Studio 2005 )


разработка страниц ASP.NET не является проектом , а является Web -
саЙтом. Мы же , по -старинке , БУдем прим енять и тот и другой термины.
Начать работу по созданию Web -сай та теперь нужно так:

• г;.:.=Запустите ШЕ Visual Studio 2005

Перед вами появится прим ерно следующий интерфейс среды


разработки
в.м. СН"",,,В Програм",ирование на ASP.NET

''' = ""'" Т""" Wf1OO..,. comтLТrty и,;р

.. ",-.- 1.
~ · IiiI III . 8,") . ('10 . ~l"

0 '" S.v< Selec\ed r",m,


flJи'fО)К:t

~ 0 " S.vOI ClJI+ S

...- ., Visual Studio2005 0 " С Ь1 + э-rt· S

0 ' Ы ~H

0 0> '=
I 1I _
CJТЩJ
'ho",.,...,' "'''.' (horn<ImIфf not ""..-"" V"''''nfOm<t
ТooII. """""' di<k apno"", 11,.,., . """'., Е'''''''",.,,.,,I ..-.:1 <" S
0
0~
", ,-
~
С О1 +(

ClJIH

0 " ew
0 ' smDebuo;lл ;;

0 _C""W--.,
Solb::<l EXPOr<r C ~ I+ дI: + L
0 "
0 '" PГCV'""" \\' гФ"
"
0k Tool:x:>x Cb1 +N:·X

epen: Pfо)ЭС t • $ o.-tРq

С го. "' ; Pfo-",ct [,:j D ~,~

R.""Tocbo-

I"<I l;<i<;rv ru"""" 111<1..,.,.,. "


""<'- 5<rVOf """'У'о ~'" (.
""<'- Sorve, Нe;тдl:k:<1 Sor",
O.:;>L SOfVOfP~s.rv.o ,
Dewt::p&r С",-"

Здесь показаны начальная страница , открытая в рабочей области , и


ц епочка меню для на стр оики панел и инструме н тов. Начальная
страница уб ира ется п е ре уста новкой в р аскрывающемся списке As startup
в свойствах среды Tools/Options!Environment/Startup нового режима

орtюпs

-"
~_. Envirrn rnent Аt s И--Цо :

I€'ИЬЩ.
Add- n;Ма cros Securiti
AutoRocover s и--t Рagoэ r>3WS cha .-.--.з l:
IhtIjJ:// msdl,m o:rosoft,com/sqlfrss"ml
Fm ar.::1 Реросе
Frnts ,.--,j Co crs Р [>]"",Oad сrnten! еуегу :

~ m rutes
I ~t ar.::1 Ехрor! Setth;)s
InternatOтia I Settщ s
Keybo<f-d
S"',<
Тaзk List
Вr o wser

~- Projects ar.::1 So Utior'rs


$-- 50..-се C rnlт ol
i!J-- Те,! Editcr
I!J- Вusiness Intell qэncе Des чвs
~- Оаtabзsе Tools
i!J- Debo..щ ~

ос C,.-, ce l
в.м. СН"",,,В Програм ", ирование на ASP. NET

Рабочие панели среды разработЮ1 почти таЮ1е же , что и в IDE VlSua!


Studio .NET 2003.

• r;:;'выполните коман ду FilelN ewlWeb Site и настройте масте р


создания сайта
N~", VJ~h !;it~
======---------~~

Errpty Web
Si.,

Se:>fchOnlre
Т ОЩJ ", II»

Loca oo :

Поле Location = File System (файловая система) обозначает, что


БУдет созд аваться сайт на локальном компьют е ре. Поле Language =
Visua! С# назначает код овую поддержку страниц (мы буд ем
по л ьзоваться языком С# ). Правое длинное поле с кнопкой Browse
задает пугь и папку с именем сайта , где БУдУГ размещаться
входящие в него страницы и подкаталоги.

Щелчок на кнопке ОК после настройЮ1 маст ера , представленной окном


New Web Site, приведет к созданию нового Web -приложения. В
рабочей области появится вкладка с файлом начальной страницы и
именем по умолчанию Ое f aul t . азр х. Э та страница будет
запрашиваться браузером клиента при первом вхождении на сайт по его
URL без указания конкретной страницы.

З аготовка в режиме представления дескрипторов ( Source ) БУдет иметь


ВИД

,
В.М. СН"",,,В Програм",ирование на ASP. NET

<%@ Page L апguagе="С#" АutоЕvепtWirеuр=' 'truе'' CodeFile="Default.aspx.<

< !DO CТYP E html PUBLIC "- IIWЗС IIDШ ХНТМ L 1.0 Tra nsitio naVIEN" 'hu,

<html xm1пs="httр ://www.wЗ.огgl 1 999/xhtml" >


<head nmat="server">
< title >Uпtitled Page</tide>
<lhead>
<body>
< fо пn id="fo rml " ruпаt="sеrvег''>
<div>

</div>
</foпn>
<!body>
<lhtml>

в режиме п редставления D еsigп это бу,цет п ока п устой интерфейс ,


который р азработ чику н ужно будет создать. Смысл кода заготовЮ1 мы
рассмотрим позже .

Есл и п осмотреть на созданное мастером ч е рез панел ь Solution Ехр!о гег


(или зайти в пап ку WebSitel через проводник) , то можно увидеть, чт о
созд ан а пап ка App_Data - ДЛЯ размещения фай лов с будущими данными ,
сама страница с дескри п торам и Defauh.aspx и файл скры того кода
п аддержЮ1 страницы с тем же именем , но расширением .cs (от слова С#
).

Soluoon Explorer ..... .Q. х

~ C:\",\WebSitel \

~·"~i;':.
t:I DefaLjtaspx.CS

Файлы >1< .aspx и >1< .aspx.cs - это файлы обычного те кстового формата . Мы
можем и х создавать и редактировать в обычном текстовом редакторе ,
н апример , Notepad (Бло кнот). Но в оболочке Visua! Studio 2005 это
,
в.м. СН"",,,В Програм ", ирование на ASP.NET

делать намного удобнее, тем более , что работает п одсказчик кода


IntelliSense и вы п ол н яется автоматическая проверка кода н а нал ичие
синтаксических ошибок.

в процессе п роектирования оболочка может, по мере надобности ,


создавать е ще ряд конструктивно н еобходимых каталогов и файлов в
н ашем Web - саЙт е . Но папки можно созд ать и самому, если в So lution
Explorer на узле сайта вызвать ко нтекстное меню и выполнить опцию
Add ASP.NET Folder (добавить папку ASP.NET)

,
В.М. СН"",,,В Про грам ",и рование на AS P. NET

Sоlutюп Explorer - С \ .. \WebS,tel\ ... -j:o Х


'{]
с
ct
о
~

App_Data ~ ВUild Web Site


~ D€fault.aspx PubUsh Web Site
~ Web.Conlg
~ WebSitel.sln
tJJ Add New Item".

D Add Exis1Jng Item


New FoIder

ВП Add ASPJEТ FokJer ~I


Арр_Сodе Add Reference ...
Арр _GlobalResources Add Web Reference ...
Арр _LocalResources Щ Vi€w Сlзss Diagram
Арр _WebReferences Щi] Сору web Slte ...
App_Browsers Start Op1Jons".
Тheтe
~ Vi€w in Browser
Sro\ll!se With".

rnJ Rе1Теsh FoIder

~ Cut
Сору

~ Р.зstе

li6J Ргорегч Р ages

в проводнике ком п ь ю тера можно за й ти в каталог

Мои докуме н ты fVi5ua l Studio 2005IP roj ectsIWebSitel

и ув и деть там д ва од н о и ме н н ы х фа й ла проекта


в.м. СН"",,,В

I
~WebSltel

Fle ЕФ v'ew !avcrtes ТOOIS нф


"'Вжk ~ ..... !!J rA Se:.-ch ~ Fdders

Addess f-J l!I!mIIII


---- --,. П рограм ", ирование на

:::J f'G:!
AS P.N ET

_~_""ID I~

,СШJN1 ,,1

в этих файлах среда разработки хранит текущие настройки n роекта


разрабатываемого Web -сайта, точки n рерывания, настройки n анелей
ynравления, отладочную инqюрма ц ию и другие вспомо гательные
п араметры n роекта. Они необходимы только на эта п е раз р аботки и ли
отладки и не нужны для н ормальн ой работы стран иц на
n ромьшmенном сервере , поэтому и хра н ятся отдельно от создаваемых

файлов.

Другое дело - локальные Windows -приложе н ия. Там ест ь обязательный


этап линковки, который собирает отдельные откомnил и рованные
файлы в одну сборку и nрисваи вает им адресные ссылки, поэтому
файлы n роекта с включенными ту,ца ссылкам и обязательн ы. В
п риложениях же типа Web каждая страница комnилируется и
существует отдельно как самостоятельная n ро граммная еди н и ц а, а

п ереходы на ст р аницы указываются яв н о . Поэтому никакой линковки не


н ужн о и н а сай т помещаются только рабочие файлы страниц и кода
п оддержки п ростым ко п ированием. Если же н еобходимо сохрани ть
какую- то действительно важн ую и н qюрмацию , касающуюся всего
n риложения в ц елом , то среда разработки и п ро грамм и ст п омещают ее
в файл web.config, который также является н еотъемлемой частью
n роекта и приложен и я.

Мы в любое время можем удалит ь рассмотренный каталог

Мои докуме н тыfVi5ua l Studio 2005IProjectsIWebSitel

и открыт ь сайт командой File/OpenfV\Тeb Site, указав в окне


в.м. СН"",,,В Програм ", ирование на ASP.NET

Ореп Web Slte ? х

Flle System
~ Select Ihe fO (jer уоо WCflt to 0 jE1 ,
Ffe System
I!J-O A ~JET - ~ I К ю-и-е C ~T Ст>ЕеН •
~ ~,O Larq.Jage C~
!Е-О Lar-qлge С+-+-
Local IIЗ
i!J-О LосlJJгес-r
~
FТF' Site

Remote Site
~-O u~
!Е-О VB,~T - i1J~1ы к »-К8 БарК9iJ Скоп, Ф
~-O Vrзu<ll С+-+- SlJJdioJ ,NET
В-О lМ:B
E;j·D ASP,I\ET
!ЕС! Cmtвlt
u
вС! EX<lmple~
, Ша .М"
~,O Pi::IJJ8S
I!J D [):Jfcu lt
@О Dв1vff2
~o Flash МХ 2004
@-а Flash_pfiJ
GO HT~
I!JD i::OIlS
~· o JavаSс фt
..:J
FoШ: Iс :\Cha Г\ВООk\I"IEВ\.>.SP ,NЕТ\ЕхаЩJles\We!JSitE 1

Оpen CCtxel

и мя п а пки с содержимым саЙта. Но после выхода из оболочки все р авно


будуг созда н ы файлы проекта в указанном месте

Мои докуме н тыfVi5ua l Studio 2005IProjectsIWebSitel

и сохра н е н ы текущие настройки.

При открытии готового Web -приложения , созда нн ого с п омощью VlSual


Studio .NET 2003, с помощью команды FilelOрепIPгоjесtl Sоlutiоп и ли
FilelOрепIWеЬ Site оболочка Vi<;ual Studio 2005 запускает масте р
п реоб р азова ни я Conversion Wizard. VlSual Studio 2005 не поддерживает
добавление Web -страниц старо го формата с использованием п рямой
коман ды
в.м. СН"",,,В Програм ", ирование на ASP. NET

% WebSitel - Мicrоsоft Visual Studio


File Edit View Website Tools Wildow
13 Md New Item ... C1J"I+Shift+A
Add Item". ::tJift+Alt+A

Их нужно открывать через указанные кома н ды FilelOреn!PгоjесtlSоlutюп


или РПеlOреnlWеЬ Site, чтобы вызва ть ма стер пр еобразова ни я

Vi5ual Studio Conver5ion Wizard .1J~J


Welcome to the Visual Studio
Conversion Wizard

тhe soIutbn ог proyoct you с.-е Oper1h;J was created


Il а
preViOJs verSion ofVisua studo, It mustbe
converted to the format used Ьу thiS versiOn. After а
sou tion or апу of its proJects has been converted, it
сап по щег ье ecited, buit, or run Il ргеv iсш
verslOГlS.

If the SШtio:xJ or p-ojoct is uгder SO L.Гce сmП-о , it 001


Ье checked out cutomaticaly шгh;j the conversbn,

---
Ве SLfe the correct SCUce сопП-оl РЩ Iп is actiVe,
агЮ гю 1iIes are exdJsivery c:hecked out Ьу other
users.

d~k Next to proceed.

< РгеУiOи;> 11 ~xt > Firish Cancel


Id
Установки размещения фай лов проекта по умолча нию мож н о изменить
в ме ню оболочки коман дой Тооls/Ор tюns , вызвав окно настройки
параметров
В.М. СН"",,,В Про грам ", ирование на AS P. NET

ОрtlOПS
"*iIiJ

-"
~ -- Envirrnrnent Visual S!L.dOJ р; ор;:tз b:atm :
I,КОО. З87ХВ87DА244ЕЕ\W'" Щ gMМiW@itii"', "ЩФiD ~
Add- n;Ма cros Securiti
AutoRocover
1 4ЕЕ\М:<1 дС»И3Нты\Visual SW OJ 2005\ТеЩJ~tes\Ргор;:tтеЩJ~tes ~
Fm ar.::1 Реросе
Visual S!L.d OJ LSer item te"l'~tes
Frnts ,.--,j Co crs
I2448Е'МJи Де><уМЕ!Нты\Visual S!L.d OJ 2005\Те ЩJ~tes\ItemТе ЩJ~tes ~
I ~t ar.::1 Export Setth;)s
р А~ЩS smw Errcr List if b.J i(J finisГes with errct's
InternatOтia I Settщ s
Keybo<f-d Р Tra:k Active 118т n So lJtm Exp crer
9"'< Р SOOw ad\Iar.::ed bui(J coofg.rat ions
Тaзk List Г A~ays smw so u tm
Вrowser
Р Save rew p; op;:ts..tJen created
~- Projocts ar.::1 So U1:ions
Р "',..-п user v.t.эn tt-.з prop;:t b:atm is оо! 1rusted
$-- 5с...-се Crn1rol
i!J-- Тех! Editcr Г stюw оuч:out wr-dJw v.t.эn bJ i(J sta.-ts
I!J- Вusiness Intellqэncе Оезg:-вз Г PrO"l't fa- syrrbol O:: г"""m O:--<j Yvt.эn гюаm O:--<j fies
~- Оаtabзsе Tools
i!J- Debo...щ Щ

ос C,.-,cel

• IJ$Откройте диалоговое окно Тооls/Орtюns на вкrщцке Projects and


So lution и выберите размещение файлов реше ния в папке над
катало гом вашего сайта WebSitel, чтобы на этапе разработки все
было под рукой. Измененное окно должно выглядеть примерно
так

I!]- Env r-mrre!lt


13- РГ О )8' tз ,.--,j SO u t O"1S

I"~~\ii ' ~'~W~'~Ш~'i;i"~О~""i'~'~""'i'"~'~';;;;;i;----:::::::d


Bu ikJ ..--.d RlI'l
v6 DEf,"-,~ С :\Сha r~\WEБ\t..SP.~Т 2.0'Exa"flJ les ~
УС ++ Dr-octcries
УС ++ Ргор;:! Se:tO:--<js
I!]- Scи се Crn1rol
,'1[C
":\Cha
"'"'c';wcc' o"'""'c'"Cm
r~\WEB\t..sp.~, ioooc"V""c"' "o;c;o;---------.~
2.0'Ex""l'ies
I!]- Т ех! Ed l1D:'
I!J- в.."; "., ,, Iпt<II g.--к:. o.,,; g--..-, '" А !"щs smw Errct' List f bJ (J fnisOOs wil!l юct's
I!J D,bbOlGQ ,00" '" Tra:k Act",e 118т n So utrn E",trer
1iJ DЮ.m1lJ '" 9-.:rw iid"<,"oo bJ i(J cmfQXat&!s
Tools
I!]- Оеу о: е Г A .... ~ j< <how "",Utm
I!] НТм. Desg-e-
'" S,v~ "'''.. p:o~..t..n cr.~tod
I!]- WrriJws Fct' ms Desg-e-
'" \II.""n l!OOr ~ th<> р:а",,! ba>trn '" not 1rL>3ted
Г Show CVpu\ wndow whe<-1 b." il:J ,\y~
Г PrО ЩJ\ fu- 'Jrтbo I O: г"""т ~ ",г.,., г~ "",, т ~ л."

о< Car>:EI

Теп е рь служебные файлы решений и отладки оболочка БУдет сохранять


В.М. СН"",,,В Програм",ирование на ASP. NET

вместе с рабочими файлами ст р аниц. Но это плохое ре ше ни е, потому


что файлы настройки нужны нам на том компьютере, где мы создаем
проект. Выходным же п родуктом проекта являются файлы в каталоге
сай та, именно их мы должны размещать на сервере. А туг еще будуг
болтаться какие- то вспо могательные файлы ре ше ний и отладки. В
любое время мы можем автоматически создать эти файлы , открыв в
оболочке пр оект как каталог саЙта. Мы не должны о них заботи ться -
какая на м разн ица , где они хр анятся , лишь-бы запоминали текущие
настройки среды проектирования и режима отладки.

:.. С: \Chair\Book\WEB \ASP.NET 2.0\Examples\WebSitel


File Ecit V~w Favorites Tools Н€lp
~
.;? Ваа ... -+т I!J ] ~ S€arch ~ FoIdeгs 0 1~ q,
х "" 1ElT I
AMess IS C\ChalГ$ook\WEB'J\SPNEТ 2.0\Ехаmpes\wеЮtе 1

D lШ
--~
--~
~ [;J ~
App_Data Default. aspx Web.Conlig WebSitel,sln WebSitel,suo

Процесс разработки страницы

Оболочка предоставляет инqюрмацию о странице в трех видах:

1. Графический режим Dеsigп Web-конструкто р а (Web-дизайнера)


2. Режим Sошсе исходного HTML - КОАа (режи м дескрип тор ов)
з. Режим кода подце ржки С# ( Code View )

Процесс проектирования страницы сводится к перета скива нию (и ли


д войным щел чком) нужных элем е нтов управле ния пользовательского
и н терфейса из панели ин струме н тов Toolbox на Web -форму и
настройки их п араметров в пан ели свойств Properties. После (и ли
совместно с ... ) размеще ни я элем ентов управления на Web -форме
выполняется создание обработчиков событий и напи са ни е их кода.

Все три режима до пускают редактирование и являются

взаимосвязанными . Изменения в одном из режимов немедлен но

преоб р азуются оболочкой в изм ен ен ия в д ругом режиме. Так


В.М. СН"",,,В Про грам ", ирование на AS P. NET

помещение элеме н та управления на форму в режиме Design немедленно


при водит к генерации соответствующего НТМL-кода в режиме Sошсе . И
наоборот, ручное написание дескрипторов в режиме Sошсе
равносильно к помещению элемен та управления на форму в режиме
Design. Настройка свойств элемента управления эквивален тн а
доб авлению соответствующих атрибугов к дескриптору НТМL-кода
элемен та, и наоборот...

Редактор НТМL-кода теперь н е изменяет код разработчика , размечает


ЮJючевые фрагменты цветом , генерирует подсказки с пом ощью
механизма IпtеlliSеnsе и автоматически форматирует текст отступами.
Режим авто матич еско го выравнивая НТМL-кода устанав л ив ается в окне
свой ств среды на стр ойками НТМL-редактора с помощью опции Format
НТМL оп paste (Форматировать НТМL во вр ем я вставки)

ОрtlOПS

I
Misc81~OCUS нтм.. ~ t o:m

a:-.:J So u t io:"!s f7 Auto!D 8"""""tз rn p.зste n Scu"C8 view


f7 Fспnаt нтм.. оп p.зste

-"
, Fi~ Е~tens оо
$ AII L"'"'F"ges
i!J Вдs o:

i!J CI
$ c;I:++
i!J css

-"
9 НТм..

, TdIbs
",m'
г "МЩi§.og
V"ldat oo

$ P~ " Text
i!J SQ.. Scr " t

ос C,.,cel

Отформатировать отступы можно и так:

• выделить курсором нужный блок кода


• выполнить командУ Fопrnt Sеleсtioп (форматировать выделенное)
контекстного меню НТМL-редактора
в.м. СН"",,,В Програм ", ирование на ASP.NET

EJ < html xmlng = rrhttp://'W1JJIiJ _wЗ _org/ 19 9 9/xhtml rr >


<head runat =~5erverrr>

<title >Untitled Page<! title >


<! head >

Cut

Сору

Paste
Paste Alteгn.ate

Х D~ete

View code
I!l View il Browseг
Synchronize Document Outjine
Fcxmat StЭect:ioп
Forma1jjng аnd Validation

В отли ч ии от п ред ыдущих верс и й Visua! Studio 2005 н е поддерж и вает


сето ч ный режим р азметки для аб с олю тн ого п ози ци о н и р ования
эл е мен тов управл е ни я с п омо щью вне шн ей CSS (Cascading Sty!e Sheet -
ка с кадн ая табл иц а сти лей) . Вместо этого и с пользуется более
естествен н ый потоковый р ежим разметки , пр и котором содержимое
может выстра и ваться по вер т икали без на п олза ни я. Жесткое
п озиц и о н ирова ни е в ып ол н яется с п омощь ю встроенн ы х сти лей
дескр ип то р ов , но такой пyrь не р е комеН дУется как громоздкий и
н егибкиЙ. П ри мер жесткого п оз ици онирова ни я с п омо щью встрое нн ых
стиле й:

< аsр:Вuttоп I D='Ъ tп"


sty!e="position:absolute; !eft:auto; top:auto"
nmat="server" Text="Button" />
в.м. СН"",,,В Програм",ирование на ASP. NET

Общее управление файлами проекта осуществляется в пан ели So lution


Explorer. В ней распознаются различные типы файлов, входящие в
про ект (изображений, НТМL , CSS, баз данных и д р.) и вы даются
разные контекстные меню дл я их обработки. В этой панели можно
п ереименовывать, удалять, перемещать , добавлять новые или
копировать существующие файлы. С уществуют следующие типы файлов
ASP.NET

Типы файлов ASP.NET


Файл Описание

Содержи т пользовательский интерфейс и (необязательно )


*.aspx базовый код приложения. Пользователи запрашивают одну
из таких страниц напрямую или запускают приложение

Пользовательские элементы управления, похожие на Web-


ст р аницы, только к ним нельзя получить прямой доступ.
*.ascx
Они используются при построении страниц подо бно
библ иотечным элементам.

Web -сл ужбы, работающие не так, как Web-страницы, но


*.asmx совместн о использующие одни и те же ресурсы

приложений , параметры конфигурации и па мять.

Основанный на XML конфигурационный файл для

we Ь .соп fig
конкретного приложения , содержащий настройки
безопасности , управления состоянием , памятью и др .
Создается оболочкой при создании первой страницы.

Глобальный файл при ложения, который можно


использовать дл я определ ения глобальных п ереме нны х и
gIob а Lasax
реакции на глобальны е события. Его н ужн о создавать
самому разработчику при необходимости.

Файлы скрытого кода на С# (застраничны е файлы). Они


*.cs позволяют отделить функциональность приложения от
пользовательского интерфейса страницы.

Управление ссылками на сборку

Для но рмальной работы приложения среда про ектиров ания , как и среда
выполнения , нуждаются в б и бл иотечных файлах и ссылках на ни х. По

"
в.м. СН"",,,В П рограм ", ирование на AS P.N ET

умолчанию ASP.NET создает небольшой набор ссылок на библиотечные


сборки .NET, доступные всем Web -страницам. Э ти ссылки
размещаются в специальном конфигурационном файле, доступ ном в
пределах всей машины. Для использования массов в этих сборках не
тр ебуется никаких cnециальных действий.

Основные сборки для страниц ASP.NET


Сборки Описание

Содержит базовый набор типов данных


библиотеки Framework, р ас пространенных
mscorlib.dll, System.dll
типов ИСЮJюч е ний и большое количество
фундаментальных строительных блоков.

Содержи т массы для чтения и записи


конфигурационной информ ации из файла
Systеm. Со пfigша tiоп.dll
web.config, ВЮJючая пользовательские
настройки.

Содержи т массы контейнеров данных для


System.Data.dll ADO.NET вместе с источником данных SQL
Server.
Содержи т массы для управления в GDI+
System.Drawing.dll цветом, шрифгами, кистями и др . , что может
понадобиться для построения графиков.

System.Web.dll Содержи т н еобходимые массы ASP.NET


Содержит массы для по строения Web-
служб (элементов удаленн ого стороннего
System. Web.Servk:es.dll
кода для частичного решения типовы х

задач).

System.Xmldll Содержи т массы для работы с XML

System.Е пtегрпsе ervк:es.


. S . dllСодержитмассыдлятакихслужБСОМ + ,
как тран закции (объединенные операции).

Содержит массы для мобильных элементов


управления при доступе в Web ч ерез
System. Web.Mobile .dll
небольшие устройства тип а сотовых
телефонов .
в.м. СН"",,,В Про грам ", ирование на AS P. NET

Дополни тельны е ссылки на н ужные сборки до бавляются в файл


web .config командой Website/Add Reference... С ист ема предоставляет
диало гов ое окно

dd Reference

,NET Iсом I Projocts I вroт8 1 R8C8l1t I

,""" 7,0,3300,0 vl,0,3705 c:lprogram Fi es\lv1 t ros"

~"""
7,0,3:DJ,0 vl,O,3705 c:lfrogram Fies\Comm"
sysg ru l 2,0,0.0 ~2,0,50727 С:\WINNТlf.1iсгosoft,r-.E"
Syst8m 2,0,0.0 v2,0,50727 C:\W INNT\jI-1iсгosoftr-.E"
Syst8m,Cm fg..ratrn

Syst8m, сер tr,-m8llt 2,0,0.0 v2,0,50727 ,


Sуst8m,Des ф 2,0,0.0 ~2,0,50727 С: \ W INNTlf.1icrosoft, r-.E, ,
Syst8m, DiroctJJy5ffvic8S 2,0,0.0 v2,O,50727 С :\WINN"ТVv1icrosoft r-.E, ,
Syst8m, DirectJJyService .. 2,0,0.0 ~2,0,50727 С: \WINNTlf.1icrosoft, r-.E, ,
System,CXa+lh;J 2,0,0.0 v2,0,50727 С :\W INN"ТVv1icrosoft, i'I:, ,
Sуst8m,СХаwing.Desф 2,0,0.0 v2,0,50727 С :\WI NNT\jI-1iсгosoft, r-.E, ,
- - -----

еж Cct"lCel

и после выбора нужной сборки (одной или нескольких) в файле


web .config появится ИН Д ИВИ дУальная для нашего сайта информация
(блоки комментариев )'Далены)

<?xml version="l .O"?>


< сопfigшаtioп >
<app Settings/>
<connectionStrings/>
<system.web >
<compilatio n debug= ''true''>
<assemblies>
<add assemb ly="SystemData.OracleClient, Version=2.0 .0.0, Сultше= пеut
</assemblies>
</compilation>
< а итепосаtioп пюdе= ' Windоws "l>
В.М. СН"",,,В П рограм ", ирование на AS P. NET

</system. web>
</сопfigша tloп>

При ПОДЮJючении сторонней сборки, н е входящей в глобальный кэш,


оболочка создаст каталог Вin, куда физически скопирует
соответствующий файл dlL Например, при выборе ссылки
SystemData.SqlClient создается каталог Вin и в н его копируется сборка
SystemData.SqIClient.dll, а при выборе SystemData.OracleClient создается
ссылка в конфигурационном файле.

Не п угайте импортирование прос транства имен оператором using в


файле .cs и добавле ни е ссылки на dlL Прописывание пространства имен
по зволяет использовать в коде С# короткие и мена ЮJассов, а сборки
указывают компилятору и среде выполнения локализац ию

(местонахождение) используемых библиотек.

Возможность добавления сборок в конфигурационный файл и их


удаления имеется еще в одном месте оболочки - в панели So lution
Explorer. Если для узла проекта вызвать контекстное меню и выполнить
команду Start ОрПоns ...
В.М. СН"",,,В Програм",ирование на ASP. NET

Solut:ion Explorer - С \ ... \Web ....... ~ Х

PubI,sh Web ~te

Add New Ite т ...


Add Existing Item ...
New Folder

дdd ДSР,NЕТ Fold€r ~

Add Reference ...


Add Web Reference

.Q. View Class Diag-am

Iii Сору Web ~te,,,

sta"t

~ View in Вrowser

Browse Wi1Л ...

lI] Retresh Folder

~ Cut
Сору

Paste

li:iI Property рзgе,

ТО п ояви тся о кн о уп р а в лен ия сбо р ками


В.М. СН"",,,В Програм",ирование на ASP.NET
С Ch.:!lr\Oook W[O \АЗР.r-a::т 2 О\[хшr"l~s WebSlt~l \ Prop~rtv Paq~s зJ~

R.t.-=.
BLМ
Acc.ssbllty
SШ- t qotкrJ>
r~SВ uld 0;:U:rIS

Add Ref",erJC8" Rerm'e

Выбор используемого стандарта НТМL

Большинство серверных элемен тов ВЮIaД КИ Standard ген ерируют


НТМL-код современного стан да рта ХНТМL и сам НТМL - редактор п о
умолчанию так настр оен. Но имеется возможность на строить оболочку
на соб л юдение д р угого стандарта, например чистого НТМL4.01 . ДЛЯ
это го щелкните на пустом месте пан ели ин стр ументов BBep>g1 окна

интерфейса и включите инструменты НТМL Sошсе Editing


В.М. СН"",,,В Програм",ирование на ASP. NET
" .. WebSltel - Mlcro!>oft Visual Studio
Fle Ed t \f~w Website ВU l d Detug Тodз Wird:)w Сот mm ty нер

ыщ

= '% ------,'1 ~
'!Г

Clст Desgner
Оаш Design
DаtaЬзsе Dlig-am
Derug
ОЮJg Location
Oewe
Olibg Editor
Formal:trg

Image Edtor
Laywt
QU<:!Гy Designer
Report В<xders
Report Formal:trg
S:::oJrce CmlIoI
stcnJ.ard
StyI<:o Sh:et
Table Desi g-er
Text Editor
\fiew Desigler

XГVL Dаш

хм... Ed tor
хм... Schema
Customi:ze"

Затем из выпадающего списка появившегося блока инструментов


на стройте редактор оболочки на проверку достове рности нужного
стан дарта.
В.М. СН"",,,В Програм",ирование на ASP.NET
'у.. WebSitel - Micro"oft vi"ual studio
Fi ~ Ed t View Website Вu ld DetU;J Toof5 Wn::bw Comm Lrity ~

QJ T Id fI J! It\ 1'" т !" т ~ ыщ • ~~~ ItJEJ T_


1] ~~ I ·:; a

~~~
" ~=~6'O~~~ Page
~tsc~ Navф tcr 3,0

в <5cr:ipt r:unat =
I pr:otected vо EJ~~~~Wl~~ct-,~~с,с,"~~Ig'-ет--~

По умолча ни ю все серверные элеме н ты управле н ия ASP.NET


автоматичесЮ1 используют разметку стан дарта ХНТМ L . ДЛЯ то го , чтобы
заставить элеме н ты управле н ия ген ерировать ч и стый НТМL , нужно в
н ачале ст р аницы встав и ть блок (в VS-2008 нет тако го атрибуга)

<system.web>
< xhtmlllСопfоrma псе е паыeьs оl еtеR епdегiпg="truе" />
</system.web >
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Введение в Web-сайты

Установка 115. Типы проектов и места их размещения.


Зарезервированные папки АSР-проекта. Создание Web-саЙта .
Настройка параметров при ложен ия через ко нфи гурац ионны е файлы .
Создание файла web .config. ВЮlючение трассировки и ее настройка.
Совмещенная трассировка страниц. Отделенная трассировка страниц .
Секц ии трассировочных да нных. Отложенная компиляция Web-
страниц.

Для реал изации технолоrnи удаленного доступа к информации


создается сеть компьютеров , на одни х из которых размещается

инфо рмация в виде ор ганизова нн ой системы файлов , а другие


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

Компьютер, который запрашивает нужную июlюрмацию с сервера ,


назы вается Юlиентом. Программа , обесп ечивающая взаимодействие
Юlиентского компьютера с сервером, на зывается броузером (браузером).
Чаще все го име нн о броуэер считают Юlие нто м с точки зрения
пр ограммистов.

Взаимодействие Юlиента и сервера пр оисходит по схеме "за прос-ответ ".


Первый запрос Юlиента считается простым (GET), при этом н а сервер
п ередается только URL зап р ашиваемой страницы. Если пользователь
пр одолжает нач аты й сеанс с сайтом, дви гаясь по нему
пр едусмотр енными на стра ниц е средствами навигации , то каждый
п оследУЮЩИЙ запрос к серверу называется обратной отсылкой
(PostВack) . Обрат н ая отсылка обычно осуществляется методом POST.
Обратную отсылку сервер распознает, обрабатывает присланные с ней
событи я и формирует ОТЮlик .

Мы должны понимать прин ципиальное отличие при ложения


локального стола от Web-приложения. Локальное Wiпdоws-прuложе нu е
реагирует немедленно на действия пользователя , вызывая
соответствующие обработчики. ОНО имеет ви довое представление ,
которое меняется н емедленно. В Web-приложении по суги каждая
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

разрабатываемая ст р аница уже является приложением , п оскол ьку


компилируется в отдельную DLL-б и бл иотеку, хотя взаимосвяза нны е
страницы в ц елом принято считать Web- при ложе ни ем. Се р ве рн ая
страница н е и меет ви да, хотя н а эта п е проектиров анuя дл я Удобств а
разработчика она и меет примерный вид в конструкторе оболочки.
Серверная страница т ольЮJ с посо бна сгенерировать вид и отправить
его удаленному поль зователю.

Web-приложение размещается на удале нн ом сервере и может


реагировать на де йс твия пользователя пр едусмот ренны ми
обработчиками тольЮJ т огда, когда получ и т от броуэера обратную
отсылку В н ей БУдет упакованы не только состояния элемен тов
управления на момент п ослед него откл ика , временно сохраненные на

кли е нте , но и новые изменения, в ключая события , которые пр оизвел


удаленный кли е нт н ад посл едни м откликом. При пол уче нии на се рв е ре
обратной отсылки Web-приложение сначала восстанавливает элеме н ты
управления до состояния , которое они имели на момент посл еднего

отклика. Затем прило же ни е р еа гирует на при слан ны е события и


доводи т состояния серверных эл ементов управления до уровня , которое

они имели у клиен та перед обратной отсылкой.

<html>
<head >
< titlе >Uпtitled Dо с umепt </titlе >
< mеы http -еq illv= "Со пtе пt-Туре" content=''textlhtml; charset=windows- 1251">
</head>

<body>
<h2 аlign="сепtег' '> Страница с об ратн ой отсылкой</h2 >
< fо пn паmе ="fопnl " method="post" action="">
<center>
<input type="submit" name="S ubmit" value="Submit''>
</center>
</foпn>
</body>
</html>

Листинг Пример статической страницы Default.htm с обратной


отсыпкой
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Запрашиваемые страницы , которые не требуют п редварительн ой


обработки на сервере, а сразу отсылаются клие н ту в н еизме нн ом виде ,
н азываются статическими или п ассив н ыми. Они имеют расширение
hunl или htm, что равнозначно. С траницы , которые п редварительно
обрабатываются н а сервере специальными программами и ген ер ируют
н ужн ый код на языке НТМL для отправки клиенту, называются
активными. О ни имеют ра с шир е ние asp, aspx, php , cgi и т. д. В
зависимости от того, какой пр о граммной средой они долж ны
обрабатываться.

Отправляющая и приним аю щая сторо н ы работают согласованно п о


определенным пр ав и лам, определяемым протоколом Н1ТР.
Отправляющая сторона делит пер едаваемую инqюрмацию н а отдель ные
еди ницы , которые называются пакетами (п ачками). Каждый п акет
имеет н екоторую служебную инqюрмацию, п омещаемую в его
за головок. В заголовке может содержаться размер пакета, его номер и
контрольная сумма .

и дет сеа нс
( сессия )
г--
Запрос / GEТ
" Запрос
а..
w ОТклик"
) Паkеты
< ОТклик
(')
m
м Il. /
::J:
1- "tJ
~
-1
1-
::J: Обратная Обратная -1
"'tI m
а..
ОТСЫЛr.:з/ POST ,ОТСЫЛr.:з
m
LO
~ отклик"
) Паkеты
<
/ ОТКЛИК
"tJ

Принимающая сторона получает пакет, распаковывает его и по


за головку п роверяет, не ПрОИЗОlllТIO ли потери дан н ых при п ередаче

п акета . Если потери да нных не обнаружено, то приним ающая сторона


отсылает об этом подтверждение, в противном случае отсылается
команда с требованием повторить пер едач у соответствующего пакета .

"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Пакеты доставляются по разным пугям сети, используя любой


включенный в данный момент в эту сеть компьютер как

вспомогательный п ромежугочный узел.

Устан овка IIS

При разработке Web- п риложения


115 (lntemet Information требуется
Servk:es), который эмулирует работу сервера . Среда разработки VlSua!
Studio 2005 имеет свой встроенный (интегрированый) упрощенный IIS ,
но иногда может потребоваться настоящий IIS о п ерационной системы .
Если 115 на вашем ком п ьютере уже установле н , то на д иске С:\ должен
существовать каталог IпеtрuЬ , в п ротивном случае его придется
установить . Для установЮ1 IIS выполните следующее

• u;.;rвыпол ните командУ компьютера ПускlНастройкаlПанель


управления

C!:I Пан~nь управления

A_
= ral:e< ""~"
Corfipotrn
Irt~R )
Едсе "
Irt"""",
""~ ,--
А "тс..."н " А д "",,-,::т р " Дат" н "Р"Н"

~~
.%"
..,."' Т ЖМ",
~-
~
y cт po:k T ",
~
К-""-"т у ра -, 'о
~-
~
'М-"К1
Q;,
"_.
Г'оо"Ь>О<оОТ "
(о)
~"

c\f [ii@J ~ ~ 1Ь1 ~


C Mik ," ~

~"
Сеть "
YA'neнны1 "
С "" "Т е",,
,-
CK_r-ы " C""ц "~JЪНЫe
00ЗЮ)о(НОСТ Н
Те,,"фоо "
~,~

~
,~ ,
[&]
_О"
11
х"
~
Э"е""pont1 " ,-"
С Тi>t<Д "l' ТЫ

• r;:;'щелкните по п иктограмме Установка и удаление программ


• ~ открывшемся диалоговом окне в левой части щелкните по
кнопке
в.М. С""",,,в

... :"81·
~ .•
добаВЛ~~I1Е! И
удаленне ~I
KO~OHeHTOB ~
Про,раммupoвtJNШ' 110 ASP.NET

Windows ,~,

• ~Откроется окно, в котором по ставьте отметку против


компо нента II S
Мастер компонентов Wшdоw"i

Компоненты Windows
Вы молсете дооаеить ИJlI.i lJ\ал.IIЪ KOМ'lc.1eнты Windovvs 21]00

ЧтOCibI дo6aeиrь или I:JдalМТb комnoнент~ установите или Cl"l-lrФrТе флаЖОК.


З~~~ ФЛ~ЖОК Оо3Н~Ч~ ч~стиLНjIO ~:ICHIHceK~ ко,,;noнент~, ВыосНИ1"Ь его
состае n03IJОЛООТ KНOffia ''Состав''.

Комnoне
СС~С':'~-С________________________________~~~СО

11Mf1 ...:J
Опvcание СJl\jЖбы 115 (пщцеРJJ:ка 006 и FТР]СГlO,IJД8ржкO!iFrOlltРа.;щ
Т~Ю~ЦИЙ~ cтp~"'-IASP, поо.клlOчеr-и:. к Мз.У>1Д~Х И

т ~lПI H~ диc:r::е ОЛ МБ Сосп~ ...


Cм6QaHO ~ диске: 33415З МБ

• r;:;n осле нажати я кнопки Далее > мастер выполнит установку


компо нента . При этом, возможно, потребуется уста ново ч ный диск
с системой .

Далее н уж но за реги стри ровать систему ASP.NET на локаль но м


компьютере. В каталоге С:\W I NN1\Мk: го sо ft .NЕ1\F гаme wогk существуют
подкаталоги с версиями vl .O.3705, vl.l .4322, у2.0.502 1 5 и у2.0 . 50727, в
которых н аходят ся файлы asp necregiis.exe. Один из эти х фай лов (лучше
по след н ей версии, расположенный в подкаталоге у2.0.50727 ) н уж н о
за п усти ть с опц и ей /i .
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

• ~ыполните кома н ду компьютера ПускlВы п ол н ить и в поле


появив ше гося окна введите команду спЮ.
• Г;;:;=Используя команду cd (change directory - смена каталога)
перейдите в один из указанных катало гов и выполните в н ем
командУ

aspnet_regiis.exe /i

• ~ pOBepЬTe н аличие каталога I пеtр uЬ и подчиненных ему


подкаталогов

=- Inetpub
---------------------

' File EdiI: lJiew Favorite5

~ ~ck ~ .; • [!J ~ [\ Se~


Addre5s 16 IГtetpub
AdminScrip ts
ftproot
iissamples
mailrool:
5cripts
~Ьрш
VoIWwroot

Здесь каталог wwwroot эмулирует корневой каталог Web-дерева .


Все файлы , которые будyr в нем н аходи ться , будуг недоступны для
удаленных клие н тских ком п ьютеров, п оскольку защищаются

сервером.

Типы проектов и места их размещения

Для создания ново го Web-сайта (по старому - Web- п риложе ни я) с


п омощью инструмента VlSua! Studio 2005 нужно выполнить команду
меню File/N ewlWeb Site. Появи тся ди ало говое окно, в котором
п редусмотрены три типа Web-приложений:
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Ne\·, Web Slte .1J~


Terrp~tes:
111 "
q
~ ~ \!с# ~
A5',f.ET '1'100 ASP JU '1'100 Persmal '1'100 ЕЩJЦ '1'100
5ite 5".,-, ;:" 5ite S З; ter Kit 5ite

Зе",ф 01 1,...,
Terrp~tes",

1. File System - используется для р азмещения всех ком п о н е н тов сай та


в файловой системе ком пью тера разработчика. Для тестирования
такого тип а сай та используется встроенный (инmегрированый) в
оболо ч ку облегченный сервер , а не полноценный IIS локального
компьюте р а

2. Н1ТР - сай т р азмещается в указа нно й п а п ке ПQЦкаталога wwwroot,


находящегося в каталоге lnetpub (при условии, что на компьютере
р азработчика установле н llS ). Используется не встроенный в
оболо ч ку упрощенный сервер, а сервер ком пьютера.
З. FTP - этот вариант чаще испол ь зуется, когда Web-сай т р азмещен
на Удаленном ком пьютере и разработчик обращается к файлам и
папкам этого сай та через FТP, а не ч ерез FrontPage Server
Extensions (Администратор серверных расширений)
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

7т FPMMC - [Console Root\FгontPage Seгveг Ехtепsiопs] =-.JgJ~


JI.~ KoН(:orь Qкгю ~гpaBк.a J D ~ l1li 11[1 =-.J!2l~
ю !lеЙСТ6И€ I).ид Uзбр,,"ное Ы
I
Структура Избражое I КOМlьют е

[] З87ЗС887DА2448Е
CJ COIlsole Root
I±Н:З Fron1:Page Server ExtenslOnS

Далее мы будем использовать п ервые два типа проектов . П ри создании


н оваго проекта Web Site оболочка создает катало ги и файлы в трех
местах:

• Файлы решения на этапе проекmuровйнuя. Два файла с


р асшире ни ем .sln. и .suo, необходимые для работы самой оболочЮ1 ,
БУдУГ размещаться в катало ге Мои документы \Visuаl Studio
2005\Projects. Первый файл является текстовым файлом ре шения ,
в торой соде р жит п ользоватеЛЬСЮ1е настройЮ1 решения . Э ти
файлы нужн ы на эта п е р азработЮ1 с помощью оболочЮ1 и
на п рямую к будущему р азвертываемому сай ту от н ошения не
имеют, п оэтому и хранятся отдельн о от самого сайта
• Содержимое саЙта. Каталоrn и файлы исходных текстов самого
сайта, ВЮlючая файлы страни ц , баз данных, ресурсов, н астроек
конфи гура ци и. Они хранятся для проекта тип а File System в
указанном катало ге , а при установле нн ом IIS для п роекта типа
Н1ТР - в катало ге Iпеtр uЬ\wwwroоt\Имя_сайта
• Рабочие файлы сай та для АSР-машины. Каталоги и файлы ,
создаваемые ASP.NET-средоЙ, ВЮlюч ая скомпилирован н ые сборЮ1
.dll для пр и ложе ни я и отдельн ых стра ни ц . Они хр анятся в
системном каталоге

"С:\W I NNТ\Мiсгоsоft.NЕТ\Fгаmеwо гk\v2.0.50727\Теmрогагу


ASP.NET Filеs\Имя саЙта". Э ти каталоrn и файлы после
завершения раз р аботЮ1 можно уничтожи ть. Он и не нужны для
раэверmывйнuя на рабочем сервере
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Зарезервированны е папки АS Р-проекта

Содержи мое сайта может храниться в любом кол и честве вложенных


каталогов, но и ме н а 8 п а п ок счи таю т ся зарезервированными

Pubish Web Site


Add New Item".
Add Existing Ite т."
New Folder
Bin Add ASP.tEТ Folder ~

App_Code Add Reference."


Арр _GIobalResources Add Wm Reference".
Арр _LocalResouгces .Q View Class Diagram
Арр _WebReferences
~ Сору Web ~te ...

App_Data Start OptiOllS".


App_Browsers
I!l View in Бrowser

_т е
Bгowse Witll.,.
Re1Yesh FoIder

Cut
Сору

Paste

Property Pages

Кроме то го, что АSР-машина и щет в них необходимую и н формацию ,


она же защищает и х от прямо го доступа Удаленно го пользователя. При
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

попытке открыть любую из этих папок (за ИСЮJючением Тheme ),


пользователь получит ошибку " НТГР 403 Forbidden " (- сервер не
поддерживает такие запросы).

Особые папки ASP.NET


И мя п апки О пи са ни е

Содержит ском пи лирован ные сборки .dl/, н а


Вin
которые ссылается приложение

Содержит файлы .cs исходного кода ЮJассов,


компилируемых с приложением

G1о Ь а lR еsошсеs
Содержит файлы ресурсов .resx и .resources,
Арр
- компилирующиеся в глобальные сборки

Содержит файлы ресурсов .resx и .resources


Арр_LосаlRеsошсеs отдельных страниц , пользовательских элементов

управления или мастер-страниц

Содержит файлы Web-ссылок .wsd/, .xsd, .disco,


Арр_ WеЬRеsошсеs
.discomap
Содержит файлы да нн ых пр и ложен ия .mdf и .xml
Содержит файлы о п ределения броузера .browser,
которые ASP.NET использует для определения

верси и броузера и его возможностей

Содержит стилевые файлы для страниц и


Theme
элементов управления

Создани е Web- сайта

в качестве упражнения создадим с помощью VlSual Studio 2005 простой


Web-сай т с именем MyFi r s t Si t e .

• ~ыберите команду File/N ewlWeb 5ite и заполни те ди ало говое


окно мастера так (место размещения сайта выберите по своему
усмотрению)
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Ne\·, Web Slte .1J~


Ierrp~tes:
111 "
q
~ ~ \!с# ~
A5'J-ET '1'100 ASPJU '1'100 Persmal '1'100 ЕЩJЦ '1'100
Site Sеп о: е Site S З; tE!r Kit Site

Зе",ф 01 1,...,
Terrp~tEs",

Мастер создаст все н еобходимые для начальной работы каталоrn и


файлы в местах, упомя н угых ра н ее.

в nан ели Solution Exp lorer мы увидим файл разметки стра ницы
Default.aspx и файл отделенно го кода Defauk. aspx.cs (застраничный файл ,
фоновый файл поддержки), а также созда нную особую папку Арр_Оаы

Sоlutюп Ехрюrеr -С \Ттр .. '" -j:o х

App_Data
В ~ D€faut,aspx
!J D€fault,aspx,cs

• г;.:.=вызовите в So lution Explorer на папке App_Data контекстное


меню и выполните кома н ду Delete (ил и выделите папку App_Data
и нажмите клавишу Delete клавиатуры)

Оболочка Удал и т n аn ку, которая в данный момен т нам не н ужна .


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

• ~Запустите Проводник Windows и с п уститесь в динами чески


созданный вр еменны й катало г
С:\W I NNТ\Мiсrosоft.NЕ1\Fгаmewогk\v2.0.50727\Теmрогагу ASP.NET
Files\myfirstsite

~523b9284 111
~Edt V'feW Fav<Xltes TooIs НеР

'"' Bock .... ...... i!J I <a Seif"ch ~ Fd:1ers @ [.~ ~ )< ~ J шm ....
Addess I"E; с :\WI~rosoftJ.ET\Framew<xk\Y2,O, 50 727\Temporif"Y АЧ',~ FIes\mуlТstsitе\Збd2а9ю\52::Ь9284
• defiUt,аspх,сdcю7d2_свt>Pes ut,сcu
• defдJt,аspх,сdcю 7d2_cвt>Pes utcomp!<:d
hash, web

Мы видим, что оболочка создала три временных файла:

• .сси - сериализованный н абор объектов исходн ого кода (Code


CompiJe Unit) , которые можно скомпилировать
• .compiled - представляет собой текстовый .xml-фаЙл , содержащий
инqюрмацию для ком пи лятора . Э тот файл указывает, что на
основе Web-страницы .aspx и файла отделенного кода .aspx.cs
создан файл .сси
• hash.web - содержит ютючевое слово хэша Web-сайта для его
кодирования

Теперь мы должны скомпилировать Web-саЙт.

• r;:;'выполните командУ BuildlВuild Web Site и вновь посмотрите во


временный ка талог

Была создана DLL-библиотека .dll, содержащая соб р а нный воедино код


разметки и отделе нн ый КОД, а также создан текстовы й .xml- фаЙ л
.compiled, который содержит н астройки компилятора, примененные пр и
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

создан ии DLL-библиотеЮ1.

• ~Добавьте к сай ту н овую страни ц у. Для этого выполните


командУ Website/Add New Item и настройте диалоговое окно
мастера так

Add Ne\O' Item - С:\ Tmp\MyFlГstSlte\ .1J~


Terrp~tes: 111 "

-

&J
с <ы
r.w lc atL"
D
Мао"" р"'9"


"оо
Crnfg.xati"
~
Wob uoc>r
Cm1rol

••
х м.. File хи
~
н тм.. р"?,,

1m
.. Schema
~
Woo SerV CG

li1
Тех l File
~
C~C

JjJ
P escиce Fi le
~
sty k> ShGGt

1]
SQ.. Database

1m !i]
- , ~ ~. ~ ~ ~
DataSE't
~~
Si"~ ~ ile w eb
Fct"m
VВScrjJt File
"-' JScr " t File

ri=\;" ~' ,811 1,;; Ф .1 R1


I А fu" m fu" WOO "РР l с~tС<\б

Name : I Page2,aspx

L~: IVisual С, iJ р" Росе [ 000 n sEp<f"ate file


Г Select mast8f page

Теперь мы видим , ЧТО во време нн ом каталоге среды выполнения опять


появилась пара файлов дл я н овой стра ницы

~523b9284 _

V~w Favorites TooIs НеР

Back ... ...

• ~ ще раз соберите сайт, выполнив кома нду BuildlВuikl Web Site


в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Новая страница Page2.aspx вместе с файлом отделенного


(застраничного) кода Page2.aspx.cs была скомпилирована в отдельную
DLL -библиотеку и был создан файл . xml-инструкция для компи л ятора

:.о 523Ь9284 _
---------------------------------------------------------------

Компиляция стра ниц в отдельные .dll файлы позволяет исполь зовать


ДЛЯ создания каждой отдельной ст р аницы свой язык

пр о гр аммирова ни я , п одцержив аемый ком п илятором. На уровне DLL-


библиотек это будет совместимый в ц елом код. Компилятор соб ир ает в
отдельную сборку как стра ниц у со встроенным кодом , так и ст р аницу с
отделе нны м кодом.

Настройка параметров приложе ния через

конфигурационные файлы

То, что включено в п роект, п осле компиляци и п ревращается в


при ложение , котор ое БУдет работать п од управле ни ем среды АSР.NЕт.
Режим и с п ол н е ни я п р ил ожен ия о пр еделяется до п олнительными
пар аметр ами среды, которые задаются в конфигурационных файлах .
Конфи гурацuон ные фа йлы представляют собой т екстовые файлы ,
на писанные н а языке XML.

Для на строй Ю1 Web-сай тов используется и ерархия ко нфи гура ци онных


файлов. На вершине это й иерархии стоит файл тас hinе.со пбg, который
находи тся в системном катало ге

С:\WINN1\Мiсгоsоft.NЕТ\Fгаmework\v2. 0.50 727\СОNF I G

Он о пр еделяет параметры среды исполнения .NET Framework в ц елом


в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

для всех типов приложений: консольных, оконных для рабоче20 стОЛQ,


Web- п риложений и библиотек классов. Часть из этих параметров
являются глобальными для ком пьютера и не MOryr быть
п ереопределен ы. Но некоторые MOryr переопределят ься в файлах
web .config, расположенных ниже по иерархической лестнице, причем ,
чем ближе к рабочим страницам на ходится файл , тем больший
п риоритет имеют его па раметры .

Файл web.config, стоящий в иерархической лестнице сразу за файлом


maсhiпе.сопfig, находится в одн ом с ним каталоге. Далее следуют
н еобязательные файлы: файл web.config, расположенный в корне web-
дерева (каталог wwwroot в lnetpub ), затем web .config, расположенный в
корне web-приложен ия (Website н а этапе проектuрованuя) . Наивысший
п риоритет имеют конфuгурацuонные файлы, размеще нн ые в
п одчи н ен н ых каталогах прилож е ния (если таковые имеются).

machine.conf1g
е CONF IG

i
web.-col1ffg
• CON FIG
t
wеЬ .сопfig
е wwwroot
f f
vveb.con'fig vveb.conflg
е wwwroot\WebApp1
... е wwwrootl.We bA ppN

t f

в
web.conf1g
VW!bApp1\Dir1
... е
web.config
WebApp1\D irM
...

При п е рвом запросе страницы сайта исполняющая среда за п ускает


п риложение и создает для н его КЭШ настро е к. Настройки формируются
п о следующей схеме:

1. С начала извлекаются па раметры из файла CONF IG\machine.config


2. Затем доба вляются параметры из файла CONFIG\web.config,
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

переопределяя одн оименные параметры тасhiле.соnfig


з. Если есть wwwroot\web.config, то из него извлекаются параметры с
замещением ранее доб авленных одн оиме нны х параметров
4. Если приложение имеет свой файл web.config, то в КЭШ
добавл яются и оттуда пар аметры , замещая одноименные
5. Если страница находи тся в подкаталоге и там же имеется свой
файл настроек web.config, то его параметры добавляю тся в кэш и
п е реопределяю т ранее введенные одноименные на стройки

Создани е файла web.config

Файл настроек web.config является текстовым файлом с XML-разметкоЙ .


Его можно создать н есколькими способами. Рассмотр и м некоторые из
них:

Способ 1

При первом запуске нового сай та на выполнение в оболочке VlSua!


Studio 2005 командой DebuglStart Debugging появится сообщение

DеЬuggiпg Not EnabIed

Тм page carmt ье rm in dei:u;J rmde b8CEtJSe debuggh;j i:3 mt anabled n th8 Web,coofl;J
file. What would you like to do?

r. АОС! а new WеЬ,шnfig file with debuggh;j 8nablOO,

~ DЮJgo;Jir.;J should ье diS;abled n th8 lNeb,coofl;J file Ьэfcr8 ЩJlоуir.;J th8


web sit8 bJ а p'c.dJction вn .. r onrrent.

r Rm wнtrut debuggn g. (EQJivalent bJ C1TI+F5)

ОК CEi1cel

предла гающее добавить новый файл web .co nfig с о пци ей включения
отладки. Ниже БУдет пр ед.УПреждение, что п е ред развертыванием
отлаженного прилож е ния эту о пцию в файле настроек следует Удалить .
Щелчок на кно пке Ok заставит оболочку создать web.config в корне

"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

текущего приложения (но не в корне Web-дерева).

Способ 2

Можно воспользоваться угили той Web 5ке Admirllstration

• Г;:;=Создайте новый сайт или в п режнем сайте удалите файл


web.config
• ~ыполните командУ оболочки Website/A5P.NET Сопfigшаtioп

Появится рендеринг (в и зуальное представление) страницы


appConfigНome . aspx
В.М. СН"",,,В

"" ElIt """ F,,,,,, и Тcx:tз нар


t:t 3
------."
..
,,"~K ~ ... ~ ~ 1) ~ ~S.""h (ij f.vo,,,,,, ~~","'" (J ~~ ;;,1 т
/.(\(fess ~1~h::<;t: 1Ш315'_'-- оЬd'nfi'o:L~On'JI~m<~..!....-
,~

Нome Securit)' Appllcatlon 1l"


""'""'O
""'''c.._ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _..

U~e thi~ раае to configure your application with values t hat you do not V'lant
to ha rd -code into your page~, епаЫе your application to ~end e-mail,
configu re debugging, set up а default еггог page, and stop ог start your
applici'Jtion.

ApplicatlOn SMTP Settings Application Status


Settings Confiqure SMTP е mail Application is: Online
Exi~t in g application settinas
settings: О Take applicatjon
offline
Crei'Jte applici'! t ion
settings Debugging and
Мапааеа~ Tracing
settings
Configure debugging
a nd tracing

Define dеf<щlt еггог

""'"
.1

• ~становит е ВЮIaДКУ Application и щелкните н а сс ы лке со пfigше


debugging and tracing

Запустится страница DebugAndTrace.aspx, которая сгенерирует


следУЮЩИЙ ОТЮlик
В.М. СН"",,,В Про'раммupoвtJNuе NQ ASP. NET

f le БJ! Уоео< favcr US Tods


~

Config ure the settings for deb LJgging and tracing your
аррliсаtiо п.

г ЕпаЫе dеЬugg i пg
г Capture tracing information

J:j Display tracing information оп individ ua l pages


Display trace outp ut for:
aLocal requests only
cA11 requests

Select the sort order fo r trace results:


фВу time

с Ву categoгy

NLJmber of trace reqLJests to cache: ГiO":j

Select which t race res ults to c~che:


"Most rece nt trace results
aOldest trace resu lts
Configure custom еггог pages

• u;.;rвыполните какое-нибудь действ и е, например, включите


флажок ЕпаЫе debugging, затем восстановите пр ежнее состояние
настроек и закройте броуэер со страницей угилиты. Обратите
внимание , что при любом действие выполняется обратная
отсылка PostBack
• ~ ажмите кнопку Refresh в верхней части панели So lution
Explorer оболочки, чтобы обновить это окно
• г;;;?Откройте ПОЯВИВlШfйся файл web.config и Вы увидите пустую
заготовку настройки параметров web-сайта
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

<?xml versio n="l .O'?>


< со пfigш аоо n xmlns= ''http ://schemas. mkroso ft.co m/. N etC о nfigшаtiо n/у2,
</соnfigшаtiоп>

• ~HOBb зап усти те угили ту Web Site Administration и на стр а нице


DebugAndTrace. aspx включите флажок Enable debugging, чт обы
доб а вить пар а м етр отлад ки

Фай л web.config стан ет таким

<?xml version="l .O'?>


< со пfigша tioп xmlns= ''http://schemas.microso ft. com/.N etC о пfigша tio n/у 2 .0">
<system.web>
< сошрilatiо п debug= ''true'' />
</sys tеш.wеЬ >
</со пfigшаtioп>

Способ 3

• ~ыпо л ните коман ду об олочки Website/Add New Item и


выберите ша б л о н Web С опfigшапоп F ile
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Add Ne\·, Item - С:\ Tmp\MyFlГstStte\ .1J~


Terrp~tes: 111 "
е-~ D ~ 1!1 ~
1'100 Fe<m Мао"" Р"'9" l'Iob Uo..- H T~P"'9" 1'100 _y c ~ СЬоо sty k> ShGot
Cm1rol

~
с<ы
~
X~ Fi"
tm
XI~ Schema
li1
Text Fi"
!IJI
Resc....-ce Fi "
IJ
SQ.- Database
"W1c atL"

tm -~, ~ шf· ~ ~ ~
DataSet
~ff
Si l9~ ~ i "Web
Fe<m
VВScr"t Fi"
"-' JScr " t Fi"

ri=\;" g' ,811 1,;; Ф .1 R1 iJ


IА fi " uэed to СС<"1"gже \\100 Aw l сзtrn oettng,
Name: IWeb,(C<"1f,"
LangJage;
1 u I С, iJ Г РIЮ? rodе
Г
m SEparate filE
58 ее! m.ster рзgе

Оболочка создаст файл ко нфи гурации, который затем можно


на страивать либо напр ямую в текстовом редакторе, либо через
yrилиту Web 5ке Аdmirllstгаtiоп.

Включение трассировки и ее настройка

Трассировка (след) применяется дЛЯ QIЮЛUЗQ работы приложения ,


п оскольку при каждом запросе очередной страницы среда исполнения
A5P.NET ВЮlючает в вывод служебную информацию, полезную пр и
отладке. Э ту информацию можно выводить как на за пр ашиваемых
страницах вместе с ОТЮlиком сервера (совмещенная трассировка), так и
в отдельную служебную страницу Trace.axd, которая является
виртуальной и исчезает при перезагрузке сервера (отделенная
трассировка).

Следует п омнить, что отладочная июlюрмация , если она ВЮlючается в


запрашиваемую страницу, доступна для просмотра в любом броузере .
Она делает потенциально уязвuлюй систему безо па с н ости сайта ,
п оскольку содержит в себе важную информацию , ВЮIючая переменные
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

сервера, кото р ой может воспользоваться злоумьши енн ик для


н есанкционированно го п роникновения. По этому на рабочих Web-
серверах хотя-б ы совмещенную трассировку страниц н епр еменн о
н ужно отключать.

Элеме н ты управления страницы DebugAndTrace.aspx ВЮlючают


трассировку и означают следующее

П араметры т р ассировки ASP.NET


Пар аметр
угилиты Web
П араметр , добавл яемый в
Site
WеЬ . солfig при ВЮlючении Описание
Аdтiлistгаtiол
в уг илите
по

умолча нию

Включает тр асс ировку,


результаты которой с реда
исполнения п омещает в

виртуальную страничу

trace .axd, размещаемую в


памяти сервера на вр емя
O Capture
работы приложе ния. Ее
tracing enabled=''true''
можно прочитать п о адр есу
infопnatiо п
(для при ложе ния т ипа НТТР)
httр :l!lосаllюstl
Имя_при ложе нияl trace.axd .
Э та страница создается IIS и
хранится в памяти до

перезагрузки: компьютера

Трасс ировочны е данн ы е


O Display размещаются внизу каждой
tracing за п рошен н ой страницы .
infопnatiо п оп pageOutput= ''true'' Параллель но тр асс ировка для
iпdividиаl всех об ра бота нных страниц
pages помещается в виртуальную

стран и чу trace .axd


DispJay trace output for:
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Добавляет трассировку в
ОТЮlик страницы только
@ Local юсаlOnly= ''truе'' - по
тогда, когда она запрошена с
requests only умолчанию
того же сервера, где

развернуга ( по умолчанию)

Добавляет трассировку в
ОТЮlик страницы по запрос)';
O All requests юсаlOnly= "falsе"
поступившему с любого
компьютера

Se)ect the sort arder for trace results:


trасеМоdе ="Sо rtВуТпnе " - Результаты трассировки
@ Bytirne
по умолчанию сортируются по времени

О Ву categary traceMode="SortByCategory"
Результаты трассировки
сортируются по секциям

Количество запросов
страниц приложения ,

сохраняемых средой
исполнения в файле trace.axd.
Number of Э тот же параметр определяет
trace requests количество запросов первых

to requestLimit="lS"
запросов, при которых

cache:~1 сервер при соед иняет к

ИНДИВИдУальной странице
трассировочную

инф:Jрмацию при
pageOutput= ''true''
Se)ect whk:h trace resuks to cache:
Сохраняются результаты
O Most recent
mostRecent= ''true'' трассировки самых
trace results
последних запросов

При достижении
установленного количества

запросов КЭШ трассировки

перестает обновляться до
@ Oldesttrace mostRecent= "false" - по
следующего перезапуска
resuks умолчанию
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

приложения, сохраняя

результаты трассировЮ1

самых п ервых запросов

в п е р вой коло н ке та бл ицы п оказано состояние элеме н тов управления


yrилиты , когда в web .config параметров нет и прим е н я ю тся настройЮ1
по умол чанию. Во второй колонке таблицы показан ы параметры ,
которые добавляются в файл web.config при изменении состояния
соответствующих элеме н тов управлен ия на отличное от состояни я п о

умолчанию.

С овмещенная трассировка страниц

Се й час мы п опробуем ВЮlючить трассировку стран иц при ложен и я так,


чтоб ы тр ассировоч ная инф:Jрмация возвращалась вместе с рендерингом
страницы

• г;;;?Запустите уги литу Web Site Administration и н астрой те ее


элементы управле ния так
В.М. С""",,,В Про,раммupoвtJNШ' 110 ASP.NET

~--- -~

Configure the settings for debugging and tracing your


application.
17 ЕпаЫе debugg ing
17 Capture trac ing information

17 Display tracing information оп individual pages


Display trace output for:
r. Local requests only
r AII requests

Select the sort order for trace results:


r. Ву time
r Ву categoгy

Numbeг of tгace requests to cache: гi5"3

Select which trace results to cache:


r. Most ["ecent trace results
r Oldest t race гesults

Confiqure custom егrоr Qaqes

• ~Откройте файл web .config приложения и у6еди т есь, что о н стал


таки м

<?xml versio n="l .O'?>


< со пfigш аоо n xmlns= ''http ://schemas. microso ft.co m/. N etC о nfigшаtiо n/У2,
<system.web >
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

<trace e nabled=''true'' mostRecent=''true''


pageOutp ut=''true'' requestLimit="15" 1>
<с о mр ilatюп debug=''true'' 1>
</system. web>
</configuration>

• r;:Fн аст р ойте страницу Default.aspx та к

<%@ Page Language="C#" AutoEventWireup=''true'' Code FiIe=''Default

<html xmIns=' huр://www.wЗ.or&,1 999/xhtml" >


<head runat= "server''>
<tide>Untitled Page</tide>
<lhead>
<body>
<form ю ="foгml " nmat="server''>
<div>
<h1 align="center" style="co lor: Red''>
П р и вет BceM !! !<lhl >
</div>
</fonn>
<!body>
<lhtml>

• г;.:.=Запустите п р иложе ни е и п олуч ите пр име рн о та кой результат


В.М. С""",,,В Про,раммupoвtJNШ' 110 ASP.NET

~ Untltled Pdge - Microsoft Internet Explorer


-------------------------------
Fie Edt
WY
Actless J

Привет всем!!!
Request Details
Session Request
х 5cbOs22bs5b1445rm3 1d u 55 GET
Id: Туре:
Time of St.atus
07.01.200811:00:40 200
Request: Code:
Request Response Unicooe
Unicooe (UТF-8)
Encoding: Encoding: (UTF-8)

Тгасе Infoгmation
From LlI~
ClItegory MesslIge From First(s)
(.)
aSpX.page Вegin PreInit
aSpX.page End PreInit 0,0182579070803692 0,018258
aSpx.page Вegin Init 0,0209208153550242 0,002663
aSpx.page End Init 0,0389624938 3 6 50 72. 0,018042
aSpx.page Вegin InitComplete 0,0394064050039879 0,00044<CJ
aSpx.page End InitComplete 0,0407646781923401 0,001358
aSpx.page Вegin PreLoad 0,0427593451122978 0,001995
aSpx.page End PreLoad 0,0441952818025755 0,001436
,.,~~,- '~~...I .....
C~<><>" <>,...,....,,~,...

• ~ ощелкайте на кнопке Refresh броузер а , инициир уя все новы е


запросы к стра ниц е. Мы видим, что вместе с ре н дер ингом
страницы броузеру возвращается трассировка только текущего
запроса

Но самый п ростой способ ВЮlючен ия трассировки для конкретной


страницы - доба ви ть в дир ект иву @ Page это й страницы пар аметр
Trace=''true ''.

Отделенная трассировка страниц

Если тр ассир овка страниц В Юlюче на « trace enabled= " true "
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

/ > ), то н езависимо от дрyrnх параметров трассировки , служба IIS


создает виртуальную страницу trace.axd, в ю:порую помещает
трассирово чную инqюрмацию всех запрашиваемых страниц. Э та
страница физически не существует, но доступна из броуэера по адресу

httр :lЛосаlhоst/Имя_прилож енияl trace. axd

Чтобы прочитать е го содержимое , при ложение можно за п ускать либо


через настоящий IIS компьютера, а либо ч ерез встроенный IIS
оболочки.

Вначале запустим трасс ир овку ч ерез встроенный IIS оболочки.

• ~3апустите приложение MyFirstSite, щелкнув на кнопке Start


DеЬuggiпg (и ли нажмите клавишу F5, или выполните команду
меню оболочки DebuglStart DеЬuggiпg, или выполните кома н ду
меню оболочки DebuglStart Without DеЬuggiпg, или наж ми те
комбинацию клави ш Ctrl+F5)
• ~ ощелкайте на кнопке Refresh броузера, затем через строку
адреса вызовите ст р аницу Trace.axd

Теперь за п устим трасс ир овку ч ерез IIS компьютера.

Поскольку ранее мы создавали приложение типа


File System в
MyFirstSite
файловой системе , то его нужно ско пир овать в каталог InetpubIwwwroot,
который для IIS считается виртуальным каталогом localhost.

• ~ыполните командУ оболочки Website/Copy Web Site


• ~ появившейся пан ели Сору Web щелкните на пиктограмме
Connect, расположенной в верхней части
• ~ появившемся окне выделите узел wwwroot и с помощью
кнопки C reate New Folder создайте подкаталог MyFirstSite (можно
задать и любое другое имя)
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

реп Web Site

Flle Sys:tem
9:t
Re System
Select lt1e foOO- уоо w,.-,t to Cf'8'l.

] ЕМ'ТЕ МО

~ ,~""'
Adm n 5cr \Jts
Loczl IIS

~
"'00'
iВsa rllJ Рз

FТP Ste rnai r oot

J
Re mote Ste

IfJO
~D kav
iED KPCМS
iEO LJ
iED f..'OO ile PhJnes
iED ~8Cow_2OJ6
юD мs SQL SERYER
iEO rr=bs
tiIo М5SQ.J
IfJO f.i: _1
~ ,,",~,~L-.; n.,cc,~~" ~

FoOO- :
'1 с".~':~:~"'ш:\:~=м:оо:::,--------_"':='---==-

cpen Са гсе l

• ~ осле щелчка на кнопке Ореп в панели откроется ее правая


половина , куда скопируйте все файлы наше го п риложения
~
ooIoctod I'\es ltorn ю.хоо!о Г .."ОС. weD ""'.

l!.L-_ _ _ _-----' -" l!.L_ _ _ _-----'-"


Lзs t r d"r~sh ; 1)5,01, 2OJ8 17 47 Lert r ~f~ ; Об !J j .2ООВ 17:47
Г % ". delete<:1 [""'" .. псе 1he 13'>1 сору c:.pe.-atix1
Stlltus:
CClJY "от Р." rrю~ W"b "" ю = \fl~ >I:t ~ /hst-J"d Co"","ted ,1 Об , Оl , JJo:)З 17 45 .29

• ~Закрой те соединение, щелкнув на кнопке Discormect


• r;:FвH OBb щелкните на кн оп ке Соnпесt и откройте корневой
каталог саита wwwroot, где уже находи тся ТОЛЬКО ЧТ О
ско пир ованное н ами пр илаже ни е MyFirstSite
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

реп Web Site

Flle Sys:tem

Re
9:tSystem
Select lt1e foOO- уоо w,.-,t to Cf'8'l.

юD IDWTEМO •
~ $а Inelp<b
~ ·O Adm n 5cr \Jts
Loczl IIS
IE О flp;oot
~ IE О iВsa rllJ Рз
FТP Ste еО rnai r oot
IEO 5cr \Jts
IEО WЩ:м.Ь
I;JO r:lll!l

J
Remote Ste
юО МyF rstsite
IfJO JВu Нзг7
~D kav
iEO KPCМS
iEO LJ
iED f..'OO ile PhJnes
iED ~8Cow_2OJ 6
юD мs SQL SERYER
iEO rr=bs
tiIo М5SQ..7
IfJO f.i: _1
..L..J,..C'"1 ,,",~,~L-..; г>.,cc,~~" ~

FoOO-:
'1 с".~':~:~"'ш:\:~=м:оо:::,--------_"':='---==-

cpen Са гсе l

• ~ы дел ите на левой панели файл web .config и скопируйте его в


wwwroot
SoLrc~ Web sit~: Rcmot~ Web sit~:

с :ITrrpV>t,-п- , CS t.

fme S t:J1JJS
.. G] Dof.ut .ЩJХ ~.,.. 0!i . D1 . 2OCIЗ 16 :3'5
.. ~ c.,r.ut .~ ~I<" 29.0 3 .= 12:405 07.D1. 20ct3 10 11
"Gj Р"9"2 .Щ'Х ~J<" 0!i . D1 . 20С1З 1 26
"~ P"9"2 .• "P ~I<" 05 . 01 . 20С1З 22 :03
!a.,.",mn"o;J Ltdlq 07. D1 . 2OCIЗ 10 : 11

L':; r.li-dl 07. 0 1 КlJ8 10 :51 ~t r~lr~h: 07 0!.ЭXJi3 10 51 -


р Sho". ~leted files snce ~ I~sc cC\JY =r~":tl

St<ltus :
(ОРУ I'torn Scuce wю ,т со Rerno:e wю ет ~ IhshOO , coгcp~ а! QJ ,QI, zcaз Ш : 51 5J , у""" L"" ,, -

~~=============-~~-~
• ~3апустите броузер ком пьютера, за грузите страницу по
умолчанию (Default.aspx) через URL и п ощелкайте несколько раз на
кнопке Refresh, затем то же самое сделайте дл я страницы
Page2.aspx. По сле этого также через URL вызовите виртуальную
страничу Trace.axd, на которой и будет собрана вся трасс ир овка
последних запросов
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

~ http://localhost/MyFlГstSlte/Trace.axd- Мicrosoft Internet Explorer


FIe Edit Vfew Favcrites TooIs НеР

.... Back ... ..... I.D [fJ ~ ' Q. Seif"ch ~ Faycrites


ActlesSJt::I http://'ocзhJstftv1yFгstsitе/Тгасе, зхd

Application Тгасе
[ clea r cu rren t tra ce ]
Physical Directory:c: \inetpub\w wwroot\

Requests to this Application Remaining~


N Time of
File St8tU$ V Ь
о. Request Code ег
07.01.2008
1 М У Fi rstSite{ Defа u It.aspx 200 GET V jew Detal ls
11:06:37
07.01.2008
2 М У Fi rstSite{ Defа u It.aspx 200 GET Yiew Details
11:06:40
07.01.2008
3 MyFi rstSite{Page2.aspx 200 GET V jew Detaj ls
11:06:52
07.01.2008
4 MyFi rstSite{Page2.aspx 200 GET yjew Details
11:06:57
07.01.2008
5 М У Fi rstSite{ Defа u It.aspx 200 GET yjew Detalls
11:07:16
07.01.2008
б М У Fi rstSite{ Defа u It.aspx 200 GET Vie w Detai ls
11:07:20

Мiсrоsoft .NET Frame work Version :2.0.50727 .42; ASP.N ЕТ


Version 2.0.50727.42

1i1 ГГГI ~ LОС3htriflеt

Щел ч ком на гиперссылке View Details можн о раскры ть трасс и ровку


любо го запроса. Щелчок на ссылке [ clear сшге пt иасе ] очисти т
виртуал ьную страницу Trace.axd точно также, как и п ерезагрузка
компьютера.

Секции трассировоч ных данных

Ин формация , которую выдает сервер п ри ВЮlюч ен ной трасс и ровке ,


группируется им п о секциям , значе н ия которых п р и ведены в табли ц е.

Се кции трассирово ч ны х данны х


в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Секция Описание

Reqllest
Содерж ит общую инф:Jрмацию о запросе ст р аницы
Details
Содержит сведения о пр оизводи тельно сти , связанные с
событиями жизненного цикла страницы. В столбце From
First(s) находится абсолютное время , отсчитываемое с
Тгасе
l' • момента получения запроса страницы (нулевое время) до
lпюпnatюп
начала обработки очередного собы тия. В столбце From
Last(s) nоказана дли тельн ость обработки nредыдщегоo
события.

Co ntro l Содержит инф:Jрмацию обо всех элементах ynравления


Тгее страницы, включая размер занимаемой ими памяти

Session
Содержит все n ереме нны е сеанса и их знач ения
State
Appocatio n
Содержит все n ереме нные nриложения и их состояния
S tate
Reqllest
Отображает cnисок всех файлов cookie (куки), полученных
Cookies
сервером в составе запроса
Collection
Rеsропsе
Отображает список всех файлов cookie, переданных
Cookies
броузеру в составе отклика
Collection
Headers Отображает список НТГР-заголовков, полученных сервером
Collection с запросом

Rеsропsе
Отображает cnисок НТГР-заголовков, переданных броузеру
Headers
в составе ОТЮlИка
Collection
Fопn Содержит пары key=value элементов ф:Jрмы, отправленных
Collection броузером с обратной отсылкой PostВack
Q llerystring
С 11_·
оШ:"сtюп
Содержит пары key=value, ВЮlюченные в строки запроса

Server
Отображает состояние всех серверных nеременных
Variab)es
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Отложенная компиляция Web-страниц

ASP.NET поддерживает отложенную (динамическую) компиляцию для


экономии дисково го пространства сервера. ЭТО значит, что на сервер
мы можем разместить страницы с исходными текстами такими , как они

выглядят при проектировании. Но при первом запросе страницы она


компилируется в DLL · сборку и помещается во временный каталог
среды исполнения. Все последующие обращения к этой странице
теперь уже обрабатываются DLL·сборкоЙ

Выводы

1. Web-сервер отвечает за получение и исполнение запросов к


ресурсу и отправку ОТЮJиков

2. Web-броузер (браузер) за получение да нных от сервера ,


отображение их, прием да нных от пользователя через элементы
управления и отправку их серверу

з. Н1ТР - протокол передач и текстовых данных для взаимодействия


броузера и сервера
4. Обычный способ отправки да нных на сервер, после первого
запроса страницы, называется обратной отсылкой PostBack
s. ASP.NET подце рживает две модели программирования Web-
страниц: с встроенным (совмещенным) кодом и отделенным
(застраничным) кодом. С траница с совмещенным кодом ВЮlючает
в себя код разметки (НТМL) и код языка программирования ,
который размещается в секциях <script> . Таких секций может
быть сколько угодно и они могуг располагаться в любом месте
страницы. Страница с отделенным кодом размещается в двух
файлах: файл разметки и файл кода
б. Динамической компиляцией называется отложенная компиляция
Web-страниц, выполняемая только при первом запросе страницы
пользователем. Разработчику сайта достато чно разместить
страницу с исходным текстом в нужном месте сервера, а об
остальном позаботится среда исполнения (машина, движок)
ASP.NET
7. ASP.NET подце рживает страницы на разных языках

программирования, при условии , что на одной странице


применен только какой-то один язык
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

8. В ASP.NET для глобальной и индивидуальной настройки ее


раБОТbI применяется иерархия конфигураЦИОННblХ файлов. При
формировании кэша настройки парам еТрbl конфигураЦИОННblХ
файлов, расположеННblХ ближе к исполняемой стра ниц е имеют
больший приоритет
9. Функцию трассировки ASP.NET применяют для наблюдения за
пр оизводи тельно стью и использованием ресурсов сервера

10. В целях безо пасн ости при п еремещении на рабочий сервер


отладку и трассировку страниц нужно отключать

"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Web-формы

Абсолют но е позиционирование элеме н то в управления. Обработчик


п ереключ е ния экзем п ляра элеме нта CheckBox. Модел ь собы тий
AS P.NET Автомат ич еские обратные отсылки . Сохранение состояния
ви да. Этапы выполнения страниц на сервере. Обработка событий .
Ав томат ич еская п ри вязка данн ых. Стра ница как ко н тей н ер элементов
управления. Прогр амм н ое управление заголовком страницы . Создание
элемента управления во время выпол н е ни я. К ласс Page. Объекты
Session, АРРlicаооп, Cache. Объект Request. Объект Response. Объект
Server. Объект User.

Файлы к лекц ии Вы можете скачать здесь скачать:

http://o и. intШ . ruld epartment/intemet/prasp пеt/зюз _ We bS пе 2. zip

Стра ницы ASP.NET, официал ьн о известные как Web-формы , являются


н еотъемлемой частью пр иложения ASP.NET Э ТО конкретные
ин те рфейсны е единицы, которые кrlИенты MOryr запр ашива ть и
отображать в своих броузе р ах. Web -формы в ASP.NET подце р живаю т ту
же техноло rnю ви зуал ьного прorра мм ирования , что и Windоws-формы В
локальных прилож ениях. А это очень удобно дл я бедных и н ес ч аст ных
разработчиков, т.е. нас с вами.

в ос н ове Web-форм НТМL-страниц леж ит дескр иптор <fo r т> . ..


</ f o r т> . В акт ивны х страницах други х систем , например РНР ,
страница до п уска ет наличие на ней нескольких дескрипторов
< fo r m> . .. < / fo r т> (дескрипторов Н ТМL -форм). В таком случае эти

дескр иптор ы долж ны им еть атри буг ы ID с ра з ными значениями , чтобы


п оддерж ивающая актив н ые страницы с и стем а мо гла р азл ичать, какая

форма прислала на се рв е р данные, которые нужно об р аботат ь.

Стра ницы ASP.NET тр ебуют, чтоб ы на каждой из них было не более


од ной формы (в п ринципе, форм на стра ниц е может б ы ть несколько, но
в каждый момент видимой Visib le=True может б ы ть тол ько од на форма).

Но этого достаточно и для обычной НТМL -стр аницы , да бы сколько бы


элементов у пра вления Н ТМL - фор м а не содержала, с ни х всех
собирается информация п ри подготовке обратной отсылки на сервер .
Когда по льзо ватель щелкает на кнопке Submit, броузер извлекает
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

текущие з начения п оследовательн о с каждого элемен та управления и

формир ует и з ни х длин ную строку п ар I D=з н ачение . З атем эта


строка отпр авл яется на сервер странице , указанн ой в атр ибуге act i on
дескр иптора < f orm> , исп ользуя метод post , или метод get . Если
атрибуг а с ti оп не указан, то данные отправляются той же странице .
С ам НТМL н е устанав л ивает на количество форм никаю1Х ограничений ,
а ASP.NET устанавливает и для одной а ктивной страницы способна
ге н е рир овать тол ько одн у НТМL- форму < form></ f o r m> .

Пусть имеется страница Page.aspx, кото р ая хоть и имеет расширение


.aspx, но содержит код обычной статической ст р а ницы . При
выполнении такой страницы система AS P.NET отпр ави т ее
п ользователю как есть, ни че го не доба вляя . Хотя при этом будет
за трачено вр емя на разбор кода и о пр еделение того, что ничего не
н ужн о доба влять.

<html>
<head >
< title>Посылка сообщений </titlе >
<meta content=''text!html; chaгset=windows-1251" http-еquiv="Сопtепt-Туре
</head >
<body>
< fопn method="get" паmе="fо пnl ''>
<р>

Ваше сообщение:
<input id="rпеssаgе" name="message" type="text" value='Hello, world!'':
<br>
Кто посылает:
<input id="autor" name="autor" type=''text'' vаluе="СНЕТКОВ В.М.">
</p>
<р>

Кто примкнул К сообщению:


</p>
<ul>
<li>
<input id= ''P'' narпe=''Р'' type="checkbox" value="checkbox''>
Петров Петр </li>
<li>
<input id= '1" паmе=' 1 " typ e="checkbox" value="checkbox">
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Иванов Иван <Ili>


</ul>
<р>
<input id ="OK" type="submit" value="Submit''>
</p>
</form>
<!body>
</html>

Листинг Пример страницы Page.aspx

Ваше сообщение: Hello, \Norldl


Кто посылает СНЕТКОВ В.М.

Кто примкнул К сообщению .

• О Петров Петр
• О Иванов Иван

Submit

Представление в броузере (клиен те)

Нажмите на кнопку Submit и посмотрите в пол е адреса броузера. Форма


отослала на сервер строку

WеЬFОПIl5 . htm?
message= НеПо%2С +World%21&autor=C НЕТКО В + В.М.&О К =Submit

Посюльку В форме указан метод get , то к URL -адресу через символ


вопроса ( ?) оказалис ь присоединены пары имя = значе ни е, разделенные
амперсан до м ( & ). Обратите в ни мание, что символы пробела ,
восклицательный знак, запятая (и если вы введете русски й текст)
заменяются двухбай тны ми юдам и с предваряющим с и мволом процента
(% ).

ЭТО на зывается URL-кодир ованием сообщения формы в до п устимые


символы латинских букв и цифр (для пр остоты С Н ЕТКО В В.М. как раз
и введено латинскими буквами), чтобы сообщение не содержало
управляющих символов, способных вызвать н ежелательный эффект.
Посюльку прин имающая стран ица не указа на , то принимающей от

"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

кrlИента данные qюрмы на стороне сервера будет та же самая страница.


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

Мы уже говори ли, что если такую страницу разместить на сервере, то


не смотря на расширение .aspx, ASP.NET -машина ее все р авно

обрабатывать н е будет. Для этого НТМL-дескрипторы нужно сделать


активным и (серверными) добавлением атри бута r una t= " зе rver ". в
связи с этим сделаем два определения: та страница, которая не

содержит серверных дескрипторов, называется статической


(пассивной). Если же на странице есть хоть один дескри п тор с
указанным атрибутом, то такая страница подлежи т дальнейшей
обработке системой ASP.NET (или иной) и называется динамической
(активной).

Отсюда мораль: статическим страницам лучше при сваиват ь расширения


hun или htm1, чтобы серве р при их запросе кrlИентом без промедления
осуществлял отправку. Если же присвоить статической странице
расширение aspx, то все равно она без изменений бу,цет отправлена
клиенту, но пр ежде пройдет через систему обработки, что потр ебует
допол ни тельного времени и напра сной траты машинных ресурсов.

Пример кодирования страницы

Оболочка имеет две основных вкладки с элементами пользовательского


интерфейса для подцержки активных страниц, Standard и НТМL.
Вкладка НТМL содержит элементы, напрямую поддерживающие
стандарт НТМL- дескрипторов, и н ужна для то го , чтобы с
минимальными переделками можно было приспособить старые
страницы к новой технолоrnи АSР.N Ет. Достаточно добав ить к
дескрип тор ам таких элемен тов атрибут r unat= " server ". Вкладка
Standard содержит более развитые элемен ты управления, имеющие
больший набор свойств и событий , пол но стью ориентированные на
объектное программирование.

При помещении элемен тов с вкладки НТМL на страницу атрибут


runa t = " se r ver " автоматически не добавляется и такой элемен т

"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

средой на сервере об р абатываться не БУдет. Следовательно , кодировать


на языке программирования его будет нел ь зя . Прежде элемент н ужно
п омети ть как сер верн ы й , введя напрямую указанный атрибуг в
дескрип торное представле ние элеме н та, или в оболочке в режи ме
Design на выделенном элеме нт е вызвать кон текстное меню и выполнить
опцию Run As SelVer Со пtго l (сделат ь серверным элементом управлен ия)

J.. ..
butlon

t J!; Cut -
'tI Сору

lfI Paste
Paste Altегn.зtе

Х Delete
Style ...
RlIl As Serveг Contrd
I I
I!З. View in Browser
Edrt Imag€
Show Smart Tag

rE Rе1Теsh

~ Propeгbes

Если мы разрабаты ваем актив н ую стра ниц у "с нуля", то лучше сразу
п риме н ять серверные элементы управления, где уже автоматически

встро е н дескр ип тор runa t=" s е rve r " . и более того , если его уб р ать ,
это БУдет счи таться Оl.Ш1бкоЙ. Дескрипторы, представляющие серверные
элемен ты , начинаются с метки asp : Т ип элемента , далее следуют

атрибугы элеме н та.

Для примера создадим пр остую страницу.

• Г;:;=Создайте н овый сайт командой FilelNewlWeb Site ... , настроив


окно мастера примерно так
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Ne\·, Web Slte .1J~

111 "

Зе",ф 01 1,...,
Te"l'~tEs",

IА ыл< A5>JoET WOO si'E

Loca~ m : "lcC
"O oC
,,=.Cm
---i!" Гсlс--;\,,"";;;i\w;;"';ы;о,•;-,----::========---:i!~.. ВrOWS8",
L~: IC\C
ruC,C"C,,------i!;]

После щелчка на кнопке ОК БУдет создана нач альная страница , которая


состоит из двух файлов: Defauk.aspx и Default.aspx.cs.

Существует два вида кодировки страниц ASP.NET:

1. Стран ицы со встроенным кодом (совмещенным), когда весь код С#


и НТМL· дескрипторы хранятся в одном файле .aspx
2. Стран ицы со скрытым кодом (раздельным, застра ни ч ным) , когда
код С # хра ни тся отдельно от кода с дескрипторами в фай ле
.aspx.cs

Второй способ лучше и начальная страница сай та создается именно так.


Большой Билл рекомендует использовать и ме нно второй способ, чтобы
разделить дизай н страницы и ее функциональность. Но для тр е нир овки
оди н разок мы воспользуемся п ервым способом.

• ~ ерез пан ель Solution Explorer Удал и те файл с кодом С#


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

С:\ Tmp\WebSi!e1 \
Ц! App_Data

(>реп Witi1

D V>e., DeskJner
Vi€w Component Designer

ВUikJ page

JIi Cu!
Сору

Wete

• ~ редакторе HTM L· decKpunmopoe скорректируй те деЮlар ацию


Page, чтобы о на стала такой

<%@ Page Language="C#" % >

• ~Сразу под деЮlараци ей создайте ко нтей н ер <sc ri pt


runat= " server " ></ script> для бу,цущего размеще ния в
н ем кода С#. ЭТО можно сделать либо напрямую в режиме Sо шсе ,
либо в режи ме Design двойнь/Л1 щелчкам н а страни ц е создать
об р аботчи к соб ы тия по умолча н ию Page_LoadO, который оболочка
п оместит в блок скриптов (а затем за н е н а.цоб н остью обработчик
мож н о Удалить)
• ~ ол н ость у,цал и те деЮJaрацию ООСТУРЕ (н е обязательно, но
чтобы н е мешала)

< !DQ CТYPE html PUBLIC "- /IWЗС /IDТD ХНТМL 1.0 Tгans [ionaVIEI

Те п е рь мы п олуч или стран иц у, где код С# н уж но БУдет разме щать в


кон тейнер ы <scri pt r unat= " server " ></ scr i pt> . Э ти х
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

кон тейнеров на стран иц е может быть сколько угодно и они MOryr


располагаться в любом месте. ASP.NET перед выполне ни ем все р авно
скомпилирует стра ниц у, пройдя весь ее код. Но все же р екоме ндуется
и меть оди н ко н тей н ер и располагать е го вначале страницы (для
удобства бедного со пр овождающего про гр амм иста) . Начальная
за готовка стра ниц ы будет выглядеть так

<%@ Page L апguagе="С#" %>

<script nmat="server''>
</script>

<html xmlns=''httр ://www.wЗ.огgl1999/xhtml''>


<head nmat="server">
< title >Uпtitled Page</tide>
<lhead>
<body>
< fо пn id="forml" ruпаt="sеrvег''>
<div>
</div>
</foпn>
<!body>
<lhtml>

Листинг Начальная заготовка страницы Default.aspx со


встроенным ходом

Создание обработчиков

Для нашего просто го при мера мы создадим два об р аботчи ка готовых


событий , которые срабатывают в свое время, а обработчики, если они
созданы , пер ехват ывают эти события и управляют приложением. При
создан ии стран иц ы с отдельным С# - файлом оболочка автоматически
создает один обработчик начальной за гр узки . Сигнатуру этого
обработчика можно использовать как шаблон для создания вруч н ую
дрyrnх об р аботч иков . Она у в сех бу,цет одина кова.

Обработчик загрузки стран ицы


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Напомним , что каждый раз при по стynлении на се р ве р п ервого запроса


или обратной отсылки ( по сти нга ) с да нны м и ини циирует ся создание
объ е кта страницы. И как то лько объект страницы БУдет за гр ужен в
памят ь и будуг созда ны и инициализированы все элементы стр аницы ,
срабатывает соб ыти е Load, с котор ы м мы свяжем функцию-обработчик
с н уж ным нам кодом.

Обы чно , при разработке визуальных элементов ynравле ни я, имеющих


события, н азнач ают событие по умолча нию для того, чтоб ы оболочка
при д войном щелчке на элемен те в режиме Design автоматичеси
созд авала обработчик именно этого события. Н а п р и мер, для элемен та
Вuttоп это событие Cl i ck , дл я флажка CheckBox
CheckedChanged, и т. д. Соб ыти е по умол ч анию назначается с
ПО МОI.l.\bю атр и буга [Ое f а u 1 t Eve n t ( " Имя событ ия") ] .

• ~ ереведи те страницу в режим Design и двойным щелчком на


н е й создайте за готовку обработчика соб ы тия по умол чанию Load,
кото рое срабатывает каждый р аз, когда страница на се рв е р е
загружается в п амять. Те пе р ь в режиме S ошсе страница будет
выглядет так

<%@ Page Lапguаgе="С#" %>

<script ruпаt= "server''>


protected vo id Page_Load(object sепdег, ЕvепtAгgs е)
{

}
</script>

<html XmInS= ' huр ://www.wЗ .or!j'1999/xhtml' '>


<head ruпаt= "server''>
<tide >Untitled Page</tide>
<lhead>
<body>
<form id ="forml " nmat= "server''>
<div>
</div>
</fоПll>
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

</body>
<lhtml>

Листинг Страница после создания обработчика события


Load
Заметьте , что в дескрипторе <form> н ет атрибугов act i on и
method, это значи т, что данные от юше н та ф:J р ма БУдет посылать
этой же странице, и посылать и х будет методом pos t (метод get
пр и соединяет данн ые элементов ynравл е ния к URL-адресу). ЭТО
нам и нужно , поэтому ничего н е будем менять.
• r;:;nоместите с ВЮIaДКИ Standard панели Toolbox элементы Labe~
CheckBox, TextВox, Button и через панель Properties оф:Jрмите их по
умол чанию примерно так, как п оказано на рисунке

Default.aspx*

['LаЬе1лl !\'"' Red


Имя: ,rtHeHOB '
Прив~тДОрогоЙ ;оварищ(го С"подии) ['L abe1211

liJ Обновить

И сходный код стра ни цы Defauh.aspx будет та ким

<%@ Page Language="C#" %>

<script runat= "server',>


protected void Page_Load(object sender, EventArgs е)
{

}
</script>

<html XmInS= ' huр i/www.wЗ .or&,1999/xhtml' '>


<head runat= "server''>
<tide >Начальная страница </tidе >
<lhead>
<body>
<form id= "forml " nmat= "server''>

"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

<div>
<asp:Label ID='1.abel1 " nmat="server''> </asp:Label>
&nbsp;&nbsp;&nbsp;
<asp:C heckBox ID="C heckBoxl " runat="server"
Text="Red" I>< br 1>
Имя :
< a s p :Te xtВox ID =' TextВo x l " runat="se rve r ''>C HeTКOB </asp:TeX1

Прив ет дор о гой т о варищ (гос п од ин)


<asp:Label ID='1.abel2 " nmat="server''> </asp:Label><br 1>
< Ьг 1>
<asp:Button ID =' 'В uttопl '' nmat="server" Те хt=' 'Обновить '' 1>
</div>
</fonn>
<!body>
<lhtml>

Листинг Исходный код страницы примера Default.aspx

Включени е режима абсолю тн ого позицио нирования


элемен тов уп р авле ния

Порядок размещения элеме н тов управления н а форме п роектирования


страницы определяет и п орядок размеще ни я генерируемо го ими HTML -
кода на компьютере юш ента (кода разметки страницы) . При изменении
размеров, стиля или выводимого текста рендерин г автоматически

смещается в броузере без наруше ни я порядка следования и н формации.

Если какой- то элеме н т уп р авления жестко зафиксир овать на web-


странице, то и ре н дерин г этого элеме н та в окне броузера кл и ента также
будет зафикс и рован. ЭТО может привести к тому, ч то рендеринг одних
элемен тов управления в броузере будет нап олзать на ДР)'П1е элементы
НТМL-вывода стран иц ы. В резул ьтате н а клие н те может п олучиться
п римерно вот такая меша нин а

Привет всем!!!lпривет всем!!!


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Но все равно, в н екоторых случаях может п онадобиться им ен но


абсо лютно е позицио нировани е. Вот как этот р еж им в оболочке можно
включить:

• ~ ереведите страницу .aspx в р ежим Design, чтобы появилось


мен ю Layout оболочки
• Г;:;=Выберите команду меню LayoutlPositionlAuto-роsitiоп Орtiопs и
настр ой те диалоговое окно так
Пl'tюп~
==----.1J~
Ш·· Еп v О- m rrmt

Ш Рго ;з,ts in:J So utms


Ш·· SE>.п е Crnl10l
I!J .. тe.t Edl1D"

IE О ,ЬЬа8С Тоо Ь

IE Dob.щ hJ
1jJ·· Dev O:e Tools
г snap р.хеl-Ьаээd pos ~ms in:J s~es to tffi b l ~"."'" SE(t ..... :
ш нт м. Оез чer
, Ю-izооtal spac ..... :
rs-- pixels

Vetti:a' spac ..... :

Г pixels

о< Car>:EI I
I

Обработчик переключения экземпляра C heckВox l


элемента CheckBox

• ~ызовите панел ь D ос umепt Оutliпе кома н дой ме ню View/Other


WindоwslDосшne пt Оutliпе и в р еж им е Design выдел и те в де р е ве
объект CheckBoxl
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Document Out:n: .....Q. х Default..aspx*


.:J oefiJJ t.aspx
B~ forml ['W>,11] ''f-~____
~. ~] -<DIV> Имя: rt' H8HOB
'.,~ Labell
Привет дорогой товарищ (господин) [Labe12]
'·~ !!!nтз ММ
;.E'! -<6.R>
i.,~ T.extвoxl
r Обновить
Н!:З -<ВR>
:·~ Label2
;.E'! -<6.R>
'. Е3 -<ВR>
Ц~ вuttОnl

• ~ ерейдите в п анел ь Properties, п ереведите ее в режим Events


(значек мол нии ), найди те собы тие СhесkеdСhaпgеd и двойным
щелчком на поле событи я создайте для него обработчик

РгорегtJеs .... .r;t х

CheckBoxl System.Web.UI,WebCOIlU'"

Disposed
Init
Load
PreRender
Unюad

Центрировани е интерф ейса

Отцентрируем наши элемен ты н а странице . Для это го

• ~ ерейдите на ВЮJaДКУ Source стра ницы . Установите курсор


внугри контейне р а <d i v></div> . В ни ж н ей части окна
редактора щелкните н а кнопке <di v> , чтобы выдели ть блок
HTML -Koda

"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

~! lюdу )-

Обрати те внимани е, что в ме н ю оболочки для вюыДки Source нет


пункта Fопnat, который появи тся только на вкладке Dе s igп .

• ~ e снимая выделе ни я т екста п ерейдите на вкладку Dе s igп.

Мы ви д им , что все элементы кон тейнера <d i v>< I d i v >


остал и сь выделенными и появилось меню Format.

• Г;:;=Отцен трируйте выделенные элементы страни цы командой

Detщ

UJ • !ОН, ~ I.!> ~ ").!, 0=""


"".,,-
.. _ __
~ Т1 т б New Ro ~ 12pt ~
~ Fcreg"C...n:J CW ", хктм.. 1,0 TriflSi!) ~ I
.е. Backg-c:<..n:J CW ",
Foot ~

I!, Coovert to НyperIГt ", C!rI+L


Insert Вook m if"k ", C!rI+ Shft+L '11 Rфt

~ •• lisbfy

мake Sз т е Эzе

Н<xizalt3 Spach]

УегЬ:aI Spach]

,,&

Ле гко замети ть , что эти действия п ривели к добавлению в дескрип тор
<d i v> атрибуга в н угреннего стиля

<div sty1e=' 'text-align: сепtег ">


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

</div>

Это наглядный прим е р того, чт о зная где и что подкруги ть, можно
п одкручивать и н а прямую. НТМL-дескрипторы такие "одноклеточные",
что все их пов едение ' 'написано у них на лбу". Но чтобы опуститься до
их уровня , нам нужно попот еть при подъеме в гору Серверные
элементы из вкладки Standard на много сложнее, зато несравненно
функциональней и полностью подцерживают парадигму объект НО­
ориентированного программирования. Их настр ойка большей частью
выполняется через код С# и п анель Properties.

Стоит упомянугь пр о режимы редактирования Design и Sошсе. На


сервере наша активная страница все равно БУдет хра ни ться в виде кода ,
как он пр едставляется на вкладке Sошсе ( ... и терпеливо ждать своего
по сетителя). Режим Design является средством визуального
про ектирования и пр една значен для разработчика (нас с вами), чтобы
существенно упрости ть (ускорить) его работу.

Заполнение обработчиков кодом

Заполним обработчики. При загрузке странице по п ервому запросу и ли


обратной отсылке (постинга) мы хотим , чтобы в объект L abe11
пом ещался снимок таймера сервера. Конечно, это не лучший способ
спрашивать время у сервера (ходить за семь верст киселя хлебат ь) , когда
то же самое можно спрос ить у таймера клие н та. Но пока мы не
использовали JavaScript, на м и это сойдет. Кроме этого, в обработчике
копируется з начени е поля объекта T e x tBo x 1 в метку Labe 1 2 и
добавляется ВОСЮlицание.

Второй обработчик устанавливает цвет переднего плана и qюна метки


L abe 11 . Он срабат ывает только тогда, когда при обратной отсылке
(постинге) обнаружено изменение состояния объекта Chec k Bo x1 .
Если состояние Chec k B o x 1 междУ двумя обратными отсылками не
и зменялось, то события CheckedChanged не возникает и код
обработчика не выполняется.

Полностью код страницы в режиме Source для нашего при мера будет
таким
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

<%@ Page L апguagе="С#" %>

<script nmat="server''>
protected void Page_Load(object sender, EventArgs е)
{
Label1.Text = 'Текущее время:"
+ DateTnne.Now.ToLongТuneStringO;
Label2.Text = TextВoxl . Text + "!!!";
}

protected void С hес kВо хl_СhесkеdС hапgеd(оЬjесt serкler, ЕvепtAгgs е)


{
if (CheckBoxl.Checked)
{
Label1 .ForeColo r = System.Drawing.Co!or.White;
Labe!l.BackCo!or = System.Drawing.Co!or.Red;
}
e~e
{
Label1 .ForeColo r = System.Drawing.Co!or.Black;
Labe!l.BackCo!or = System.Drawing.Co!or. White;
}
}
</script>

<html xmlпs=''httр ://www.wЗ.огgl1999/xhtml''>


<head nmat="server">
< title > Начальная страница </titlе>
<lhead>
<body>
< fо пn id="fопnl" ruпаt="sеrvег''>
<div stуle=''tехt-аligп: center">
<asp:Labe! ID=''Labe!l '' runat="server''></asp:Labe!>
& пЬ sр;&пЬs р ;&пЬ sр;
<asp:CheckBox ID="CheckBoxl" runat="server"
Text=''Red'' ОпСhесkеdСhaпgеd="СhесkВохl_СhесkеdСhaпgеd" 1:
Имя:
<asp :TextBox ID='TextBoxl" runat="server' '> C H eTКOB </as p :TextВox><
Привет дорогой тов ари щ (господин)

"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

<asp:Labe! ID=''Labe12 '' runat="server''></asp:Labe!><br />


< Ьг />
<aspButton ID='Button1" runat="server" Теxt="Обнови ть" />
</div>
</form>
</body>
</html>

Листинг Код страницы примера Default.aspx

• ~3апустите пример , должен получиться внешне

при бл и зительно такой результат

06f108ИТЬ

НТМL · страница на стороне клиен та

Модель событий ASP.NET

в пред ыдущем пример е мы продемо нстрировали использование


н екоторых событий для управления интерфей с ными элемен тами. Такой
п одход упрощает программирование. Разработчик добавляет элементы
управления на WеЬ·форму и затем решает, на какие события н ужно
реагировать. В ASP.NET события работают следующим образом:

1. Клиент первый раз запраl.Ш1вает ст р ани ц у. Среда исполнения


ASP.NET создает объекты страницы и элементов управления ,
выполняется код инициализа ции , страница преобразуется в НТМL
и возвращается клиенту. Объекты страницы сразу же у,цаляются из
па мяти сервера , освобождая место для других запросов.
2. Получив НТМL · страницу ютиент что-то с ней дела ет и
инициирует об р атную отсылку - по стинг (например , щелкает на
кнопке Submit ). Броузер собирает данные со всех элементов
формы и события , которые прои зоштlИ на ют и е н те, упаковывает
все это в пакеты (''пакует ч емоданы ") и отправляет целевой
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

странице сервера на обработку. Целевая страница указана в


атрибуге action НТМL-дескрuптара qюрмы. Каждый пакет
посылается отдельно и с уведомлением ус п ешной доставки.
З. На сервере ASP.NET получ ает ПО СТУПИВlШIе пакеты ,
р аспаковывает и соединяет их. Затем запускает целевую страницу
и предает ей полученные данны е.
4. Целевая страница загружается в память, повторно создаются
объекты с начальной инициализацией как при первой загрузке.
s. Затем серверная стран ица переводится в состояние, какое она
имела перед последней отправкой юшенту. Инqюрмацию о
п оследнем состоянии серверной страницы ей передал клиен т. Э ту
инqюрмацию он получил от страницы в скрытых полях вместе с
последним ответом и теперь вернул в н еизме нном виде в своем

новом запросе (обратной отсылке). Инqюрмация о последнем


состоянии серверной страницы перед ответом клиенту
называется состоянием вида.

б. После этого ASP.NET приступает к анализу поступивших собы тий


и определяет, что клиент хотел сделать с данны м и перед обратной
отсылкой.
7. И наконец, Удовлетворяя требования клиента выполняет
действия , предписанные событиями в соответствии с
имеющимися обработчиками. Тем самым qюрмируется новое
состояние серверной страницы и новый НТМL-ответ, который
отправляется клие н ту вместе с новым состояни ем вида в

скрытых полях.

8. После сгенерированного НТМL-ответа страница немедленно


выгружается из памяти сервера.

Автоматические обратные отсылки

в нашем примере только кнопка Submit генерирует обратную отсылку на


стороне клиента. А любые изменения в элемен те Te xt Bo x l и ли
CheckBox l не БУдУГ обработаны до нажатия этой кнопки
(фактической отправки qюрмы на серверную обработку). С одной
стороны это хорошо, меньше ресурсов тратится на пересылку, но с

другой - пользователь не получает немедленный ОТЮlик на свои


действия.
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

в серверных элементах управления таЮ)й случай предусмотр е н. Если


включить свойство AutoPostBack элемента в состояние True. то
после заве ршенных изменений в состоянии элемента автоматически
броуэером будет иницииров а на обратная отсылка. Это происходит за
счет того, что элемент ynравления с таким установленным свойством
при ответе нар яду с НТМL генерирует до п олнительный скрытый
Java Script -Ю)Д, заставляющий броузер выполнять обратную отсылку
всякий раз, Ю)гда происходит и зме нение состояния этого элемента

пользователем.

Проверим это на нашем предыдщемM прим е ре .

• r;:;'выделите на странице Defauh. aspx объекты Te xt Bo xl и


Chec kBox 1 и в панели Properties установите для ни х свойство
AutoPostBack в значение True . Вы видите , что в
дескр ипторах эт и х элементов сразу появился до п олнительный
атрибуг AutoPostBack= " T r ue ". Теперь при генерировании
ответа клиенту эти элементы бу,цуг генерировать и Ja vaSc ript-Ю)Д
обратной отсылки .
• г;.:;=Запустите страницу на вы п олнение и в появившемся окне
броузера через Ю)нтекстное меню выполните опцию VIt'W Sошсе .
Среди прочего HTML-Koda можно увидеть и Ja vaSc ript-Ю)Д
обратной отсылки

<script type= ''textJjavascript''>


<!--
var theForm = dосшnепt.fоrms[ ' forml ' ] ;
if (!theForm) (
theForm = dосшneпt.fоrml;
)
fuпсtiоп _doPo stВack(eve ntTarge t, еveпtArgшneпt) {
if (!theFormonsubmit 11 (theForm.onsubmit() != false)) {
theForm._EVENтrARGET. value = eventTarget;
theForm._EVENТARGUMENT.value = еvепtA rgшneпt;
theForm.submit();
)
)
// -->
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

</script>

<input id="CheckBoxl" type="checkbox" name="C hec kBoxl "


о ос lick =' 'javascript:setTnneout('_do PostBa ck(\'C heckBo х l \', \'\')', О)"

<input ю='ТехtВохl" type= ''text'' пате='ТехtВохl" vа luе=''С идоров ''


о ochange= 'Javascript:setTnnео ut('_do Po stВack (\'ТеxtВо х l \', \'\')', О)"
onkeypress="if (WebForm_ TextВoxКeyHandler(event) == false) геtшг

Ах!, какие умные эти серверные элементы: сами сеют - сами жнyr
- сами песенки поют!!!

• ~ оизменяйте состояние элементов в броузере. Теперь на


каждые изм е нения серверу генерируется обратная отсылка
(постинг) для обработки. Зачем ждать, как в армии , общей
команды Submit...

Обратите внимание, что НТМL-элементы во ВЮJaдке НТМL панели


Toolbox - слабосильные и автоматическую обратную отсылку не
выполняют.

Но все хорошо в меру! Частые запросы к серверу перегружают сеть и


замедляют работу. Да и встраива ем ый в ге н е рируем ый сервером ответ
Jаva Sсгip t-КОА также увеличивает объем передаваемой броузеру
информации. Поэтому слишком увлекаться механизмом автоматических
обратных отсылок не стоит.

Сохранение со стояния вида

Давайте опять вернемся к нашем у простому пример у и выполним


следующее:

• ~ерните свойство AutoPos tBack элементов Chec kBo x 1 и


Te xt Bo x 1 False
опять в состояние

• ~ыделите элемент
Labe 1 1 и установите его свойство
EnableViewSta t e в состояние False (по умолчанию оно
установлено в значение T r ue ). Немедленно в дескрипторе
элемента появится атрибyr EnableV i ewSta te= " Fal зе "

"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

• ~Запустите приложение и отметьте, что цвет элемента Labe11


(Текущее время: ... ) меняется ТОЛЬЮ) при первой отсылке после
изменения элемента Chec k Bo x l. Последующие отсылки
восстанавливают начальный цвет.

Что здесь проис ходи т, почему цв ет метки выполняет ТОЛЬЮ) п е рвое


новое указание элемента Chec kB o x 1 ... Все дело в протоколе НТГР и
во времени жизни страницы. НТГР - пр отоЮ)л не хо чет сохранять

последнее состояние страницы, считая о ч е редн ой запрос к странице


п ерв ым , а сама страница существует ТОЛЬЮ) на время обработки запроса
и затем нем едлен но выгружается, чтобы освободить ресурсы сервера
для работы д ругих страниц.

Наша метка Labe 1 1 обновляет цвет только то гда , Ю)гда срабатывает


обработчик и зменен ия состояния элемента CheckBo x l . А это
происходи т ТОЛЬЮ) тогда, когда броузер пришлет информацию , чт о
прои зо шло событие и зме нения состояния элемента Chec k Bo x 1 .

До п устим, что пользовател ь поставил галочку в Chec k Bo x 1. Броузер


прислал это событие на стран ицу. ASP.NET это событие распознала ,
за п устила наш обработчик и зме нения цвета и в соответствии с новым
состоянием Chec kB o x 1 (checked ) выполнила Ю)Д

LabeI1 .ForeColor := S ystе m.Dгаw iпg. С оlог.Whitе;


LabeI1 .BackColor := Systе m.Dгаwiпg. С оloг.Rеd ;

Этим Ю)дом объект Labe 1 1 будет настроен и сгенерирует броузеру


соответствующий HTML -кod цветной метки. Но при следующей
обратной отсылке, если оставить объект Check Bo x 1 в том же
н еизменном состоянии checked, сведений о событии изменения его
состояния сервер н е получ ит. Поэтому и делать с элементом Labe11
при его создании сервер ничего н е будет, а сгенерирует его нач аль н ое
состояние , уста новленно е в пан ели Propertles. Что пользовател ь в
результате пол учи т от сервера - начальные установки цвета Label1. У
н его стоит гало чка цветности метки, а она присылается совсем с

другим, начальным , цветом.

Чтобы налади ть такую ситуацию, существует механизм сохранения


состояния вида. Э то т механизм встроен в каждый серверный элемент

"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

управления и по умолчанию ВЮlючен. Это значит, что элеме н т на и сходе


жизни (своей и страницы - ''поскольку каждая страница жизни
нач инается с чисто го листа'') ко пи рует н евосстанавливаемые п араметры
своего послед не го состояни я ви да в скры тое поле , в дополнение к такой
же информации други х элемен тов , упаковывая ее для отправки броузеру
Элемент надеется , что в следующей новой жизни (п ри п оступлен ии на
сервер обратной отсылки) о н сможет ра с пакавать свою информацию и
во с станови ть свое послед н е е со стояние ви да.

Некоторые элеме н ты , если ОТЮlючить у них ме ханизм состояния вида ,


все равно MOryr готовить перед своей ко н чиной некоторую ми н имально
н еобходимую информацию (сопиоl state), чтобы BocKpecHyrb
п одобающим образом. Этот механизм мы можем увидеть в НТМL-коде
на броузере , зап ечатлен н ый в скрытых полях, наподобие такой
автоматически закодированной абры - кадабры

<input type= "hidden"


naПlе= "_V IEWSТАТЕ" id="_VI EWSТAТE"
value="!wE PDwU L LТE20DAxOD I 50ТY P ZBYCAgМ P ZBYEAgМ
8WAMHQ2hIY2tlZGdkZGRkAgcPDxYCHgRUZXhOBRHQod l
OL 7QsiEhIW RkGAEF H 19fQ29 udНJ vb H NSZXFlaXJlUG9zdEJl
IfXхУВВQlDаGVjаOJvе D Е КD 82+ рlOhоЗОWiA2УZаdб l З t4 Z !

Атрибyr val ие скрытого поля hidden имеет значение упакованного


состояния элеме н тов управления , которое вместе с ответом п ередается

на временное хранение броузеру

• ~осстановите механ и зм сохран ени я состояния в и да эл е менту


Labe l l нашей страницы , вернув свойство
EnableViewState
в значение True . Проверьте работу элемента Label l, запустив
страницу Теперь все работает как надо - цветность метки
сохран яется п ри каждом ответе сервера!

Отметьте для себя , что сервер н ые элеме н ты сохр аняют интерфейсные


значен ия даже при ВЫЮlюченном меха ни зме сохранения состояния

вида. Про несе рверные (нет атрибyrа runa t == " se r ver " ) HTML-
эл е менты такого не скажешь . Web - элементы с ВЮliЩки Standard - все
серверные .
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Для прим ера добавьте на страницу (в любое место) из вкладки НТМL


элемен т Iпрut (C heckbox). Выполните страницу, измените состояние
элемента и отправьте страницу на сервер. Сервер вернет отклик с
первоначальным состоянием элемента. Если же пр евратить элемен т
Iпр ut (Checkbox) в серверный командой Run As Server ControL то элемен т
при постинге бу,цет сохранять свое состояние.

Этапы выполнения страниц на сервере

СО стороны сервера обработка Web-формы (страницы) средой ASP.NET


происходит поэтапно. На каждом этапе генерируются соответствующие
события, которые наш код может перехватывать и выдавать нужный
ответ. Поток обработки страницы проходит следующие этапы:

• Иници ал и зация структуры страницы


• Иници ал изация кода пользователя
• Про верка достоверност и дан ных
• Обработка событий
• Автоматическая привязка данных
• Очистка

Графически это можно изобра зит ь так


В.М С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

2 И rt " ~ WlИ'J ilJ.IИ Я


cт py t..Т~ pы с;рани цы
( Eiроу.зер ВЫАает .эа про.: 1

!
Ин и цм али.э аЦИ>l
3 IWДOl 1lOJl;.;wвоп еля

!
Про ве pt:a
4 ДОСТQl3 еpt1 ост и

!
ОбрабОТl:а
5 соБЫ ТИЙ

6 I 7
... , \. Броуз е р П ОЛУ"'OIет OТ~

8 Очоост <о

Жизнен н ый цикл стран ицы ASP.NET

Иници ализация структуры страницы

На этом этап е страни ц а за гружается в п амять, р асшифровывается


и н форма ц ия о состоянии ви да (если это обрат н ая отсылка) , за п ускается
событи е Page . In i t . Но это собы тие р ед ко обрабат ы вается
разработчиком , поскольку объект ы элементов управле ни я е ще не
создан ы , а информа ц ия о со ст оянии ви да еще п ол н остью не
рас ши фрова н а.

Иници ализация кода п ользователя

На этом этапе все элемен ты управления уже созда н ы и

"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

инициализированы начальными свойствами. Запускается событие


Page . Load и большинство разработчиков в обработчике этого
события осуществляют программную перенастройку элементов
управления. Событие Page.Load за пускается всегда, независимо от того ,
запрашивается страница впервые или как часть обратной отсылки.
Обработчик можно создать двойным щелчком на свободном месте Web-
формы в представлении Design.

Для определения состояния страницы можно исполь зовать свойство


Page . IsPost Back , которое будет иметь значение f alse при
первом запросе страницы. 1 sPos tBac k является статическим

своЙство.м кnacca Page . ОНО всегда возвращает информ а цию ,


основанную на текущей странице. Можно также испол ьзовать свойство
эюемпляра как t his . IsPostBac k, что р авносиль н о

Page . IsPost Back .

Следует помнить , ЧТО в состоянии вида автоматически сохраняются все


программно и зме н е нные свойства. Инициализация элемента
управления в об р аботч ике события Page.Load считается программным
изменением , поэтому любое затрагива емое нами з начени е элемента
управления БУдет сохранено в состоянии вида. Это без нужды
увеличивает размер страницы и замедляет время передачи данных.

С цел ью ускорения подготовки состояния вида и минимизации размеров


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

в тех случаях, когда действительно легче инициализировать элемент


управления в коде, лучше отключить состоян ие вида для этого элемента

знач ени ем EnableV i ewState= " false " и инициализировать


элемент каждый р аз при запуске события Page . Load н езависимо от
то го , является ли текущий запрос обратной отсылкой и ли поступил
впервые. В качестве упражнения выполним пр о граммн ое
восстановление состояния метки в зависимости от состояния элемента

управления Chec kB o x 1 нашего примера


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

• ~ыделите элемен т упр авле ния Labe 11 и ч е рез пан ель


Properties устан ов ите для него E nableV i ewS t a te= " f a1se "
• ~Юlючите флажок Chec kBo x 1 и мно гократно вып олни те
обратную отсылку, чтоб ы убеди ться , что состояние ви да L abe11
н е сохра ня ется

• ~До п олните блок скр ип тов страни цы Defauh.aspx кодом явного


вы зова обработчика Check B o x 1 Chec k edChanged ()

<%@ Page Lапguagе="С#" %>

<script nmat="server''>
protected void Page_Load(object sender, ЕveпtAгgs е)
(
Label1.Text = 'Текущее время:"
+ DаtеТnne.Nоw.ТоLопgТnneStгiпgО;
Label2.Text = TextВoxl . Text + "!!!";

11 Восстанавливаем Labell программно место состояния вида


С heck Вохl_ С heck ed С hanged( null, Е vепtAгgs. Empty);
}

protected void C heckBoxl_CheckedChanged(object serкler, EventArgs е)


{
if (CheckBoxl.Checked)
{
Label1.ForeColor = Systеm.Dгаwiпg.Соlог.Whitе;
Labell.BackColor = SystemDrawing.Color.Red;
}
e~e
{
Labell.ForeColor = System.Drawing.Color.Black;
Labell.BackColor = SystemDrawing.Color. White;
}
}
</script>

<html xmlns=''httр ://www.wЗ.огgl 19 99/xhtml''>


<head nmat="server">

"
В . М. СН"""'Б Про'ра....МuроваНuе 110 ASP.NET

< title> Н ачальная стран и ца< /titlе>


<lhead>
<body>
< fопn ю::::''fо ml1 '' runat=="server''>
<div styk>::::''text-align: сепtег">
<asp:Labe! ID::::''Label1 '' runat::::"server" Е паыeiеwst atе="fu.lsе" />
& пЬ sр;&пЬs р ;&пЬsр;
<asp :Chec kBox ID="Check Boxl" ruпаt="sеrvе г"
Text::::''Red'' ОпСhес k еdСhапgеd::::"Сhес kВ охl _С hес k еdС ha пgеd" /:
И мя :
<asp :ТextВox I D::::'TextВoxl" ruпа t::::"sеrvег' '> С н eT КOB </as p :TextВox> <

П р и вет дорогой то вари щ (го сп один)


<asp:Labe! ID::::''Labe12'' runat::::"server''> </asp Labe!><br 1>
< Ь г />
< аsр :Вuttоп I D=''Вuttопl'' ruпаt= "sеrvе г " Теxt="Об н о в и ть" 1>
</div>
</foпn>
<!body>
<lhnnl>

Ли с тинг Код с траницы примера Default.aspx

Теп е рь мы ви д им , что элемент La b e 11 р а ботает правильно ,


восстанавливая свое состояние программно в зависимости от

состояни я флажка.

Проверка до стоверно сти

При ф:эрмировании о братной отсылки броузер собирает с эл е ментов


дескриптора < f o rm > зн ачения полей и со стояния. Он не проверяет
соотв етствие типов собира е мых данных ожидаеМblМ значениям.
Например , если текстовое поле ожи дает цифры, а поль зователь ввел
туда буквы , з начени е поля нормал ьно будет передано на с ервер. Но
серверныи код ожида ет цифры и готов применить к ним
мате матич еские операции.

Если вовремя не обнаружить , что поступи л и отличные от ожидаемых


данные , то при их обработке во з никнет и сключит ел ьная ситуация и
В . М. СН"""'Б Про'ра....МuроваНuе 110 ASP.NET

выполнение прервется . Но самое опасное, что анализ ошибки БУдет


отправлен на вывод, которым является броузер клиента. В результате
злоумышленник, отправивший нужным образом искаженные данн ы е со
скриптами, может получ и ть достаточ н о сведений для
н есанкционированного доступа к саЙту.

• ~3апустите стран ицу Defauh.aspx и введите в поле TextВox1


какой-ниБУдЬ текст в угловых скобках

Сервер немедленно п рервет выполнение страни ц ы и выдаст


сообщение Server Еггог in 'lWebSite1' Application с п одроб н ым анализом
ошибки.

Предварительная оценка допустимости дан н ых и называется проверкой


достовер н ости . Проверка достоверности может выполняться н а стороне
клиента, где при об н аружении н есо гласования можн о своевреме н но
п редупредить п ользователя и прервать обратную отсылку Э та операция
чаще всего п ро граммируется на языке сценариев JavaScript.

Но и серверная сторона также проверяет достоверность поступ и вших


данных, п режде чем начать их об р аботку. В ASP.NET предУсмотрены
специал ь ные класс ы ( валидатары ), которые вы п ол н яют п роверку
достовер н ости для закрепленных за ними элементов управле ни я. Но
существует общий способ проверить достоверность всей страницы
сразу. Достаточно в каком- н ибудь обработч и ке п роверить значение
свойства страницы Page.lsValid.

Обработка событий

На этом этапе страница уже полностью загружена и проверена на


достовер н ость . Те п ерь среда ASP.NET запустит все собы тия , которые
П РОИЗОШllи на ЮlИенте со времени последней обратной отсылки .
Различают два вида событий на клиенте :

1. С обытия , требующие немедле нн ого ответа сервера (щелчок на


кнопке Submit, и зме н е ни е состояния элеме н та управле ни я с
уста н овленным свойством Au t oPostBac k, и др.). Эти события
инициируют н емедленную об р атную отсылку.
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

2. Отложенные события изменения состояния - ВЮJючают смену


выбора в элемен те управления или изменение текста в текстово м
поле, но обнаруживаемые ASP.NET только по прибытию
очередной обратной отсылки.

Такая модель событий ASP.NET отлич ается от традиционных локальных


Wiпdоws-прuложенuи. В Wiпdоws-прuложенuи состояни е формы (окна)
ц еликом находится в памяти и способно немедленно отр еа ги ровать на
происшедшее событие . В Web-приложении обработка событии формы
(страницы) прои сходи т только при поступлении обратной отсылки на
сервер. В связи с этим на серве р по ступает сразу несколько
н еобработанны х событий и важно знать, в какой последовательности
они обрабатываются.

Например , п усть у нас есть текстовое поле без автоматической обратной


отсылки и кнопка Submit. Мы изменяем текстовое пол е и щелкаем на
кнопке Submit, тр ебуя от броуэера обратную отсылку. Запрос поступает
на сервер , анализируется средой исполнения ASP.NET, которая
запускает следУЮщие события в таком порядке:

1. Page . Ini t
2. Page . Load
з. Te xt Bo x . Te x tChanged

4. Button . Cl i c k
S. Page . PreRende r
б. Page . Unload

Запоминание этой информации может быть решающим в облегчении


нашей жизни как пр о граммистов ASP.NET. Нельзя подсовывать сырые
за го товки на выходе конвейе р а го товой продукции. ЭТО также важно ,
как помнить о то м, что страниц а существует только на время

формирования очередного ответа ЮJиенту и никаки е переменные


при ложения не сохраняют своих значен и и до следУЮще го поступления
обратной отсылки. В этом состоит отличительная особенность Web-
при ложений.

Автоматическая привязка данных


в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

Важной особенностью современных при ложений любого т ипа является


использование структурирова нны х дан ны х, которые ор га низованы в

базы да нны х. Web-приложения не являются ИСЮJючением. ASP.NET


имеет элеме нты управления и ЮJассы, ав томатизирую щи е процесс

привязки да нны х . При использовании элемен тов управления


источниками данных ASP.NET автоматич ес ки выполняет соеди н е ни е ,
обновление и запрос ы к источнику д ан ных как часть жизненного цикла
страницы.

Существуют два тип а опера ций с источникал1U данных. Любые


изменения (вставка, у,цале ни е, uзменение записей ЕД) выполняются
после обработки всех событий элементов управления, но
непосредственно п еред ген е р ацией события Page . Pr eRender .
По сле запуска собы ти я Page . PreRende r наступает че ред элемен тов
управления источниками данных , которые выполняют свои за про сы и
вставляют извлеченные данные в связанные с этими да нными элеме н ты
управления. При этом ни один обработчик событий элемен тов
отображения уже не БУдет им еть доступа к новым данным.

ЭТО последняя оста новка в ж изн е нном ЦИ ЮJе страницы. И стори чески
сложилось та к, что событие Page . PreRender обозначает посл еднее
действие п еред пр еобразова ни ем страницы в НТМL.

Очистка

В конце свое го жизненного ЦUluю страница пр еобразуется в НТМL.


По сле этого начина ется реальная о чистка и за п ускается событие
Page . Unload . В этот момент объекты стран ицы все е ще доступны ,
но окончательный НТМL уже сгенери р ова н и не может быть и зме н ен .
За т ем система т е ря ет ссылку на объект страницы и сборщик мусо р а
уничтожает б р о ше нн ую па мять. П ослед ним пр едсмер тным писко м
страницы становится событие Page . Di sposed, ко гда сборщик
мусора доберется до нее. С получением сервером очередного запроса
страницы все начина етс я за ново.

Пример страничного потока событий


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Проиллюстрируем рассмотренную последовательн ост ь собы тий


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

Добавление к сайту новой страницы

• ~ыполните оп ц ию меню оболочЮ1 Website/Add New ltem. .. и ли


такую же опц и ю в контекстном меню узла сайта п а н ели So lution
Exp lorer
• u;.;rЗаполните окно масте р а добавления как показано на снимке .
И мя странице пр и свойте PageFlow . азр х , ВЮlюч и те галочку
Place code in separate fiJe (размещать код в отдельном файле) ,
шабло н страницы выбери те Web Fо пn. Щелкните на кнопке Add
.1J~
Т""'pJ"""
ri! о:::


l/ШIiIIIII
D
м." ,... Р"9"
[!j]
_ с_

Ccn'ro l
00
КТf.1.. ""9"
!i
Web S• ..,~e
~
С",,,
~
stj i< SI"e"t

CiiJ
C~,

"«J 1 ~a~ ",


-
[}
crn~l;JJ a ~I ",
~
)(]vI.F,", хм.
\JjJ
Schotm
~
То" Fil2
~
R OЮ'JC .

.
Fi:"
ij
SQ..Doi'->Ь=

1m
Dазset -~, ~
5Ite М"!)
1J]r"
с

M:N e I'Joo
~
\'В5C r "" F(e
lf.jJ
,-,
~
.J5CfjX " "
Ib"diof ' ..m

~
rв::;"
I д form for Wob ц" ь""",
-"'" ~ ф1 jjJ

~W I p~ "w , ,,,p,

L~: I Vislя l С, iI ~ PliO:8 с сОэ n "'1R ае fii3


Г Selea rrвstef IВ'J"

• ~ы п олните командУ Website/Set As Start Page (сделать страницу


стартовой), чтобы при запуске проекта из оболочки она
вы п ол н ялас ь первой. Такая установка приме н яется только в среде
раэработки и не влияет на п орядок загрузЮ1 страни ц на
п ромышленном сервере.

• ~ оместите на стра ниц у из ВЮlадки Standard панел и Toolbox


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

серверный элемент управления Labe! и Вuttоп. О тцен трируй те и х в


режиме Design командой Fопnatl]ustify/Сепtе r
• r;;:;nереименуйте элемент Label1 в IbUпfo
• ~ ерез п а н ель Dосumепt Оutliпе в режиме Design вы д ели те
объект Ib П nfо и в п ан ели Properties уста н ов и те свойство
Е паЫеViеwStatе в состояние false

Отметьте для себя, что установленные отлич н ыми по умолчан и ю


значен ия свойств элементов yn р авления выделяются в поле значений
панели Properties полужирным стилем шрифга.

• Г;;:;=Очистите зн ачен и е свойства Text элемента Ib Uпfo


• ~Двойным щелчком на странице в режиме Design создайте
заготовку обработчика Page_LoadO и растиражируйте ее
редактором кода еще на три обработчика
• ~Двойным щелчком на кно п ке Buttonl в режиме Design создайте
для нее заготовку обработчика ButtonCClickO
• r;;:FЗаполните обработчики следующим кодом

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using Sуstеm.WеЬ.U I .WеЬСопtrоls.WеЬРаrts;
using System.Web.UI.HtmlControls;

public рапia ! class PageF!ow : System.Web.UI.Page


(
protected void Page_Load(object sепdеr, ЕvепtArgs е)
{
11 Объекты созданы и инициализированы начальными знач еJ
11 и возвращенным состоян ием вида
IbUпfо.Техt += "Ср аботал обработчик собы тия Load <br 1>";

if (Page.lsPostBack)
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

{
IblInfo.Text += "< Ь > Эта страница запрашивается не впеРВЫI
}
}

protected void Page_lnit(object sender, EventArgs е)


{
IblInfo.Text += "Ср аботал обработчик собы тия lnit < Ьг 1>";
}

protected void Page_PreRender(object se nder, EventArgs е)


{
IblInfo.Text += "Ср аботал обработчик собы тия PreRender < Ьг I~
}

protected void Page_ Unload(object sender, EventArgs е)


{
11 Не увидим, НТМL уже сгенерирован
IblInfo.Text += "С работал обработчик собы тия Unload < Ьг 1> ";
}

protected void Buttonl_Click(object sender, EventArgs е)


{
IblInfo.Text += "С работал обработчик собы тия Click кнопки <t
}
}

Листинг. Файл отделенного кода PageFlow.aspx.cs

<%@ Page Language="C#" AutoEventWireup=''true'' CodeFile=''PageFIc

< !DQCТYPE html PUBLIC "-/IWЗС/IDТD ХНТМL 1.0 Tгans[ionaVIEI

<html XmInS= ' huр ://www.wЗ.ог&,1999/xhtml' '>


<head runat= "server''>
<tide >Untitled Page</tide>
<lhead>
<body>
<form id ="forml " nmat="server''>
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

<div style=''text-align: center">


<asp:Label ID="lb Unfo " runat::::"selVer" Enab leViewState=''False'';::
<br 1>
<asp:Button ID =' 'Вuttопl '' runat="selVer" Техt=''Вuttоп'' OnClick:
</div>
</fonn>
</body>
<lhtml>

Листинг . Разметха страницы PageFlow aspx


• ~3апустите прило жение первый раз. Сервер сге н ерирует
следующий НТМL - ответ

Сработал обработчик события


lnIt
Сработал обработчик события
Load
Сработал обработчик соБЫТИR PreRender

Butlon

ответ серве р а при первом запросе

• ~елкните на кнопке Subrnit (Button), чтобы инициировать


обратн ую отсылку. На эту и все последующие обратные отсылки
сервер бу,цет присылать такой НТМL-ответ

Сработал обработчик события Inlt


Сработал обработчик события Load
Эта страница э:апрашивается не впервые
Сработал обработчик события Cllck кнопки
Сработал обработчик события PreRender

8utton

ответ серве р а на обратн ую отсылку

Обратите внимание на файл подцержки PageFlow.aspx.cs. Он н е полон -


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

в проuэво дном КIlacce ст р аницы н ет объявлений объектов lbl lnf o и


Buttonl элемен тов управлен ия. Такое в языке С# недоп устимо.
Однако страница нормально ком пили руется и усп ешно выполняется.
Дело все в ключевом слове pa rti al (частичный) в объявлении
класса. Это н ововведе ни е в Visua! Studio 2005. Оболочка сама перед
компиляцией файла добавляет необходимые объявле ни я объектов на
ос н ова нии и нформации о дес криптора х, связа нны х с серверными
элемен там и на основной странице .aspx. Э ТО справедливо , п оскольку на
странице со сме шанны м кодом и раньше не было никаких объявлений
(как и н е было классов).

Обработч ики ст р аниц п одключаются явно с и с п ользова ни ем делегатов


в скрытой ча сти кода конструктора КIlacca стра н ицы . П оскольку этот
скрытый код конструктора с ч итается частью класса стра ницы , он
может подключить любой метод . Обработчики событий элементов
управления п одключаются с помощью иного м еха н изма - дескриптора
элемен та управления. Они привязываются на более по зднем этапе
обработки, после объеди нен ия разметки из файла .aspx и класса
скрытого кода. ASP.NET создает этот объедин ен ный класс п орожде ни ем
н ового класса из класса скрытого кода. Чтобы в этом созданном на лету
классе был и доступны наши обработчики , (теперь получается, чт о
разм еще нны е в баэовом Кf/acce), они д олжны и меть модификатор
доступа p r o te cted.

и е ще од но замеча н ие. Есл и бы мы не уста н овили свойство


EnableViewState метки l bl lnfo в значение fa l se , то

п олучился бы совсем другой резул ьтат. Текстовое знач ение метки ,


сохр аняемое в состоянии вида , до п олнялось бы новыми и зме н е ниями
элемен та п ри каждом следующем ответе . Мы с вами говорили, что если
состояние ви да н е выключ е н о (включено п о умол чанию ), то любые
и зменения состояния элемента уп р авления немедленно в н ем

сохр аняются.

Страница как контейнер элементов управления

При вызове Web-формы (страницы) она загружается в п амять сервера и


создается как объект с и ниц и ализац ией сво и х свойств и срабатыва ни ем
событий . Затем форма запрашивает ге н ерацию кода у всех элемен тов
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

управления страницы. Каждый из этих элементов управления в свою


очередь может содержать до черни е элемен ты управления и каждый из
них тож е отвечает за ге нер ацию собственного кода. По мере генерации
этих элементов управления qюрма собирает полученный HTML -кod в
заверше нную страницу

Ка ждый раз, когда страница создается в ответ на НТГР -за про с , система
AS P.NET инспектирует фай л .aspx. Для каждого найденного
дескри птора элемен та управления она создает и настраивает объект
элемента управления, а затем доба вляет этот объект к странице как ее
дочерний элеме н т управления . Сс ы л ки на все дочерние элеме н ты
страницы размещаются в коллекции Раgе.Сопtrоls.

Пример отображения дерева элементов управления

Прив едем пример пои ска и вывода т ип а и имен элементов управления


страницы. Найденную инqюрмацию БУдем размещать п оследовательно
в конец qюрмируемой НТМ L -стра ницы . Чтоб ы перебрать все до ч е рние
элементы управления страницы на необходимую глуби н у, будем
испол ьз овать рекурсивный вызов функции. Элементы управления
сгруппируем как дочерние в серверном элеме н те Рапеl

• Г;;:;-Добавьте к проекту новую страницу с именем

Con t rolTree . asp x с раздельным кодом в фа йле


С о пtго rrree. aspx. cs.
• ~OMeTbTe ее как стартовую
• ~ оместите на страницу элеме н т управления Рапеl из
вкrJaДКИ Standard пан ели Toolbox
• ~ оместите на панель три кнопки But t on , одну метку Label
и текстовое поле Te x t Bo x

• u;.;rp азместите за пр еделам и пан ели , но вн уг ри дескриптора


< f o r m> , внизу еще одну кнопку В и t ton
• ~ведите сверху и снизу за пределами дескриптор а < fo r m>
статический НТМL-текст внугри дескрипторов параграфа <р>
</р>

Код разметки для получен ной страницы долже н выглядеть при мер н о
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

так

<%@ Page L апguagе="С#" АutоЕvепtWirеuр=''truе''


С ode F ile=' 'с о пtго rrree .asp х. cs"
lпhег its="Со пtrоrrгее" %>

<html xm1пs="httр:llwww.wЗ.огgl1999/xhtml">
<head nmat="server">
<title> Дерево элементов ynравления </titlе>
</head>
<body>
<р>

< i>Это статический текст 1 </i></p>


< fопn kl="Controls" method ="post" runat="server">
<div>
<asp:Panel ID="MainPanel" runat="server" Height="121px" Wklth="267
< аsр:Вuttоп ID="Buttonl" runat="server" Text="Buttonl" 1>
< аsр:Вuttоп ID="Button2" runat="server" Text="Button2" 1>
< аsр:Вuttоп ID="ВuttоnЗ" runat="server" Теxt="ВuttоnЗ" 1>

<р 1>
<asp:Labe! ID=''Label1 '' runat="server" Text=''Labe!''>Name:</asp:La
<aspTextBox ID='TextBoxl" runat="server" Wklth="195px''> </asp:l
</asp:Pane!>
< аsр:Вuttоп ID="Button4" runat="server" Text="Button4" 1>

</div>
</foпn>
<р>

< i>Это статический текст 2</i></p>


<!body>
</html>

Листинг Код разметки страницы ControlTree.aspx

Представле ние этого кода р азметки в о кн е броузера и меет такой вид


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Это статич е ский текст 1

Bu1lon3

Name: L -_ _ _ _ _- '

Bu11on4

Это статический т ек ст 2

Пр едс та в л ени е страницы С опtгоrrге е . а s р х в окн е б р оузе ра

• Г;;:;=Установите для кноп ки Вuttоп4 свойство Тооl Tip


(всплыв аю щ а я по дсказка ) в состояние С ка ни роват ь вс е
• IJ$С о здай те об ра бо тчик кноnкн Button4
• ~3аnолни те кодовый файл так

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public рапial class Controrrree : System.Web.UI.Page


(
protected void Page_Load(object sепdег, EventArgs е)
(
// Начало сканирован ия всех нелитеральных элементов ynраI
DisplayControI(Page.Controls, О, false);

// Горизонтальная линия по окончании вывода


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Response.Write("<hr 1>');
}

protected void Button4_Click(object sепdег, ЕvепtAгgs е)


(
11 Начало сканирования всех литеральных элементов управш
DisрlaуСопtrоI(Раgе.Сопtrоls, О, true);

11 Горизонтальная линия по окончании вывода


Response.Write("<hr 1>');
}

private void DisрlaуСопtrоl(СопtrоlСоllесtiоп сопtrоls, int depth, Ьооl


{
foreach (Сопtrоl сопtrоl in controls)
{
11 Выявлять литеральные (статические) элементы управлеt
boolliteralControl:::: control is LitегаlСопtrо~

11 Отобразить элемент управления


if (litегаlсопtrоl == literalFlag)
(
11 Использовать параметр depth для определения
11 отступов в выводе дерева элементов управления
Rеsроnsе.Wгitе(пеw String('-', depth * 4) + "-->');

String literarrext = "";


if (litегаlсопtrоl)
literarrext = ''text'' + «LitегаIСопtгоl)сопtгоl).Техt;

Response.Write(controlGetTypeO.ToStringO + "- < Ь>"


+ сопtrоlID + literarrext + "<!Ь><Ьг 1>');
}

11 Проверять до черние элементы управления рекурсивно


if (controLControls != null)
(
DisрlaуСопtrоl(сопtгоlСопtгоls, depth + 1, literalFlag);
}

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

}
}
}

Листинг. Код файла ControlTree.aspx.cs


• ~3апустите стра ницу. П осле щелчка на кнопке Button4 должен
получиться примерно такой НТМ L· выход

-- > 5 ystem. Web.UI. НtmlCо пtrоls .нtmlН е а d -


------ >5 ystem. Web. UI.HtmlCo ntrols. Htmmtle -
-- > 5ystе m. Wе Ь .UI.НtmlCо пtrоls .нtmlF о гm - Controls
------ > 5уs tеm.WеЬ.U I .Wе Ь Со пtrоls.Раne l - М а inР а пеl
---------- >5ystem Web.UI. WebCo ntrols.Button - Buttonl
--------- -> 5ystem Web.UI. WebCo ntrols.Button - Button2
--------- ->5ystem Web.UI. WebCo ntrols.Button - Button3
---------- >5ystem Web.UI. WebCo ntrols. Label - Labell
--------- ->5ystem Web.UI. WebCo ntrols.TextBox - TextВoxl
------ > 5уs tеm.WеЬ.U I .Wе Ь Со пtrоls.Вuttоп - Butto n4
-- > 5ystе m. Wе Ь .UI. LitегаlCо пtrо l - text
-- > 5ystе m. Wе Ь .UI. LitегаlСо пtrо l - text

ЭТО стат и ческий текст 1

------ > 5уs tеm.WеЬ.U I . Litе гаlСо пtго l - text

--------- ->5ystem Web.UI. Litera}Control - text


---------- >5ystem Web.UI.Litera}Control - text
--------- ->5ystem Web.UI. Litera}Control - text
---------- >5ystem Web.UI. Litera}Control - text

---------- >5ystem Web.UI. Litera}Control - text


---------- >5ystem Web.UI.Litera}Control - text
------ > 5уs tеm.WеЬ.U I . Litе га lСо пtго l - text
------ > 5уs tеm.WеЬ.U I . Litе гаlСо пtго l - text
-- > 5ystе m. Wе Ь .UI. LitегаlCо пtrо l - text

ЭТО стат и ческий текст 2

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Это стат и ческ и й текст 1

ВuttопЗ

Name: LI_ _ _ _ _ _ __

Bu11on4

Это статический текст 2

Объекты LiteralControl , которые мы определяли в нашем коде и


отдельно р аспечатывали по кнопке Button4, предоставляют нем н огое в
отноше ни и функц и ональн ости . Например , мы не можем п рограмм н о
устанавливать инф:J р мацию, связанную со стилями, наподобие цвета
и ли шрифга. У них также нет ун и кальных серверных и дентификаторов .
Одн ако мы можем манипулировать содержимым Li teralCont r o l с
и спользован ием е го свойства Te xt, что и продемонстрировано в
п оследнем п римере.

Здесь при рекурсивном обходе дерева элементов ynравления мы


учитывали тот факт, что ASP.NET генерирует страницу ие р архичесЮ1 .
Она генерирует непосредственно тольЮJ верхний уровень элемен тов
ynравления , т.е. только свойство · контейнер ( коллекцию элемен тов
ynравления ) Controls самой страни ц ы. Если какоЙ·то элемен т
ynравления содержи т дочерние элемен ты , т. е . сам является

кон тейнером , то он имеет свое собственное свойство - контейнер


Controls.

Обратите в н имание, что задав свойство Тоо1 Т i p коно п ки Вuttоп4, мы


организовал и дл я пользователя п оявление всплыв ающей подсказки п ри
н аведении курсора мыши на кнопку Фактически серверный элемен т
But ton 4 с генерировал в своем НТМ L -выводе атрибyr
titlе= " Сканирова ть все ".

Прог раммное управление заголовком страницы

'"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

Ранее мы говорили, Ч ТО чтобы сделать дескри п тор НТМL элемен том


управления, н еобходимо добав и ть в него атрибуг runa t = " serve r" .
Но в ска ни рованном выводе последнего п р и мера система ASP.NET
н аlШlа элемен т управлен ия заголовком стра ниц ы

System Web .ш.н tmlСопtrоkНtmlНеаd

VlSual Studio 2005 автоматически считает дескри п тор < h еа d>


серверным элементом. Значит мы можем управлять им про гр амм н о .

Объект HtmlHead наследует предо п ределенный интер~йс


IPageHeader и содержи т следУЮщие свойства:

• тi tl е - назва н ие НТМL-стран и цы , которое отображается в


заголовке броузера
• Lin kedSty l eSheets - коллекция объектов для настройки
стилей все го докумен та через вне lШl ЮЮ таблицу стилей
• StyleSheet - настройка встраиваемых стилей
• Metada ta - коллекция объектов для н астройки дескрипторов
метаданных

Пример:

Page.Header.1it1e := "Это программно задан ный заголовок";


Page.Header.Metadata.Add('Keywords", ' 'Рыжик, Пыжик, ГдеТыБыл ");
Page.Header.Metadate.Add(Descriptlon", ' 'Русские народные мелодии'');

Элеме н т управления HtmlНead п олезен на сверхдинам и ческих


стра н и ц ах, когда может возникнуг ь потребност ь в изменении Юlюч евых
слов и н азван и я НТМ L -стран ицы в зависимости от содержимого
запроса п ользователя.

Пример создания элемента управления во время


в ып олн е ния

с ис п ользованием коллекции Con t rols можно на лету создать и


добави ть к НТМL-выводу любой элемент управле н ия. Приведем
п ример , динам и чески создающий кн о п ку в HTM L -ВbIвоАе. Пусть у нас
и меется код

'"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

• IJ$Добавьте к nр оекту nредыдщегоo при мер а новую страницу с


разделенным кодом и именем Dynam i cBu t ton . Сделай те
страницу стартовой.
• ~ оместите на ст р ани ц у из ВЮJaДКИ Standard элемен т
yn р авления Рапеl , метку Label , три кнопки Button , а из

ВЮJaДКИ НТМL - элемен т Hor i z on tal Rule

Настройте ин терфейс стра ницы време ни nр о е ктирования так

Dуn.зmicВutton.3SPХ.СS DvnamicButton,aspx*

ООелкните на динамически созданной кнопке

• Reset Text

Create Butlon Remove Butlon

• ~3аnолните обработчик за гр узки стра ницы следующим кодом

риы ic ра пial class DynamicButton: System.Web.UI .Page


(
protected void Page_Load(object sепdеr, ЕvепtArgs е)
(
// С о здать н ов ы й объект кн опки
Button пеwВ uttо п = пеw ВuttопО;

// При сво ить знач е ни я свойств


пеw В uttоп.lD = ''nеwВuttоп'';// П омет и л и
пеw В uttоп.Техt = "* ОynaпUc Button >!о";

// Добави ть кнопку в колле кци ю элеме н тов ynр а вле ни я фор м


fo rml .С о ntro Is.Add(newButto п) ;
}
}

. Начальный ход динамичесхого


Листинг создания хнопхи

• ~3аnусти те страницу на выполнени е . Получится такой

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

результат

Щепкните на динамически созданной кнопке

Resel Тю:l .

Сгезlе Bullon LRemove Bullon


± Dynamic Bulton ±

НТМL · вывод стра ниц ы ди на мического создания кно пки

Мы п олучили то, что дин амически созданн ая кнопка оказалась в конце


декскр иптора <fo r m> . Для получения большего контроля над
расположен и ем динамического элемента управления можно

использовать элеме н т управл е ния PlaceHolder. Целью элемен та


управления Р 1 асеНоl der (держатель места) является р азмещение
д ругих элементов управления. Если ра змест ить элемен т

PlaceHolder на форме и не добави ть в его коллекц и ю Cont r ols


Д Р)'П1х элементов, он ничего не и зме нит на окончательном HTML-
выводе .

• Г;;:;nоместите элем ент управления Р 1 асеНоl de r впереди


кнопки с названием 'Reset Text" и перепишите код так, чтобы
дин амически создаваемая кно пка добавлял ась н е в коллекцию
формы , а в коллекцию PlaceHolder

// Добави ть кнопку в коллекцию PlaceHolder1


р \асе Н о Id е г 1. С о пtго ls.Add (пеw Butto п);

Те п е рь НТМL·вывод должен бы ть таким

Щепкните на динамически создан н ой кнопке

"Dynamic Bulton" Reset Тех!

Creale Bulton Remove Bulton


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

НТМL-вывод страницы динамического создания кнопЮ1

При использовании динамических элементов управления следует


помнить, они создаются только при срабатывании обработчика , где
размещен их код. Чтобы элемент динамически создавался при каждой
загрузке ст р аницы, его код следует разместить в обработчике
Page Load () или Page I n l t ()

Невзирая на способ создания элемента управления, его информация о


состоянии вида автоматически посылается на сохранение клиен ту

Может получиться такая ситуация, что в текущей ст р анице мы создали


динам и ческий элемент управления и информация о состоянии вида
yumа юшенту Но при следующей обратной отсылке мы не стали
создавать этот элемент и информация о состоянии вида осталась
невостребованноЙ. Ну и ладно, ничего страшного.

Если мы собираемся взаимодействовать с динамически созданным


элемен то м управления дальше, то ему следУет присвои ть уникальный
идентификатор, что мы и сделали в нашем прим ере . Мы можем
использовать этот идентификатор для извлечения элемента управления
из коллекции Con t rols родительского контейнера. Можно найти

элемен т управления с использова ние м рекурсивной лотки поиска , как


мы это делали в стран иц е
Controrfree.aspx. Можно для поиска элемента
использовать статический метод Page . FindCont r o l () .

Для при мера добавим функциональность к кнопке с названием Rепюvе


Вuttоп, которая бу,цет у,цалять динамичесЮ1 созданную кнопку Если с
обратной отсылкой прид ет событие (сообщение), что пользователь
щелкнул на кнопке Rепюvе Button, то мы должны БУдем найти
динам и чески созданную ранее в обработчике Page Load () кнопку и
удалит ь ее из страницы. И в уже готовящемся н а шей страницей HTML-
выводе этой кнопки н е БУдет.

• ~Двойным щелчком на кнопке с названием Rепюvе Button


создайте для нее обработчик, который заполни те так

protected void ВuttопЗ_С liсk(оЬjе сt sender, ЕvепtAгgs е)


{
// П о иск кнопки вне зависим ости от иерархич е ского

,ОС
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

// уровня, в котором она расположена

Вuttоп fо uпdВuttо п = (Вuttоп)Раgе.FiпdСопtrоЧ"newВuttоп'');

// Удале ни е кнопки с п р о веркой услов ия , чтобы


// не пытались Удалить уже удале нный объект
if (fouпdВuttоп != null)
(
// Удаляем из коллекции родительского элеме н та управления
fouпd В utto п. Р агепt. С о пtrо ls. Remove( fo uпd Button);
}
}

Листинг Обработчик события кнопки Remove Button в


файле DynamicButton.aspx.cs

Следует заметить, что по след ний оператор п риведенного кода


Remove () не Удал яет объект кнопки физически, а удаляет только
ссылку на кнопку из коллекции Р 1 асеНоl de r . ЭТО значит, что кнопка ,
однажды созда нн ая в обработчике Page Load () , продолжает
существовать в контейнере Page стра ницы и мы всегда можем ее
использовать дал ьше.

Динамически добавле нные элеме н ты управления могуг обрабатывать


события. Нужно лишь п одключить обработчик события с
использован ием кода-делегата . Подключать события обязательно
нужно в обработчике Page_LoadO, иначе БУдет поздно , по скол ьку все
поступившие с обратной отсылкой события клиента ген ерируются сразу
после события Page . Load. Если код п одключения события с помощью
делегата разместить в другом месте, обработчик события не сработает,
поскольку система это событие уже с генерирует и, не найдя
соответствующий обработчик, оставит без внимания .

• г;;.:;='Добавьте в кон ец обработчика Page Load () следующий код

protected void Page_Load(object sепdег, ЕvепtAгgs е)


{
// Создать новый объект кнопки
Вuttоп пеwВuttоп = new ВuttопО;

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

// Присвоить значения свойств


пеwВuttоп .I D = ''nеwВuttоп'';

пеwВuttоп . Техt:::: "* Dynamic Button >!о";

// Добавить кнопку в коллекцию PlaceHok:ler1


Р \асе Ho!d ег 1.С о пtго Is.Add ( new Button);

// Подключение обработч ика собblТИЯ Button.Click


// ди намически созданно го элемента уп р авления
пеwВuttоп . Сlick += new EventHand!er(newButton_ Click);
}

void newButton_Clk:k(object sender, EventArgs е)


{
Labe!l .Text:::: "Э тот текст прислал обработчик" +
"дин амически созданной кнопки";
}

Листинг ПОДJCлючение обрабОТЧИJCа события динамичесJCИ


созданного элемента управления

• г;;;?Сбросьте для метки Labell свойство сохранения состояния


ви да , назначив EnableViewState=fa l se

ОкончатеЛЬНblЙ вариан т страН ИЦbl д олж е н бblТЬ таки м

<%@ Page Lапguagе= "С#" АutоЕvепtWirеuр=''truе''


CodeFile="DynamicButton.aspx.cs" Inherits= ''DynamicButton'' %>

<html xmlns=''http://WWW.W3.0rgl1999/xhtml'' >


<head nmat="server">
< title >Uпtitled Page</tide>
</head >
<body>
< fопn id="fo rm1 " ruпаt="sеrvег' '>
<div>
<asp:Labe! ID="Label1" ruпаt="sеrvег" Теxt='Щелкните на динамичео
Width="431 рх" ЕпаЬ !е ViewS tate=''F alse"> </asp:Labe!> < Ьг />
<br />
<asp:P \aceHo!der ID::::"Place Ho!der1 " ruпаt:::: "server''></asp:P IaceHo!der>

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

&пЬsр;
< аsр:Вuttоп ID::::''Вuttоп1 '' ruпаt::::"sеrvег" Text::::''Reset Text" I>< br 1>
<ш 1>
< аsр:Вuttоп ID::::''Вuttоп2 '' ruпаt::::"sеrvег" Text::::"Create Вuttоп" 1>
&пЬsр;&пЬsр;
< аsр:Вuttоп ID::::''ВuttопЗ '' ruпаt::::"sеrvег" Теxt::::''Rепюvе Вuttоп" ОпСliсk=
</div>
</form>
<!body>
<lhtml>

Листинг
DупаmiсВuttоп.аsрх
Дескрипторная часть страницы
• файле

usiпg System;
usiпg System.Data;
usiпg Systеm. Со пfigша tiоп;
usiпg System.Collections;
usiпg System. Web;
usiпg System. Web.Security;
usiпg System.Web.UI;
usiпg System. WеЬ.UI.WеЬСопtгоls;
usiпg System. Web. UI. WеЬСопtгоls. WebParts;
usiпg System. WеЬ.UI.НtmlСопtrоls;

public partial class DynаmicВuttоп: System.Web.uI.Page


(
protected void Page_Load(object sепdег, EventArgs е)
(
11 Создать новый объект кнопки
Вuttоп пеwВuttо п :::: пеw ВuttопО;

11 Присвоить знач ения свойств


пеwВuttоп.ID :::: "пеwВ uttоп";

пеwВuttоп.Техt = ''* Dynamic Вuttоп *";

11 Добавить кнопку в коллекцию PlaceHolder1


Р !асе Н о k:ler 1. С о пtrо 1<;. Add( пеw Butto п) ;

11 ПОДЮIючение обработчика события Вuttоп.Сliсk

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

11 динами чески созда нного элемен та управления


пеwВuttоп. С liсk += new EventНandler(newButton_Clk:k);
}

уою пеwВuttоп_ С liсk(оЬjесt se nd er, EventArgs е)


(
Labell.Text = 'Э т от текст прислал обработчик" +
" динамически созданной кнопки ";
)

protected уою ВuttопЗ_С lk:k(о Ьjесt sender, EventArgs е)


(
11 Поиск кнопки вне завис и мости от иерархического
11 уровня , в котором она расположена
Button fОШldВuttоп = (B utton)Page.FindCo ntro ~ ' 'ne wButton' ) ;

11 Удале ни е кнопки с проверкой услов ия , чтобы


11 не пытал ись Удал и ть уже удале нный объект
if(foundButton != null)
(
11 Удаляем из коллекции родител ьского элемента управления
fo undButto п. Р arent. С о ntro Is. Remove( fo undButto п) ;
}
}
}

Листинг Кодовая часть страницы в файле

DynamicButton.aspx.cs

• ~Запустите и испытайте закодированную страницу

DynamicButton.aspx

в окне броузера мы ви дим, что при каждом вызове страницы


д инамическая кнопка создается на сервере и посылается ЮJИенту. При
нажатии кнопки Rепюvе Button послан ное на сервер событие вызывает
срабатывание обработчика удаления кнопки и з коллекции. Посылка
дан ны х на сервер при нажатии других незапрограммирова нн ых кнопок

опять создает динамическую кнопку и добавляет ее в контейнер .


Щел чок на ди н амической кнопке запускает обработчик смены текста в
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

метке Labe1 1 . Щел чок на любой другой кнопке восстанавливает


первоначальное содержимое метки Labe 1 1 , поскольку мы сняли

свойство сохранения состояния вида.

Создание динамического элемента управления дополняет


пользовательские элементы управления , явно размещаемые на ф:Jрме на
этапе проектирования (подцерживаемые дескрипторами). В некоторых
случаях это может быть мощным дополнением или единственным
средством при создании сложных страниц.

Класс Page

Класс Sys t em . Web . UI . Page является базовым для классов


создаваемых ст р ани ц . В локальных приложениях такую роль играет
масс Form . Это значит, что динамические страницы наследуют
множество полезных свойств и методов класса Page . Класс Page
служит контейнером имен всех элементов управления, входящих в
состав страницы. ASP.NET создает новое виртуальное пространство
имен , гара н тирующее всем дочерним элементам управления

уникальность имен в пределах всего дерева элементов управления.

Свойства класса Page можно разделить на три группы:

1. Внугренние объекты
2. Рабочие свойства
з. Специфические страничные свойства

На данном этапе мы коснемся только первой группы свойств.

Когда ASP.NET загружает страницу в память серве р а, она создает


объект, порож.ценныЙ от класса Page . Одновременно создаются
объекты первой группы и их имена становятся свойствами страницы­
объекта. В эти объекты записывается инф:Jр мация, важная для
управления всей страницей. Перечислим свойства-объекты страницы.

Внугренние объекты ASP.NET в составе класса PagE


Свойство­
Порож.цающиЙ класс
объект

'"
В.М. С """,,,в Про,р а ммupoвtJNШ' 110 ASP. N ET

ApplicationSys t em . Web . HttpApplicationSta t e

СасЬе Sys t em . Web . Caching . Cache

Request Sys t em . Web . HttpRequest

Response Sys t em . Web . HttpResponse

Serve r Sys t em . Web . HttpServerUtil i ty

Sess i on Sys t em . Web . Sess i onS t ate . HttpSessionSta

Ттасе Sys t em . Web . TraceCon t e x t

Use r Sys t em . Secu r ity . Principal . IPrincipal

Объекты Session, Application, Cache

ш
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Объект Sessi оп предна з н ач ен для хранения любого тип а


пользовательских данных, ю:порый должен постоянно существовать
между за пр осами Web-страниц. Он предоставляет словарный достyn к
набор у пар имя=значение, содержащему пользовательские данные
текущего сеанса. Состояние сеанса часто применяется для
обслуживания информации наподобие имени и идентификатора
пользователя , покynат ельской тележки либо ДРYJl1х элементов ,
удаляемых, когда пользователь покинул страницы Web-саЙ та.

Объект Application содержит словарь данных имя=значение ,


гл обальных для всего при ложен ия.

Объект Cache также хранит глобальную информацию, но


предоставляет более динамичный механизм хр анения, по скольку
ASP.NET может удалять в н ем часть информации при нехватке памяти
сервера. ЭТО тоже коллекция объектов имя=значение , однако здесь для
каждого элемента можно также уста нав ливать специализированные

политики истечения срока и определять зависимости.

Объект Request

Этот объект представляет значения и свойства НТГР -за проса ,


вызвавшего загрузку страницы. Он содержит все п араметры URL и
другую инфор мацию , отправляемую клиен том. Мы можем использовать
объект Reques t, чтобы обнаружить, какой броуэер используется
клиентом, или устанавливать и анализировать cook ie -наборы (куки
). Ниже приведены наи более р ас про странен ны е свойства масса
System . Web . НttрRеquеst ,порождающегообъект Rеquеst

Свойства масса Sys tem.~

Свойство Порождак

ApplicationPath string

Physica l Path string

ш
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

AnonymousID string

Browser Sys t em . Web . HttpBrowserCap

Cl i entCert i ficate Sys t em . Web . HttpClientCert

Cookies Sys t em . Web . HttpCookieColl

Fi l ePa t h string

Curren t ExecutionFilePathstring

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Form Sys t em . Collections . Specia

Headers Sys t em . Collections . Specia

ServerVariables Sys t em . Collections . Specia

IsAuthenticated bool

IsSecureConnec ti on bool

IsLocal bool
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

QueryS t ring Sys t em . Collections . Specia

Ur l Sys t em . Uri

Ur lR eferrer Sys t em . Uri

UserAgent string

UserHostAddress string

UserHostNa me string

UserLanguages string

Объект Response

Этот объ ект содержит июlюрмацию и методы qюрмирования ответа


Web - сервера на за пр ос ЮlИента. В таблиц е перечисл ены основные

'"
В.М. С """,,,в Про,р а ммupoвtJNШ' 110 ASP. N ET

свойства и методы объекта Response .

Основные свойства и методы объекта Respons(


Член Тип

Buffe r Outpu t boo l

СасЬе System . Web . Ht tpCachePolicy

Cook i es System . Web . Ht tpCookieCollec t ion

Ex pires i nt

ш
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

IsClientConnec t ed boo l

Write(char) ;

Write(char [ ] ,
int , int) i

Write(objec t )

Write(string)

BinaryWrite(byte[
] )
В.М. С """,,,в Про,р а ммupoвtJNШ' 110 ASP. N ET

Wri teFi l e( I ntP t r ,


long , long) ;

Wri teFi l e(s t ring)

Wri teFi l e(s t ring ,


bool) ;

Wri teFi l e(s t ring ,


long , long)

Redirect(string) ;

Redirect(string ,
bool)
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Прим е р :

// Перенаправляем н а файл в текущем каталоге


Res ponse .Redkect(''newpage .asp х");

// Перенаправляем н а другой Web-сайт


Res ponse .Redkect(..http://www.dia)og-service .net•.) ;

Объект Server

Основные свойства и методы о бъекта Server


Член тип О пю

Представляет
ком п ьютера , f

за п ускается ст

MachineName str i ng и мя Web-серв


и с п ользуемое

с ц елью его и /

для остальной

Создает эюем
объекта , о п ре/
п ро гр амм н ым
CreateObject(string) i
и дентификато
CreateObject(System .T ype) Ис п ользуется
совмест ИМОСl

yn рощает взау

СОМ-объекта

И звлекает объ
п ослед н е го не

н улевую ССЫЛI

И СЮJюче ни я н
В.М. С """,,,в Про,р а ммupoвtJNШ' 110 ASP. N ET

ИСЮJюч е ния н
GetLas t E r ro r ()
Используется
событий при л
пров еряющеп

ситуации.

Осуществляет
кодирование (
допустимыми
Htm lEncode(st r ing) ;
которые н е БYi
Htm lEncode(st r ing , воспринимап

System .I O . Te x tWrite r ) ynравляющие

&g t ; & &аг

ж ес т к и й Пf
&пЬзр )

Htm lDecode(st r ing) ; Осуществляет


операцию по
Htm lDecode(st r ing ,
НТМL-кодиро
System .I O . Te x tWrite r )
строке симво.

Заме няет обы '


Ur l Encode(s t ring) ; строкой допус
символов UЮ
Ur l Encode(s t ring ,
проб елы и др:
System .I O . Te x tWrite r )
спец символы ,

кириллицу, %,
Url Decode(s t ring) ;
Раскодирует с
Ur l Decode(s t ring ,
символов uю
System .I O . Te x tWrite r )

Выполняет те

что и UrlEnc
работает с ба~
Ur l TokenEncode(byte[ ])
массивом, кот

сод ержит дaНl

Base64
Выполняет те
В.М. С """,,,в Про,р а ммupoвtJNШ' 110 ASP. N ET

работает с ба~
Ur l TokenDecode(s t ring)
массивом, кот

содержит дaНl

Base64
Возвращает фJ
файл , соответ,

MapPath(string) определенноrv

виртуальному

на Web-сервеI

Передает ист
другой Web-cl
текущем прил

метод по хож f
Transfer(string) ;
Response . 1
Transfer(string , boo l ) ; но работает бl
н ельзя примеl

Transfer(System . Web . I HttpHandle r, п еремеще ни я

bool) на сайт, распо


другом Web-сЕ
на страниц)'; с

ASP.NET (нап
или ASP)

При использовании метода


Se r ver . Transfer () не прои сходит
полного ЦИЮJa. Вместо этого механизм ASP.NET пр осто загружает
новую стра ниц у и начинает ее обработку. В результате URL,
отображаемый в броузере клиента, не меняется ( ... хотели кока , а съели
Кука).

Например:

// Мож н о п еремест ить ся н а фа йл в те кущем We b -п р иложе нии


5 erver.Тг ansfer(''newpage .aspx');

// П е р еме щат ь ся н а другой Web-сайт н ельзя .


// Э ТО вы зовет о ши бку! ! !
5 erver.Тг ansfer(''http :J/www.prosetech.com');

ш
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

5 erver. Тг ansfer(' 'http://www.prosetech.com'');

Метод Se r ve r . MapPath ( ) является еще одни м поле зным методом.


Пусть, например , мы собираемся загрузить файл под названием info.txt
из текущего виртуального катало га . Вместо жесткого кодирования пуги
можно использовать Reques t . Appl i cat i onPath () , чтобы
получить текущий относительный виртуальный каталог. Затем
применить метод Se r ver . MapPa t h ( ) - для преобразования его в
абсолютный физический пугь.

Например:

string physicaIPath = Server.Ma pPath(Request.ApplicationPath


+ "/info.txt");

// Открытие файла
StreamReader reader = new StreamReader(physicaIPath);
// Что -то делаем
reader.CloseO;

Объект User

Объект Use r содержит инф:Jрмацию о пользователе , запрашивающем


Web-сервер, и по зволяет про верить принадлежность этого пользователя
к роли. Он полезен только тогда , когда при ложение выполняет какую­
л ибо ауген тифи кацию , ограничивающую доступ анонимных
пользователей. ЭТО отно с ится к вопросам безо па сности.
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Серверные элементы управления

Серверные НТМL-дескрипторы. Программная устан овка свойств


серверных НТМ L -дескри пторов. Программное создание серверных
НТМL-дескрипторов. События серверных НТМL- элемен тов. Обработка
событий ServerClick и ServerChange. Web-элементы управления. Базовый
масс WebControL Программное управление свойствами Web-элементов
управления. Обработка соб ы тия Changed. Списковые Web-элементы
управления. Элемен ты пр оверки достоверности (валидаторы). Элемен т
RequiredFieldValidator. Элеме н т CompareValidator. Элемент RапgеVаlidаtог.

Файлы к лекц ии Вы можете скачать здесь скачать:

http://Oи. intШ . ruld epartment/intemet/p rasp пеt/4/О4 _ We bS ite з. zip

Серверные элементы управления п озволяют реализовывать миен тский


ин терфейс управления страницей. Большинство из них в режиме
про ектирова ния отображается на НТМL- дескри пторы , но в режиме
выполнения они представляют экзем п ляры массов, допускающих

прогр амм но е управление. Некоторые элемен ты управления MOryr


генерировать сложный HTML-Kod и дополнять е го кодом сценариев
Java Script, по зволяющим ор гани зовать требуемую функциональность на
стороне миен та. Такие элементы управления на зывают

пол нофункциональными .

Чтобы элемент управления был серверным, он должен иметь в


дескрипторе НТМL-представления атрибуг runa t= " server ". Только
при это м условии среда исполнения ASP.NET при загрузке страницы
создаст для него объект (экземпляр соответствующего масса) и
по зволит пр ограммно управлять этим объектом. В про тивно м случае
НТМL-дескриптор будет отправлен миен ту без соответствующей
обработки.

Дескрипторы серверных элементов и представляющие их массы в


среде ASP.NET находятся в однозначном соответствии. По это му на
этапе nраектираванuя мы можем и зме н ять свойства элемен тов
управления как через дескри п торное представление, так и через

свойства представляющих их массов. Естественно , что программное


управление элементами (на этапе выполнения) возможно только через
код пр едставляющих их массов.

'"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Совреме нн ые серверные элементы управления с вкладки Standard


п анели инст р ументов Toolbox в своем НТМL- представлении обязаны
соде р жать атрибyr runat= " server ", в то время как в случае
п риме н е ни я элементов управления с вкладки НТМL разработчик волен
сам р аспоряжаться свойством их серверности. Назначение элемен та
НТМL сервер н ым можно выполнить П РЯМОЙ вставкой атрибyrа
run а t = " зе rve r " в дескри п тор элемента или через контекстное

меню для это го элеме н та выполнением кома н ды Run As Server Со пио!

011 Cut

I~ сору

~ Paste
Р aste Alternate
'х Delete

Style ...
Rlfl As Server ContIoI
I I
V~w code
V~w Component Dбignег

i!l View in Бrоwsеr


-

Edit Image

Show Smзгt Tag

liJ Re~esh

i;;\ Properties

Группы элеме н тов управле ни я по и х назначе ни ю распределены в VlSua!


Studio 2005 по вкладкам , п е речислим ос н ов н ые и з ни х:

1. Standard серверные элементы упр авления с развитой


функциональностью и программным управлением. Среди них
имеются полнофункциональные элемен ты управления ,
вы п ол н яющие гене р ацию сложно го HTML -кod a и клиентских
сценариев JavaS cr~t для создания и н терфейса на клиен те. ЭТО
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

такие элементы как Calendar, AdRotator, TreeView. И х н азывают


серверными Web-элемента ми yn р авления. Он и с п особны
генерировать н есколько НТМL -дескрипторов. Они даже с п особны
сами за пр ашивать и о пр еделят ь ти п броуэера кrlИе нта и
ав томати ч ески п одст р аивать под эти возможности свой
рен де ринг (НТМL -в ывод)
2. НТМL - типовые НТМL- элементы (представляются тип овыми

НТМL -д ескрип торами), но с преобразованием их в серверные


до пускают программное ynравление и самостоятельн ую

генера цию клиен тской НТМ L - разметки. Их называют серверными


НТМL - элемен тами ynравле ни я. Они с п особ ны генерировать
только один НТМL-дескриптор и оставле ны для совместим ости с
р анней техноло гией AS P
з. Validation - элементы ynравле ни я проверкой достовер н ости . Э тот
набор элемен тов ynравле ния п озволяет быстро провери ть
достоверность связа нн о го элемента ynравления ввода на предмет

соблюде ния нескольких ста н дартных ил и пользовательских


пр авил. Н апример, мы можем указать , что ввод не может бы ть
п устым, что это ДОЛЖНО бы ть ч и сло, что оно д олжно находиться в
определенны х пр еделах, и т.д. В случае нарушения таких условий
можно отме ни ть пр инятие данных, отобрази ть сообще ни е дл я
пользователя, напр авить на другую страницу для ликвидации

безграмотн ости или п окояния, н аконец , - по слать куда- ни будь.


4. Data - элемен ты управления данными. Они позволяют ynравлять
источниками данных с при вязкой декла р ати вно, через свойства ,
без напи са ния дополнительного кода. И меются , также , элементы
отображ е ни я больших объемов данных в требуемом формате , с
подце р жкой до полнительн ы х настро ек наподобие возмож н ости
редактирования , сортировки, разби е ни я на стран ицы .
S. Navigation - элеме нты ynравления н авигаци ей. Они позволяют
п ользователю п е р емещаться с одной стра ницы на другую ,
отображают карту сайта и др.
б. Login - элементы ynравления входом в си стему. Э ти элементы
yn р авления п одцерживают аутентификацию пользователя с
помощью форм с хране ни ем хэширова нны х (закодированных)
сведений в базе да нны х и отслежива ни ем их состоя ни я. Вместо
написания своих собстве нны х и нт е р фейсов для р аботы с
аугентификацией можно испол ь зовать готовые решения с
настройкой стра ниц входа в систему, восстановления паролей и
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

мастеров создания новых пользователей.


7. WebParts - элементы управления для построения компо н е нтны х,
легко конфигурируемых Web-порталов (больших саЙтов).
8. Mobile Web Forms - элементы управления для подцержки
моб ильны х клиентов. Эту вкладку (как и много других) МОЖНО
получить, если вызвать на пан ели Too lbox контекстное меню и
выполнить команду Show AIL Мобильные элементы управления
обладают высокой степенью адаптации. При создании страницы
с использованием этих элементов страница может генерировать

НТМL - разметку в зависимости от типа запросившего ее


устройства . ЭТО может быть стандарт НТМL 3.2, WML 1.1, XHTML
или НТМL 4.01 , включая код JavaScript - в зав иси мости от
возможностей броузера мобильного юшента.

Серверные НТМL-дескрипторы

Ранее мы говорили , ЧТО любому дескр ип тору НТМL можно присвоить


атри буг r unat= " server ". И система про ектирования при
разработке стран ицы , и среда исполнения - после компиляции, сразу
поставят ему в соответствие свой подцерживающий масс из
библиотеки .NET Framework 2.0. А это значит, что таким элемен том
можно БУдет программно управлять. Нам, как прогр амм ис там ,
страждущим управлять элементами управления, важно знать свойства и
методы подцерживающих их библ иотечных классов, с использованием
которых и возможно программное управление.

Класс, пораждающий объект элемента управления , является конечным


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

Все серверные элементы управления имеют в качестве одного и з своих


предков масс Sys t em . Web . UI . Cont r ol . Этот факт можно
использовать для манипулирова ния элементом управления на странице

даже в случае, если е го конкретный тип неизвестен. Следующий в


цепочке наследования серверных НТМL-элементов является класс

m
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

System . Web . UI . Ht mlCont r ols . Ht mlCont r ol . Ни ж е на

ри сунке п р и в еде но дер е во на сл е дования с е рверны х НТМL·элем ен тов

By s"tвm Obj ffi

r ------ - -- ------- \
Пространство имен System.Web.UI.HtmIControls
I I
rttmlCQntrQI
f--- I
I
I Htmll npuК: Q n trQ I
I I rtt mICQnt..inerCfJ ntгQ I
I --1 ~m l l mage II

Н ~ ГГ1 ~ прutВutroп
I Н НVnlAnc t"юг
I --1 HVnllink
II
н HtmllnputSubmit
I Н HtmlButton
I --1 Н tmI Ме1З
I I
н HtmllnputRaset
I Н НtmI FQПТ1
I --1 H tmrТi ll e
I i I
Н ~m llnputC~сkБQХ I Н H(mlSe-lect
I
Н Нtm llп put FПе
I Н Htmrтable
I

Н Htm ~n ~ idde n
I Н Нtmrfa bIeCel1
I
Н Himllnputlmage
I Н Htm rтabkoR ow
I

Н HiJТIll nputR adiQButtQn I Н нtm ГfextP.re <!


I I

Html l npufТext
I Ч Html(ienericContro l нtm lHe<! d II
I
I нt m n n putPa ssword I I
)
" --------
Пока за нны е на р и сунке массы
-----------
и м еют следую ще е соо тветст в и е с

дескрип торным пр едст авл е ни е м

'"
В.М. С """,,,в Про,р а ммupoвtJNШ' 110 ASP. N ET

Серверные эл ементы упра вл ения НТМL и и х массы

Сер верный дескр иптор НТМL Подцержива ющий м асс

<а r unat= " server " > Ht mlAncho r


<button r unat= " server " > Ht mlButton
<fo r m runat= " serve r " > Ht mlFo r m
<img r unat= " server " > Ht mll mage
<input type= " button "
Ht mllnputButton
r unat= " server " >
<input type= " reset "
Ht mllnputReset
r unat= " server " >
<input type= " subm i t "
Ht mllnputSubm it
r unat= " server " >
<input type= " chec k bo x "
Ht mllnputCheckBo x
r unat= " server " >
<input type= " fi l e "
Ht mllnputF i le
r unat= " server " >
<input type= " hidden "
Ht mllnputH i dden
r unat= " server " >
<input type= " image "
Ht mllnputl mage
r unat= " server " >
<input type= " radio "
Ht mllnputRadioBut t on
r unat= " server " >
<input type= " te xt"
Ht mllnputTe x t
r unat= " server " >
<inpu t type= " passwo r d "
Ht mllnputPassword
r unat= " server " >
<selec t r unat= " server " > Ht mlSelec t
< t able runa t = " se r ve r" > Ht mlTable
< t r runat= " se r ve r" > Ht mlTableRow
< t h runat= " se r ve r" > , <td
Ht mlTableCell
r unat= " server " >
<te x tarea runa t = " se r ver " > Ht mlTe x tArea
Для всех других дескри пт оров НТМL с
Ht mlGenericCon t rol
атр и бyrом runat= " se r ve r"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Большинство атрибугов дескр ипторов серверных элементов управления


явно прописаны в одноименных свойствах подцерживаю щих классов.
Но если мы собираемся программно установить значения атрибугов, не
представленных никакими свойствами, то нужно воспользоваться
свойством-коллекцией Аt t r i Ьut es , которую предоставляет всем
НТМL-элементам базовый для них класс Ht mlCont r o l . Э та
коллекция представляет собой словарь, в котором атрибугы
представлены парами атрибуг(ключ)=значение , включая события.

Продемонстрируем программно е управление серверными HTML-


дескрипторами на примерах.

Пример программной установки свойств серверных


Н~L-дескрипторов

• ~Создайте новую страницу с отделенным кодом и им ен ем


PropertiesControl и сделайте ее стартовой
• r;.:Fиз вкладки НТМL панели Toolbox поместите на страницу
элемент Input (Text) и сделай т е его серверным командой
контекстного меню Run As Server ControL Про след ите , что на
элементе появил ся маркер с зеленой стрелкой.
• ~3адайте элементу имя Te x tBo x l
• г;;;?Откройте на редактирование файл скрытого кода, выполнив
на странице командУ контекстного меню View Code, и введите в
обработчик события Page Load () следующий код

public partial class PropertiesControl: System.Web.UI.Page


(
protected void Page_Load(object sender, EventArgs е)
(
11 Выполнять инициализацию только при п ервой загрузке страниц
11 Далее информация бу,цет отслеживаться в состоянии вида
if (!Page.lsPostВack)
(
11 Установи ть атрибугы стиля для н аст р ойки внешнего ви да
ТехtВохl.Stуlе[ "fопt-size"] = ''20рх'';
TextВoxl.Style[ "co lor '1 = ''red'';

В,
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

11 Использовать слегка отличающийся, но эквивалентный синтаJ


TextВoxl. 5 tyle . Аdd('Ъасkgrоuпd-со lor ", ''yellow');

11 Установить текст по умолчанию


TextВoxl.Value = ' 'Введ ите здесь адрес электронной почты ";

11 Установить другие нестандартные атри бугы через коллекцию


TextВoxl.Attribute s["onfocus' 1 = "а lеп(ТеxtВохl. value )";
}
}
}

Листинг . Код программного задания свойств серверного HTML -


дескриптора в файле РrореrtiеsСопtrоl.аsрх.сs

Р езул ьтат долже н п олучи ться пример н о таким

,111 Untitled Page - Microso


File Edit View Favorites
~~~ O@1 Gj ш FаVОritеs

hti+J:j,1ocallost: 1043;WebSite l;f'roperbesC

I Введите здесь адрес электронной почты

Мicrоsоft Internet Explorer

Введите здесь адрес электроt-t-lой почт ы

еж

Doпе I n 1J"anet

Все на ши п рограммные н астройки элемента lnput (Text) п рев р атятся на


ЮJИенте в следующий HTML-кod
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

<input naше='ТеxtВох l " type=''text'' id='TextBoxl "


style=''width:428px;fo nt-size:20px;color:red;background-color:yeIlow;"
vаluе=''Введите здесь адрес электронной п о ч ты"
onfocus= "аlert(ТеxtВох l . value)" 1>

Пока за нный в прим е ре до стyn к атрибуга м с е рверны х HTML-


дескриптор о в яв л яется , по суги , одинаковым дл я в с ех эле ментов.

Пример программного создания серверных НТМL­


дескрипторов

Иногда инте рфейс пол ьзова тельской НТМL - страницы тр ебуется


формирова ть ' 'на лету" в зависимос ти от конкретны х усл о вий.
Например , мы з ар а нее не з нае м, ско л ько данны х нужн о вы б ра ть и з ба з ы
дл я р азмещения в табл иц е, или какие ср едст ва ynр а в л ения
предоставить кrlИ е нту в з ави с имос ти от его пр едп о чтений.

AS P.N ET nредлага ет р е шение эт ой пр облем ы. Можно , на ос новании


nоявившей ся информации , динами чес Ю1 со зда ть эле ме н т ynравления ,

nрогр а м м но уста н о вить его с вой ств а и до бавить в колле кцию


Co n t r ols с траницы - кон тейнера .

• IJ$Д обавьте к nрил ожению новую страниц у с раздельным кодом


и им е н ем Dynam i cTable и сдела йте ее с та рт о вой

Се йчас со зданная страница п устая. Н а ша задач а дин а мичесЮ1


создат ь та блиц у с пятью стр о ками и ч етырьмя стол б ц а ми ,
установи ть и х цв ета и т екс т и вс е э то ото сл а ть кли е н ту.

• ~в еди те в класс Dyna micTable сл едующий код

риыic рапia l class ОynaшiсТаЫе : System.Web.UI.Page


(
protected void Page_Load(object sепdег, ЕvепtAгgs е)
{
11 Создаем объект заголовка, настраиваем
11 и добавляем к объекту-стра н ице
HtmlGenericCo ntro l header =
пеw НtmlGепегk::СопtrоЮ;
ш
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

hеаdег.lпnегНtml = "< h1 >Динамическая<Ьг/> таблица <1h1> ";


hеаdег.Stуlе[ "со Юг"] = "red";
this. Сопtгоls.Аdd(hеаdег);

11 Создаем объект-таблицу HtmIГaЫe


HtmlТabIe table1 = new HtmIГaЫeO;

11 Установим свойства таблицы


table1.Border = 1; 11 Толщина внешней рамки
table1.CellPadding = З; 11 Отступ содержимого ячейки от рам
table1.CellSpacing = З; 11 Зазор между линиями рамки
table1.BorderColor = ''red''; 11 Цвет линий рамки

11 Объявляем вспомогательные ссылки на строки и столбцы'


HtmlТabIeRow row;
HtmlТabIeCeU сеll;
in! maxRow = 5, maхСеП = 4;
for (int i = 1; i <= maxRow; i++ )
{
11 Создаем строку и настраиваем ее свойство
row = new HtmlТabIeRowO;
row.BgColor = (i % 2 == О ? ''lightyellow'' : ''lightcyan'');

11 Создаем ячейки и добавляем к строке


for (intj = 1; j <= тахСеll; j++ )
(
11 Создаем ячейку
сеll = new HtmlТabIeCeU();
11 Заполняем ячейку содержимым
сеlllпnегНtml = 'Row: " + i ToStringO + "< Ьг 1>"
+ "Cell: " + j.ToStringO;
11 Добавляем ячейку к текущей строке
гow.Cells.Add( сеП);
}

11 Добавляем строку к таблице


table 1.Rows.Add(row);
}

ш
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

// Добавляем таблицу к странице


this. C ontrols.Add(table 1);
}
}

Листинг . Код динамического создания таблицы в файле


DynamicTable.aspx.cs
• ~ы п олните ст р аницу и должен п олуч иться такой ~еЗJmьт,1Т
11 Untitled Page - Мicrоsоft Internet Ех ..
----------
File Edlt y~.". FavoГltes Tools Help

hl:ljo:!~ocalhost: 1043(WebSite ljC • !PGo

Динамическая
таблица

[ROW: 1[ ROW: 1[ ROW: 1[ ROW: 1[


Cell: 1 Cell: 2 Cell: 3 Cell: 4
[ROW: 2[[ ROW: 2[[ ROW: 2[[ ROW: 2[
Cell: 1 Cell: 2 Cell: 3 Cell: 4
[ROW: 3[[ ROW: 3[[ ROW: 3[[ ROW: 3[
Cell: 1 Cell: 2 Cell: 3 Cell: 4
[ROW: 4[[ ROW: 4[[ ROW: 4[[ ROW: 4[
Cell: 1 Cell: 2 Cell: 3 Cell: 4
[ROW: 5[[ ROW: 5[[ ROW: 5[[ ROW: 5[
Cell: 1 Cell: 2 Cell: 3 Cell: 4

Local in1J"anet
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

События серверных НТМL-элементов

Большинство серверных НТМL-элементов в инqюрмации, прибывшей


на сервер с об р атн ой отсылкой, распознают события , которые
ПРОИЗОlШlи с их НТМL-представлением на стороне клиента. В
основном это два события:

1. Собы тия щелчка - ServerClick


2. Собы тия изменения - ServerChange

Событие Se r ve r Cl i ck отображает щелчок, происшедший на стороне


ЮlИента, но обрабатываемый на стороне сервера. В обработчике этого
события можно переопределить ожидаемое поведение , например ,
прервать отсылку e-mail при обнаружен ии ошибки в адресе , проверить
полномочия и т.д.

Событие ServerChange генерируется при внесении изменений в


текстовое пол е или элемент выбора. При поступлении на сервер
обратной отсылки ( постинга ) для каждо го измененного элемента
управления генерируется событие Serve r Change . Самым последним
в ц е поч ке событий генерируется событие Se r verCl i c k кнопки ,
инициировавшей постинг.

в таблице пока зано, какие элементы управления подцерживают


событие Se r ve r Cl i c k, а какие - событие Se r ve r Change .

Подцержка событий серверными элементами управления


НТМL

Событие Подцерживающие элементы управления HTML


System.Web.UI.HtmlControls.HtmlAnchor

Sys tem.Web.U I.HtmlCo ntrols.HtmlВutton

S ystem. Web. U I. HtmlC ontro Is. HtmlInputButto n


ServerClick
System.Web.UI.HtmlControls.HtmlInputSubmit

S ystem. Web. U I. HtmlC ontro Is. HtmlInputReset


в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

System.Web.UI.HtmlControls.Htmllnputlmage

System. Web. UI. HtmlC ontro Is. HtmlS е !ect

System.Web.UI.HtmlControls.HtmrrextArea

System.Web.UI.HtmlControls.HtmllnputCheckBox

ServerChange System.Web.UI.HtmlControls.HtmllnputHidden

System.Web.UI.HtmlControls.HtmllnputRadioButton

System.Web.UI.HtmlControls.HtmllnputText

System.Web.UI.HtmlControls.HtmllnputPassword

Пример обработки событий ServerClick и ServerChange

Приведем пример , демонстрирующий перехват и порядок генерации


рассмотренных событий серверных НТМL·элементов управления.

• IJ$Добавьте к приложению новую страницу с разделенным кодом


и им е н ем EventsContro~ и сделайте ее стартовой
• Г;;:;nоместите на ф:Jрму с вкладки НТМL панели Toolbox
следующие элементы:

о Select · окно списка с именем L i stl


о Inpu t (Te x t) · текстовое поле с именем Те х tbo x 1
о Input (Checkbo x ) - флажок с именем Checkbo x l
о Input (Submit) -кнопкус именем SuЬm i tl
• ~ реобразуйте элементы в серверные командой контекстного
менюRun As Server Сопио!
• ~ режиме Design редактора HTML · кoaa выполните команду
Edit/Se!ect All, а затем командУ FопnatJJustify/Сепtег дл я
выравнивания элементов в центре окна

в результате, интерфейс страницы долже н быть представлен


следующим HTML·кaaoм

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

<%@ Page L апguagе="С#" АutоЕvепtWirеuр=''truе''


С ode F ile=' 'EventsC о пtrо Laspx. cs"
lпhеr its=''ЕvепtsСо пtrоl'' % >

<html xmIпs="httр :lIWWW.W3.0rgl1999/xhtml">


<head nmat="server">
< title >Uпtitled Page</tide >
<lhead>
<body>
< fо пn id="forml" ruпаt="sеrvеr''>
<div style=''text-align: сепtеr">
<se lect id="List1" ruпаt="sеrvе r" style="width: 202рх" muhiple size="3">
< орtioп sе lесtеd > Опция 1 <Ioption>
< орtioп > Опция 2 <lорtioп>
< орtioп > Опция 3 <lорtioп>
</select>
<br 1>
<br 1>
< iпрut id='Textboxl" nmat="server" typ e= ''text'' 1>
<br 1>
<br 1>
< iпр ut id="Checkboxl" runat="server" type="checkbox" 1>
<br 1>
<br 1>
< iпр ut id="Submitl" nmat="server" type="submit" value="submit" 1>
</div>
</foпn>
<!body>
<lhtml>

Ли стинг Де С lCрипт ор н ое представление страницы

ЕvепtsСопtrоl.аsрх

Элеме н т mul t i ple в списке дает во зм ожность пользователю


выбирать несколько элементов списка , Уде р жив ая клавишу CtrL Ат ри бyr
s iz e задает число видимых элементов списка при скролирова нии.

Элеме н т selec t ed указывает, какая опция должна быт ь в ы делена при


за грузке списка.

ш
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

• ~ ерейдите в режим редактирования кода С# и создай те


обработчики соб ытий для текстового поля , с пи ска и кнопки

Самым легким cnособом создания обработчика дл я серверного HTML-


элемента является д войной щелчо к на нем в режиме Design. В этом
случае среда разработки создаст заготовку об р аботчика в файле С# и
свяжет ее с элементом ynравления , до бавив соответсвующий код в
дескриптор.

Но об р аботчик таЮ1М способом будет создан только дл я того события ,


которо е определен о в элементе его изготовителем как событие по
умолчанию с помощью атрибyrа
[Dе f аul t Еvеп t ( " И мя соб ы ти я" )] . Для других же событий
элеме нта упр авления обработчиЮ1 созда ются с помощью явной
п одписки на них в вызывающем коде.

Изменение содержимого текстового поля и состояния флажка мы


привяжем к одному и тому же обработчику. Для эт ого

• ~С копируйте из дескриптора элеме нта текстового поля


Te xt bo x l созданную при вязку обработчика в дескриптор
флажка Checkbo x l

После созд ания об р аботчиков дескри пторы серверных HTML-


эл ем ентов ynравления БУдУГ иметь ви д

<se lect id=''List1 '' runat="server" style=''width: 202 р х" multiple size="З"
оnsеrvегсhапgе=''Listl_SеrveгС haпgе''>
< iпрut id='Textboxl " runat="server" type=''text'' оnsеrvегсhапgе='ТехtЬохl_Sе J
< iпрut id="C hec kboxl " runat="server" type="checkbox" onserverchange='Textb
< iпрut id="Submitl" nшat="sеrvег" type="submit" value="submit"
onserverclick="Submit l ServerClick" 1>

• ~3аполните созданные обработчиЮ1 событий следующим кодом

usiпg System;
usiпg System.Data;
usiпg Sуstеm.Сопfigurаtiоп;
usiпg Sуstеm.СоlIесtiо пs;

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

using System.Web;
using Sуstеm.WеЬ.Sесшitу;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

риыic рапial class EventsControl: System.Web.UI.Page


(
protected void Page_Load(object sender, EventArgs е)
{
if (!this.lsPostBack)
(
List1.ltеm;.Аdd( "Д ОП. опция 4 '');
List1.1tеПl5.Аdd( "Д ОП. опция 5'');
List1.Itеm;.Аdd( "Д оп. опция б '');
}
}

protected void Textboxl_SelVerChange(object sender, EventArgs е)


{
Response.Write("<li>SelVerChange перехваче но дл я " +
«Control)sendeг).lD + "</Ii>');
}

protected void Listl_SelVerChange(object sender, EventArgs е)


(
Response.Write("<li>SelVerChange перехваче но дл я List1. "+
' 'Пользователь выде л ил следующие опции:< IIi> < Ьг 1> '') ;
foreach (ListItem li in Listl.Items)
(
~ (IlSelected)
Response.Write("&nbsp;&nbsp;- " + IL Value + "< Ьг 1>'');
}
}

protected void Submit1_ServerClick(object sender, EventArgs е)


(
Response.Write("<li>ServerClick перехвачено для Submitl <1Ii>'');
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

}
}

Листинг Обработчики событий в файле

EventsControl.aspx.cs
• Г;;:;=Запустите страни ц у на выполнение и получите примерн о
такой результат

"г' i
-
,

в качестве дополн ит ельно го действия при п ервой загрузке страницы


обработчик Page_LoadO добавляет еще три элемента к окну с пи ска .
Эти м демо н стрируется простота прогр амм нorо добавления элементов
списка.

Следует отметить, что собы тия изменения MOryr ге н ерироваться


ASP.NET в произвольно м порядке. Здесь порядок не гарантирован. Но
мож н о заметить из наше го при мера, что события изменения следуют в
пор ядке следования дескри п торов на форме. Еди нс твенное, чт о
гар ан тир уется, так это наступление события щелчка будет
сгенерировано последним, на каком-бы месте кнопка не стояла
(проверьте!).

Web-элементы управления

Мы так подробно рассматривали элементы управления с вкладки НТМL


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

значит ельно превосходят и х по своей функциональности. Серверные


НТМL-элементы управления были р азработаны для существующих
НТМL-дескрипторов с целью обратной совместимости. Web-
элементы являются современным самостоятельным произведением.

Web-элементы изначально счи таются серверными и обязательно


должны содержать встроенный атр и буг runa t= " server ". Поэтому

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

и х можно и н е называть серверными , итак понятно , о чем идет речь .

Для луч шей узнаваемости соответствующие им дескрипторы

начина ются с префикса азр . WеЬ · элементы мо гуг автоматически

определять тип броузера кл и е н та и подстраиваться под него , генерируя


сложный HTML ·Koa из н ескольких т е гов и JavaScript ·сценариев. Они
и меют богаты й н абор событий, которые можно выбират ь прямо из
пан ели Properties. С Web-элементами можн о р аботать так же легко, как с
объектами локальных приложений.

Web-элементы управле ни я также пр едставляются цепочками

на следов ания классов. Часть и ерархии наследования приведена на


рисунке.

'"
В.М С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

I Sушm Object I
I S~te m Web.UI, ContJol I
- - - - -- -
Пространство имен
-------- -
System.Web.UI.WebControls
- ,
I
~t<:'.1ntfQl

I
I I
Н 6цасп
I Н L i te Г1il I
I ваsе~ШВСun ОСQП1ГQ I

Н ctJo<;k6Qx
I Н РI~ еНQIO-е'
I I D;lt<JE\Quno:.:lC<>ntrol I
Lr Rэdi: >6u\toп I Н Сэ l$nd"г
I -1 AdRoWoI
I
Н H~perlink
I -1 'т' I -1 СQmрсsiteDэmВСUnclCoП1rоll
Н I mэge
I -1 VЭhdati опSu mmэ ry I Н Doe1ai~V i ew
I
-1 I m~ge6...tton I I 6-;J$еv", ]id;Ш>l
I Н FQIfТIV~w
I
--1 Image"-lap I IВ<llseCоmрз rеV.аlkjз lo г I Н Qrl dVlew
I
Н l.oI" ,
I Ч- C()mj);'lteVi! lid;'\kJt I Н LlstControl
I
Н Llnt:BullOn
I Н СU зt)m\lll l l~kJ.
I Н Ch~ k.ВC~Llst
I
Н F ane l
I Н RangeVa lldator
I Н DIOpDawnL Is1
I
Н т.".
I -1 Reguta rExprer;,sl() nValidaoor I Н LlslВo~
I
Н TableC e~
I --l RequlredFieldValidator I --1 RadloBullOnL ls1
I
Ч-Т3tjенеS(1е tCеl l l --1 Bulete(j,..Ist
I
Н ТэЬ\оеRow
I -i Н ierэ гс hiсэ lDэtэВОu ndC ()П1rol I
Н Text60x
I --1 Menu
I
Н TreeView I )
I
---------------- - - - - -- - -

Базовый класс WebContro!

Все элем е нты уп р авле ни я Web унаследованы от класса WebCon trol .

'"
В.М. С """,,,в Про,р а ммupoвtJNШ' 110 ASP. N ET

который, в свою очередь, наследуется от Con trol . Поэтому многие его


свойства и методы , например , Cont r ols , Vi s i ble,
FindCon t rol () таЮ1е же, как и у НТМL-элементов ynравления. Но
есть и свои до п ол ни тельные свойства , основные из которых п риведены
в таблице .

Дополнительные свойства базового КIIacca WebControJ


Свойство Описание

Возвращает или устан авливает сокращенную


комби нацию , позволяющую быстро
п ереместиться на элемент ynравления.

АссеззКеу Например, при установке свойства в значение А


п ользователь может п еренести фжус на этот
элемент ynравления , на жав комбинацию
<Alt+A>
Набор дополнительных атрибугов элеме н та
ynравления. Коллекция, позволяющая вводить
Attri butes до п ол ни тельные атрибугы, которых нет в
открытых свойствах, н о которые вообще может
иметь генерируемый НТМL-тег

BackColo r Возвращает или устан авливает цвет фона

Borde r Color Возвращает или устанавливает цвет гран ицы

Одно из предо пр еделенных значений


BorderSty 1 е : Da shed ,
п еречисления
BorderStyle Dotted , DоиЫе , Groove , Inset ,
None , NotSet , Outset , Ri dge ,
Sol i d
BorderWi dth Возвращает или устан авливает ширину границы

Возвращает или устанавливает стиль каскадной


таблицы стилей CSS элемен та ynравления .
СтильCSS может быть определен в разделе
CssClass
<style> в верхней части страницы или в
отдельном файле, на который ссылается
страница

Список свойств каскадной таблицы стилей


Style CSS, которые можн о приме ни ть к элементу
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

ynравления

Возвращает или устанавливает достynность


элемента ynравления. Недостynный элемент
присугствует на проектируемой странице ,
отображаясь серым цветом, но участия в
Enabled
формировании рендеринга не принимает и на
юшенте не отображается. Но при необходимости
его можно программно ВЮIючить и он начнет

генерировать полноценный HTML-коJ

Булево свойство, ВЮIюченное по умолчанию и


EnableThem i ng
разрешающее применять темы оформления

Булево свойство, ВЮIюченное по умолчанию и


разрешающее сохранять текущее состояние
EnableV i ewState
элемента ynравления вместе с ОТЮIиком на

компьютере ЮIиента

Возвращает объект со всей информацией о


стилях шрифга , используемого для текста
Font элемента ynравления. Э ТО свойство содержит
nодсвойсmвй , которые можно устанавливать с
помощью синтаксиса прохода по объекту

Возвращает или устанавливает цвет перед него


ForeColor
плана элемента ynравления

Возвращает или устанавливает высоту элемента


He i ght
ynравления

Назначает СКИН дЛЯ применения к элементу


Sk i nID
ynравления

Определяет порядок обхода элементов


TabInde x
интерфейса страницы по ЮIавише < ТаЬ >

Определяет короткую подсказку для элемента


Тооl Tip
ynравления

Width Определяет I.Шiрину элемента ynравления

Каждый элемент ynравления при вносит свои допо л нительные


свой ства и метод ы , главное назначение которых - ynростить начальную
на стройку и программное ynравление элементов , сделать его

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

интуитивно пон ятным и уменьшить возможные ошибки . Большой Билл


сказал: зачем программистам знать НТМL , п усть о ни правильно
на строят свойства элементов управления, а уж сами элементы
сгенерируют такой НТМL , какой нужно.

Заполн ение свойства Тех! данными из ненадежного


источника

Мно гие элементы управления MOryr пр инимать данные через свое


свойство Te xt . Это может быть элемен т управления Label ,
Te x tBo x, CheckBo x, Rad i oBu t ton , But t on и другие. Если
данные мы не генерируем сам и , а они п оступают из внешнего

источника (чужой файл , обратна я отсылка с да нными пользователя ,


база данных) , то для безо па с н ости мы должны считать их
н енадежными и п еред записью в свойство Te x t обязательно
обрабатывать на пр едмет ИСЮJючения возможны х управляющих
символов. Для такой обработки предназначен метод

public static strmg Systеm.WеЬ.Нttрutilitу.НtmlEпсоdе(string)

Программное управление свойствами Web-элементов


управления

Управление размером элемента

Из пр едыдущей таблицы ви д но , что все элементы управления Web


на следуют от класса WebControl такие свойства размера, как
BorderWi d t h , Height , Width . Их можно задавать не только в
режиме проектирования, но и пр о граммно в режиме выполнения

страницы. Все о ни будуг отображаться в соответствующие атрибугы


дескрип то р а . Размеры задаются не только значением, но и единицами
измерения (рх - пикселы, %- про ц е н ты).

Пусть, например, у на с имеется Web-элемен т уп р авления Panel ,


который отображается дескрип тор ом
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

<asp:Pane l ID="pnl" runat="server" Неight= "ЗООрх" Width="50%" 1>

Здесь свойства р азмера заданы в панели Properties на этапе


проектuрования. Для пр о гра ммной установки значения свойств а
размера можно:

• П ервый вариант: и с поль зовать структуру

Sys t em . Web . UI. WebControls . Unit и ее статические

методы

11 Задание высоты элемента рnl в пикселах


рпLНеight = Unit.Рixе~ЗОО);
11 Задание ширины элеме н та рnl в процентах
рnL Width = Unit.Percentage(50);

• Второй вариант: создать эюем п ляр структуры


Sys t em . Web . UI . WebCon trol з . Uni t и сразу е го настроить ,

затем и с поль зовать для установки свой ст в размера с


при ме н е ни ем предо пр еделен ного п е речи сления

Sys t em . Web . UI. WebControls . Unit T ype

11 Заготавливаем эюемпляры структуры Unit для хранения


11 высоты и ширины в нужных единицах измерен и я
Unit height = new Unit(ЗОО, UnitType.Pixel);
Unit width = new Unit(50, UnitType.Percentage);

11 Устанавливаем свойства элемента уп р авления


рпLНеight = height;
рпL Width = width;

Управление стилем

Управл е ни е стилем также использует пр едУста новл е нно е перечисление


System . Web . UI . WebControls . BorderStyle

pnlBorderStyle = BorderStyle.Dashed;

На клие нте получим такое пр едставление пан ели

'"
.--------.
В.М. С""",,,в

I I
Про,раммupoвtJNШ' 110 ASP. N ET

I I
I I
I I
I I

.. _------_ ..
I I

Управление цветом

Для задания значений свойств цвета элеме н тов управления, таких как
BackColor , BorderColor , Fo r eColor , используется структура
System . Drawing . Colo r с п редопределенными цветами и ее
методы , или статические методы класса
System . Drawing . Colo r Translator . Для сокращенного
использован ия на стра ниц е такого арсенала н ужно импортировать в

кодовый файл .aspx.cs о пр еделение простра н ства им ен System.Drawing

usiпg System.Drawing;

или п рименять полное имя кnacca или структуры при обраще нии к их
компонентам .

Приведем пр имеры разных способов определения цвета. Для этого


поместим на форму три элемента уп р авления Button . Управляющий
код С# будет таким

usiпg System;
usiпg System. Web.UI. WebControls;
usiпg System.Drawing;

public partial class Тmр : System.Web.UI.Page


(
protected void Page_Load(object sender, EventArgs е)
(
11 Использов а ни е свойств структуры System. Drawing.Co lor
Buttonl.BackColor = Color.Red;

11 Использов а ни е метода структуры Systеm.Dгаwiпg.Соlог


int alpha := 255; 11 Пол но стью н е пр озрач ныи
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

int red = О, green = 255, bIlle = О;


Button2.BackColor = Color.F romArgb(alpha, red, grееп, bIlle);

11 Использование статического метода


11 класса System.Drawing.Colo rTranslator
ВuttоnЗ.ВасkСоlог = СоloгТгаnsLз tог.FгоmНtml( ' '#ООООFF');
ВuttоnЗ.FогеСоloг = Co lorTranslator.F romНtml( ''white');
}
}

Листинг

PropertiesControll.aspx.cs
Управление цветом
• файле

в результате , п ользователь в броузере увиди т следующее

: lM3;WebSite lrrrr т

[ Button2 '
Оопе Local iп1Тапеt

Управление шрифтами

Каждый элемен т управления наследует класс WebCon trol , который в


свою очередь содержит свойство Font . Факти чески, свойство Font
представляет собой эюем п ляр класса

System . Web . UI . WebCont r ols . Fontlnfo , и имеет все

необходи мые свойства для определен и я шрифга. Ниж е пр иведен


при мер кода , н астраивающего шрифгы надписей кно п ок

llsiпg System;
llsiпg System. Web.UI.WebControls;
llsiпg System.Drawing;

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

public partial class Тmр : System.Web.UI.Page


(
protected void Page_Load(object sender, EventArgs е)
(
Buttonl .BackColor:= Color.Red; // Настройка цвета
Buttonl .Fo nt.Name:= 'Vernada"; // Настройка шрифга
Buttonl .Fo nt.Bok:l = true; // Полужирный

// Настройка цвета
int alpha = 255;
int red = О, green = 255, blue:::: О;
Button2 .BackColor:= Color.FromArgb(alpha, red, grееп, blue);
// Исп ользуем ст р уктуру Sуs tеm.WеЬ.U I .WеЬСопtrоls.FопtUnk
// уста н овки отн осительного размера шрифга
Button2 .Fo nt.Size:::: FontUnit.Smaller;

// Настройка цвета
ВuttоnЗ . ВасkСоlог:::: СоloгТгаnsLз tог. FгоmНtm1(''#ООООFF');
ВuttоnЗ . FогеСоЮг:::: Co lorTranslator.FromНtm1(''white');
// Исп ользуем ст р уктуру Sуs tеm.WеЬ.U I .WеЬСопtrоls.FопtUnk
// уста н овки абсолютного размера шрифга в пунктах
ВuttоnЗ . Fо пt.Size:::: FontUnit.Point(16);

ВuttоnЗ . Fо пt.Uпdег linе:::: true; // Подчеркнем


}
}

Листинг
РrореrtiеsСопtrоl1.аsрх.сs
Управление шрифтом
• файле

в результате таких программных на стр оек сгенерируется HTML-кod ,


который посмотрит на клиен та следУЮ ЩИ МИ глазами (трехглазое
чудовище)

'"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

11 Untitled Page - Мicrоsоft Internet Explorer


FMe Edit View Favorites ТОols Help

у .. у ID Ш t::! I ~ Search tiJ Favorites


: 1043!WebSite l(rmp.aspx .....

Button2
Оопе Local iп1Т.:nеt

Чушь!, ко н ечно, зато знаем как .. Студент З и боров - н е спи, а читай


дальше.

Управление фокусом ввода

В отли ч ие от НТМL-элементов , все элемен ты Web н аследуют метод


Focus () , но оказывает он влиян и е только на элемен ты ввода (
прини мающие клавиатурный ввод пользователя ). При появлении
страницы на стороне клиен та курсор сразу уста на вливается на поле

ввода, для которого на сервере был выполнен метод Focus () , а


страница автоматически прокручивается до видимого положения.

Пользователь может п е ремещаться по элементам с помощью клавиlШ1


< ТаЬ > .

Конечно , в самом HTML нет средства установки фокуса , но с п омощью


скриптов на JavaScript такой эфрект можно задать . Что и генерирует
соответствующий Web-элемент при вызове для него метода Focus () .
Если метод Focus () вызывался для нескольких элементов ввода , то на
кrlИенте JavaScript выбирает тот, кото рый получил фокус раньше д рyrnх.

Вместо программно го вызова метода Focus () можно назначить


элемен т управлен и я, который всегда долже н п е рвым пр инимать фокус
ввода при отображении страницы в броузере. Э ТО делается с п омощью
свойства Dе f aul tFocus дескрип тор а формы следующим образом
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

< fо пn id =''Fопnl'' DefaultFocus='TextВox2" runat="server''>

После такого назначения клиенту будет сгенерирован JavaScript-


сценарий по установке фжуса ввода на текстовое поле с именем
Te x tBo x2 .

Еще один способ ynравления фокусом заключается в использовании


клавиш уско ренного достynа (горячих клавиш). Например , если дл я
текстового поля (Web - элемент Te x tBo x ) установить свойство
Access Key в значение А, то пользователь комбинацией клавиш
<Alt+A> может быстро перевести ф:Jкус ввода на этот элемент.

Еще один способ ynравления фокусом - использование метки Label .


Если установить в свойстве Assoc i atedCon t rol ID значение ID
элемента ввода , то при адресации по горячим клавишам к ф:Jкусу метки
фокус получить связанное с меткой текстовое поле. Например ,
следующая метка переносит ф:Jкус ввода на элемент Te x tBo x2 при
нажатии клавиатурной комбинации <Alt+2>

<asp :Label AccessKey= ''2'' AssociatedCo ntro UD= 'TextВox2" runat="server''>


Введите TeKcT:</asp:Label>
<asp:TextBox ID='TextBox2" гuпаt="sеrvег" />

Кроме элементов ввода можно на странице назначить кнопку по


умолчанию, которая БУдет ожидать нажатия пользователем клавиlШ1
Enter. Например , может потребоваться превратить кнопку Submit формы
в кнопку по умолчанию, чтобы при нажатии пользователем клавиlШ1
Enter на клиенте инициировался постинг, а на сервере запускалось
событие В и t ton . Cl i c k этой кнопки.

Для назнач е нии кнопки по умолчанию нужно указать в свойстве


Ht ml Fo r m . DefaultBut t on (или прямо в дескрипторе формы)
значение идентификатора кнопки. Например

< fо пn id=''Fопnl'' DеfauhВuttоп= ' ЪtпSuЬmit" nшat="sеrvег''>

Кнопкой по умолчанию можно сделать элементы Ви t ton .


LinkBu tt on , ImageBut t on .

Элемент Рапе ] также подцерживает свойство кнопки по умолчанию.


ш
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Если на страни ц е н есколько пан елей со своими кнопками, то для


каждой панели можно назначить свою кнопку по умолчанию, которая
должна срабатывать в активной панели при пользовательском нажатии
ЮJaВИШИ Enter.

Элеме н т Рапеl обладает возможностью скролирования. Если


размещенные на панели элеме н ты не помещаются в уста новленные

размеры и для пан ели установлены свойства прокрyrЮ1 , то панель


генерирует поло сы пракруmки. ВЮIючение прокрyrки элеме н та Рапеl
осуществляется за счет установки ее свойства Sc r ollBars в одно из
значений: Vertical , Horizontal , Both, Auto.

Следующий простой дескрипторный код демонстрирует свойство


прокрyrЮ1 элемента Рапеl

<%@ Page Lапguagе= "С#" АutоЕvепtWirеuр=''truе''


С ode F ile=' 'Рапе lS сго lLas рх. cs "
Inherits= ''PanelScroU'' %>

<html xm1пs="httр :llwww.wЗ.огgl 1999/xhtml">


<head nmat= "server">
<title>Untitled Page</tide>
<lhead >
<body Ьgсо!ог=' '#ffffб6''>
< fопn kl ="fопnl " ruпаt="sеrvег' '>
<div style=''text-align: сепtег">
<asp:Pane! I D="Рапеl1" runat="server" ScroUВars=''Vertical''
Неight= "З ООрх " Width="261px" BackColor="Red" BorderWklth="lp
< h1 > Привет BceM!!! <lhl >
<asp:TextBox ID='TextBox2" ruпаt="sеrvег' '>доцент C HeTКOB </asp
< Ьг 1>
<asp:TextBox ID='TextBoxl" ruпаt="sеrvег' '> студент Зиборов< /аs]
< Ьг 1>
< Ьг 1>
< аsр:Вuttоп ID= "Buttonl " runat= "server" Text="CTepeTb доцента" ;:

< Ьг 1>
< аsр:Вuttоп ID= "Button2 " runat= "server" Text="CTepeTb студента " I

</asp:Pane!>
</div>
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

</form>
<!body>
<lhtml>

Листинг Код файла PanelScroll.aspx

Клиентский вывод БУдет таким

11 Untitled Page - Мicrоsоft Internet Е ...


----------------------------
FMe Edlt V~W Fаvопtes Tools Нер
т .. т liiII l1J GI I[1se"Ch
: 1043;WebSite 1;1' т !(>GJ

Пример обработки события Changed Web-элементов


управления

Се рв е рные события WеЬ~элементов рабо тают такж е, как события


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

серверных НТМL-эл емен тов. Только изм е н е ны на зва ния событий .


Вместо на з вания ServerClick используется универсальное на звание
Cl i ck . Общее событие Se r verChange заменяется специфическими
названиями CheckedChanged - для элементов Rad i oBut t on и

Chec k Bu t ton , Te xt Changed - для элемента T e x tBo x . Но их


поведение остается прежним.

Основное различие состоит в том , что Web-элементы имеют свойство


AutoPostBack для возможности ШШЦUQЦUU С помощью клиен тского

Java Script немедленного п остинга, после чего на сервере запускается


соответствующее событие.

Приведем пример , в котором всем элементам ynравления , кроме списка ,


установим свойство AutoPostBac k в значение True . Будем
отлавливать в постинге событие CheckedChanged и обрабатывать
его одним общим обработчиком, добавляю щим строки в с пи сок .

Обработчик события создадим через панель Properties, задав для одного


из элеме н тов, ге н е рирующих событие, имя CtrlC hanged в поле события ,
затем нажав кrJaВИШУ Enter. Для остальных элеме н тов этот обработчик
подключим через раскрывающий ся список п оля панели Properties. Коды
страницы , реализующие пример , приведены ниже .

<%@ Page Language="C#" AutoEventWireup=''true''


С ode F ile=' 'с hecked С hanged .as рх. cs "
Inherits="C hec kedChanged" %>

<html xmIns="httр ://www.wЗ.оrgl1999/xhtml">


<head nmat="server">
<title>Untitled Page</tide>
<lhead>
<body>
< fо пn kl="fопnl" runat="server''>
<div>
<h2>
С пи сок событий
<1h2>
<asp:ListBox ID = "ListВo x l " nmat="server" Height="107px" Width="Зl :
<р />

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

<р 1>
<ш 1>
< р 1>
<h2>
Элеме н т ы управления, <br1>
генерирующие событие < Ьг 1>
C hanged
<1h2>
< р 1>
<asp:TextBox ID='TextBoxl" runat="server" AutoPostBack='True"
ОпТехtСhaпgеd="СtгlСhaпgеd ''> Привет BceM!!! </asp:TextBox>
< р 1>
<asp:CheckBox ID="CheckBoxl " runat="server" A utoPo stВac k ='True'
OnCheckedChanged="CtrlChanged" />
< р 1>
<asp:RadioButton ID=''RadioButtonl '' runat="server"
AutoP ostBack='True" Checked='True"
GroupName=''radioGroup'' OnCheckedChanged="CtrlChanged" 1>
&nbsp;
<asp :RadioButton ID=''Rаd iоВuttоп2 '' runat="server"
AutoPostBack='True" GгоuрNаше=''rаdiоGгоuр''
OnCheckedChanged="CtrlChanged" 1>
</div>
</form>
<lbody>
</html>

Листинг ДеСlCрипторное представление страницы

СhесkеdСhапgеd.аsрх

using System;
using Systеш.D а tа;
using Systеm. С опfigша tiоп;
using System. Collections;
using System.Web ;
using System. Web.Security;
using Systеш. Web.UI;
using System. Web.UI.WebControls;
using System. Web. UI. WebControls. WebParts;
using System. Web. UI. HtmlContro ls;
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

public partial class CheckedChanged : System.Web. UI.Page


(
protected void CtrlChanged(object sender, EventArgs е)
(
11 Добавим имя элемента, сгенерировавшего событие , в список
striпg ctrlName = ((Control)sender).ID;
ListВox1. Items.Add( ctrlN ате + '~Changed '');

11 Позиционирование на последний элемент списка


ListВox1.SelectedIndex = ListВохl.1tеms. СОШlt - 1;
}
}

Листинг Код файла CheckedChanged.aspx.cs

Представление в броузере будет, примерно , таким


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

11 Untitled Page - Мicrоsоft Internet Explorer


FMe Edt Ylew Favorites Tools Help
' Bockt -+т О t[\ search Ш FаVОГitеs

СШlСОК событий

CheckBox1_ Changed
RаdlOВuttоп2 _ Сhапgеd
RаdiоВuttоп 1_Сh"пgеd
CheckBox1 Changed

Элементы управлеlПIЯ,
генерирующие событие
Changed
I Привет всем!!!

r. r
Оonе Local iп1Т.:nеt

Списковые Web-элементы управления

Как ВИДНО из n риведенной р анее схемы иерархии кnaccoв, общим

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

базовым КIlaccaм дл я СП исковых элементов управления является класс


Sys tem . Web . U1 . WebCon t r ol s . Li s tControl , который
п ередает им все свои свойства и методы, а также событие
SelectedlndexChanged. В таблице приведены классы ,

пр едставляющие спи сков ы е Web-элементы .

С п исковые Web-элементы

Класс Представляющий дескр ипто р Описание

Выпадающий спи(

заполненный колл
объектов
<asp : L i stlten
DropDownList <asp : DropDownList>
НТМLон
трансqюрмируется
дескри п тор <selE
атрибугом size=
ОКНО списка, запо.
коллекцией объект
<asp : L i stlten
НТМLоно
ListBox <asp :Li stBOx> трансqюрмируется
дескри п тор <selE
атрибугом size=
Х - количество ви )

элеме н тов

Его элементы в Н1
трансqюрмируютс
CheckBoxList <asp :C heckBoxList> флажки, выровнен
таблице с одним и
н есколькими стол{

То же , что и
<asp : CheckBo}
RadioBu t tonLis t <азр : RadioBu t tonLi s t> но элементы

трансqюрмируютс
радиокнопки

Статический

'"
в.м. С """,,,в Про,р а ммupoвtJNШ' 110 ASP. N ET

маркированный и.
нумерованный СПl
НТМLон
трансqюрмируется

Bu l letedLis t <asp : Bulleted List> дескрипторов <ul


unordered list -
маркированный) у

< о 1 > ( ordered list


нумерованный) .Е
можно применять,

для создания тпе]

Из цепочки насл едования через базовый кла сс


Sys tem . Web . U1 . WebCon t rols . Li s tControl элементы

управления наследУЮТ некоторые важные свойства

Некоторые свойства списковы х элементов , наследуемые через масс


ListControl
Свойство Описание

При значении t r ue qюрма отправляется


AutoPostBack обратно на сервер, когда пользователь
изменяет текущий выбор

Коллекция элементов Lis tl te m


списка. Э лементы можно, также ,
I t ems добавлять демаративно в режиме
проектирования с помощью

дескрипторов <азр : Li st 1 t em>


Возвращает или устанавливает ин д екс
выбранного элемента. Для списков с
множественным выбором необходимо
Se l ectedlnde x
ЦИ ЮlИчески пройти по коллекции
элементов и про верить свойство
Selected каждого Lis tlt em
Возвращает ссылку на первый
выбранный L i st lt em. Для списков с
множественным выбором необходимо
Se l ectedltem
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Se l ectedltem ЦИ ЮlИч ес ки пр ой ти по коллекции


элементов и про верить свойство
Selected каждого Listl t em

DataSource ,
DataMember , Использую тся для отображения данны х
DataTextField ,
и з базы данных
DataValueF ie ld,
DataTextFormatString

Э лементы управле ни я CheckBoxList и RadioBu ttonL i st


доб авляют свои индивидуальные свойства

Доба вл е нны е свойства п ереключателей C heckBoxList и RadioButtonList


С в ойство Описание

Э ТО свойство принимает значение перечисления


Repea tLayou t , равное Fl ow (л ин ей но) и ли
RepeatLayout
Table (в таблице) . ОНО указ ыва ет, какбудуг
расположены п ереключатели

Определяет, как будет расположен список


RepeatDirection (Значение п е речисления RepeatDirection :
Horizontal , Vertical )
Определяет количество столбцов в случае
RepeatColumns
установки RepeatLayout в Table
Ce l lPadding, Если свойство RepeatLayout установ ле но в
Ce l lSpacing, Table , эт и свойства конфигурируют интерв алы
TextAlign и выравнивание ячеек таблицы

Пример списковых Web-элементов

• ~Добав ьте к при ложени ю новую страницу ListControls.aspx с


р азделе нны м кодом

• ~ оместите на qюрму и з вкладки Standard элеме н т ы управления


и на стройте их в соответствии с прив еденным дескр и п то рны м
пр едставле ни ем стра ницы . Декларативн ое (в режиме
пр оекти р ова ни я) добавление элементов списка выполняйте через

,СО
В.М. С""",,,в

Llstltem Соllеctюn

[1e mbers:

:
Editor

i:СЩ;D~'В'• • • • • • • ~
=== Про,раммupoвtJNШ' 110 ASP.NET

.1J.RI

~
._ ","ИЯ2

i!,dd &е гооуе

ОК CCIГJo::el

<%@ Page Language="C#" AutoEventWireup=''true''


С ode F ile= '1.istC о ntro Is.asp х. cs"
Inherits='1.istControls" %>

<html xmIns= ' huр ://www.wЗ.or!j'1999/xhtml" >


<head runat= "server''>
<tide >ListControls</tide>
<lhead>
<body>
<form id ="forml " nmat="server''>
<div>
< asp:ListВox ID='1.istBoxl " runat="server" SеlесtiоnМоdе=''МuI
<asp:ListItem Sеlесtеd='Тruе' '> Опция 1</asp:ListItem>
< аsр:ListItеm> Опция 2 </asp:ListI tem>
</asp:ListВox>
<р 1>
<asp:DropDownList ID=''DropDownListl '' nmat="server">
<asp:ListItem Sеlесtеd='Тruе' '> Опция 1</asp:ListItem>
< аsр:ListItеm> Опция 2 </asp:ListItem>
</asp:DropDownList>
< р 1>
<asp:CheckBoxList ID= "C heckBoxList1 " runat= "server" RepeatC
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

<asp:CheckBoxList ID= "C heckBoxList1 " runat= "server" RepeatC


<asp:ListItem Sеlесtеd='Тruе' '> Оnция 1 </asp:ListItem>
< аsр:ListItеm> Оnция 2 </asp:ListI tem>
</asp:CheckBoxList>
< р 1>
<asp:RadioButtonList ID="RadioButtonListl " runat="server"
RepeatColumns="2 " RереаtDirесtiоп= "НOI
<asp:ListItem Sеlесtеd='Тruе' '> Оnция 1</asp:ListItem>
< аsр:ListItеm> Оnция 2 </asp:ListItem>
</asp:RadioButtonList>
< р 1>
<asp:Button ruпаt="sеrvег" ОпС liсk= ' 'Вuttопl_Сliсk '' Text="OTn
</div>
</fonn>
</body>
<lhtml>

Листинг Десхрипторное представление страницы


ListControls.aspx
Отметьте, что для п р и мера мы Удалили и де н ти фикатор кнопки
Вuttо п, поскольку н е соби р аемся ею nporpaMMHo ynравлять.
• ~3аnолните фай л скрытого кода так

usiпg System;
usiпg System.Data;
usiпg Sуstеm.Сопfigurаtiоп;
usiпg System.Collections;
usiпg System.Web;
usiпg System.Web.Security;
usiпg System.Web.UI;
usiпg Sуstеm.WеЬ.U I .WеЬСопtrоls;
usiпg Sуstеm.WеЬ.U I .WеЬСопtrоls.Wе ЬРаrts ;
usiпg System.Web.UI.HtmlControls;

public рапial class ListControls : System Web.UI.Page


(
protected void Page_Load(object sепdег, Еvе пtAгgs е)
{
if (!Page.I s Po stВack)
{
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

{
ListВохl.ltеП15.Аdd("Опция" + i То5triпgО);
DгорDоwnList1.ltеms.Аdd("Опция" + i То5triпg());
С hесkВоxLis tl.1tеms.Аdd("Опция " + i То5 tгiпg()) ;
RаdioВuttопListl.1tеms.Аdd(''Опция'' + i То5triпg());
}
}
}

protected void Buttonl_Click(object sепdе г, ЕvепtAгgs е)


{
// Пер ебо р для элемента ListBoxl , до п уска ющего множествен
Rеsроnsе.Wгitе("< Ь > Выделенные опции в ListВoxl:< Ib >< br /> '
foreach (ListItem li in ListВo x l.1tems)
{
if (IlSelected)
Response.Write("- " + liText + "< Ьг /> ');
}

// Одиночный выбор для Drop DownList1 , п ереб ират ь элемеН1


Response.Write("<p />< Ь > Выделенная опция в DropDownListl:
Response.Write("- " + Drop DownListl .5elected ltem.Text + "< Ьг /> '

// Пер ебо р для элемента C hec kBoxListl , допускаю щего множе


Response.Write("<p />< Ь > Выделенные о пции в CheckBoxListl
foreac h (ListItem li in CheckBoxList1. ltems)
{
if (IlSelected)
Response.Write("- " + liText + "< Ьг /> ');
}

// Одиночный выбор для RadioButtonListl , п еребирать элеме н


Response.Write("<p />< Ь > Выделенная опция в RadioButtonListJ
Response.Write("- " + RаdiоВuttоnL ist1.Sеlес tе d ltеm.техt + "< Ьг /~
}
}

Листинг. Файл поддержхи ListContro l s.aspx . cs


• ~3а п устите п р и ложени е. В броуэере п о я ви тся п р и мер н о така я

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

• ~Запустите прилож ение. В броуэере появится примерно такая

I lв"'''"'~""Ы '''Щ",'" CheckBoxList1:

II ~~:::: 1 О Опц~.я 3 [j Опция 5


11\ 2 ~ОПЦИf1 4

1 :~ ~::::: QОПЦИf1
31 Q ОПЦИf1 4
5
2
1

Пример статического списка BulletedList

Этот элемент ynравления генерирует либо НТМL -список <и 1 > , либо
<01> . Набор элементов списка задается чере з свойство-коллекцию
1te ms . Им е ются и другие свойства , приведенные в таблице.

Некоторы е свойства элемента System.Web.UI. WebContmls.BulletedList


Свойство Описание

Определяет тип списка. Допустимые


значения определяются п е речислением

Bulle t Sty 1 e : Numbe r ed ( 1 , 2 , 3 ,


.) LowerAlpha (а, Ь , с ,
.) UpperAlpha (А, В , С ,
.) LowerRoman (i, l l , i i i,
Bu11etStyle .) UpperRoman (I, 1 I, II I,
. ) . Форма маркеров при установленном

'"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

значениями этого же п е речисления

Bulle t sty l e : Disc , Circle ,


Square , Custom l mage
Если свойствоBul l etS t yle установлено в
Customlmage , то это свойство
Bu l letl mageUrl Bulle t lmageU r l должно указывать на
изображ е ни е, используемое в качестве
маркера

Устанавливает первое значение , с которого


FirstBu l letNumber ~
начнется нумерованныи список

Имеет значения HyperLink ,


L i nkButton , Te xt и определяет, во что
Display Mode
трансqюрмируется текст каждого элемента
(текст,2unерссылка)

• ~Добавьте к приложению новую страницу с совмещенным


кодом. Поместите на страницу элементы Label и
BulletedL i st . Н астройте свойства элементов в соответствии
с приведе нны м кодом.

<%@ Page Lапguagе= "С#" Аutо ЕvепtWirеuр=''truе'' %>

<script nшat= "sе rvег">


protected уою BuIletedListl_Click{object sепdег, ВuIlеtеdListЕvепtAгgs е)
(
Labell.Text = ВuIlеtеdList1.Itеms[е.lпdехJ.Техt;
)
</script>

<html xmlns ="httр ://www.wЗ.огgl 19 99/xhtml">


<head nmat="server">
< title > Uпtitled Page</tide>
<lhead >
<body>
< fопn ю ="fоrml " ruпаt= "sеrvег''>
<div>
Выбрано свой ств о:
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Выбрано свойство:
<asp:Labe! ID=''Labe!l '' ruпаt="sеrvег' '></аsр:LаЬе!>
< р />
< аsр:ВullеtеdList ID =''Вullеtеd Listl '' nшat="sеrvег"
BulletS tyle= "N шnЬегеd" DisрlaуМоdе=''LiпkВuttоп''
ОпСliсk= ' 'ВullеtеdListl Click''>
<asp :ListItem> N otSet</asp :ListItem>
<asp :ListItem> N umbered </asp:ListItem>
<asp :ListItem> Lower Alpha</asp :ListItem>
< asp :ListI tem> U р регAlp ha </asp :ListI tem>
<asp :ListItem> LowerRoman</asp :ListItem>
< asp :ListI tem> U р perRo man</asp :ListI tem>
<asp :ListItem> Disc </asp:Listltem>
< asp :ListI tem> С ircle </asp :Listl tem>
< asp :ListI tem> 5 quare</asp :Listl tem>
< asp :ListI tem> С ustomImage </asp :Listl tem>
</asp:BulletedList>
</div>
</form>
</body>
</html>

Листинг Код страницы примера в файле Bul letedLi st . aspx

Задав ДЛЯ списка атрибуг Dis play Mode= " LinkButton ", мы т ем
самым ВЮJючили на ЮJиенте постинг ДЛЯ каждого пункта с пи ска .

Р езул ьтат примера БУдет таким

,ее
П""'?'W"'~""'"" ASP.NET

Выбрано свойство: UpperRoтan

1. NotSet
2. NшnЬегеd
З. LowerA1IJha
4. UpperA1pha
5. LowerRoтan
6. UIJIJerR&тan
7. Disc
- -
8. Circ1e
9. Square
10. Custoтlтage

jаvasсфt:_, Local in1J" anet

Элементы проверки достоверно сти (валидаторы)

ОДН ОЙ и з важных задач НТМL~ дескр ип тора < f or m> является сбор и
передача данных у сво и х элементов управления. Часто Web-страницы
запрашивают у п ользователя какую-либо информацию, за т ем сохра н яют
ее во вспомо гател ьной базе да нн ых. Всегда нужно пр оверять введен н ую
пользователем информацию на предмет СQЦержан ия ошибок или
злонамеренного кода , которые мо гуг вызвать сбой в р аботе саЙта .

Существует три с посо ба про верки да нных поль зователя на


корректность:

'"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

1. Проверка да нны х на клие н те


2. Проверка данных на сервере
з. Проверка да нны х и на клиенте и на сервере

Проверка данных на клиенте осуществляется с по мощью специальных


методов на языке сценариев JavaScript. Недостаток таких методов
состоит в том, что броузер кrlИента может не подцерживать JavaScript
или клие н т на мерен но ОТЮlючил в броузере эту подцержку для
безопасно сти . Таким образом, на ЮlИентскую проверку полагаться не
стоит, хотя она реализуется проще и выполняется быстрее.

Проверка на сервере не зависит от настроек Юlиента и ее выполнение


можно предусмотреть всегда. Недостаток такой проверки состоит в том ,
что данные пр ежде должны поступить на сервер , и только после этого

их можно проверять. При обнаружении некорректных данных их н ужно


отправить назад Юlиенту с сопроводительным предУПреждением. Такие
никчемные пересылки могуг повторяться м ного кратн о до тех по р, пока

мы н е дождемся корректных дан ны х. Э то может занять мно го времени.

Самым эфрективным будет реализация пр оверки и на Юlиенте и на


сервере. При таком способе , если на клие н те работает JavaScript, то при
обнаружении ОlШfбки обращение к серверу отсугствует и клиенту сразу
на месте выдается предупреждение. В случае , если JavaScript не
работает, то да нны е проверяются на сервере .

в VlSua l Studio 2005 на ВЮlадке Validation панели Toolbox содержится ряд


элементов, специально предназначенных для выполнения проверки

да нных, а именно

1. Requ i r edF i eldVal i dato r ко нтр олирует, не п уст ли


пр оверяемый элемент управления при отправке формы
2. Compa r eVa l idator - проверяет, соответствует ли значение
связанного элеме н та управления о пр еделенной операции
с р авнения (больше, меньше и т.д.) с другой констан то й
з. RangeValidato r контролирует, находится ли значение
связа нного элемента управления в задан но м диапазоне. Диапазон
может быть числом , датой или строкой
4. Regu l arE x p re ssionValidator - пр оверяет, соответствует
ли значение связанного элемента управления определе нному

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

регулярному выражению

S. Cus t omVal i dator позволяет определить собственную


логику проверки достоверности на JavaScript
б. ValidationSu mma r y отображает на странице или

всплывающем окне итоговую июlюрмацию с сообщениями о


найденных ошибках про верки достоверности

Эти валидаторы позволяют организовать проверку данных как на


кrJИентской стороне, так и на сервере. С их помощью можно
формировать сообщения об ошибках. Н екоторые элементы управления
можно проверить по содержимому свойства Value, которое является
скрытым атрибугом и в броуэере не отображается.

За каждым элементом управления можно закрепить несколько разных


валидаторов даже одного типа , наделив каждый из них своими
полномочиями.

Элемент RequiredFieldValidator

Самым простым валидатором является элемент


RequiredFieldVal i dator . Он проверяет, не является ли
связанный элемент п устым. Можно задать и пр едопределе нное
значение для проверЮ1 совпадения через свойство 1 ni tia l Val ие . В
этом случае проверка считается неудачной, если содержимое элементов
управления совпадает с 1 ni t i al Va l ие . Валuд аmар
RequiredFieldVal i dator связывается с проверяемым элементом

ч е рез свойство Соп


tr ol ToVal i da te .

Индиви дуал ьное сообщение об ошибке в валидаторе можно задать в


свойстве Te xt или разместить между открывающим и закрывающим
дескриптор ами валuдаmора. Наприм е р

<asp:TextBox ID='TextBoxl " гuпаt="sе rvег"></аsр:ТеxtВох>


<asp:ReqlliredFieklValidator ID='Val1" nmat= "server"
Co ntrorro Validate= ' TextВoxl " Width= ''2 1 7рх' '>
Запол ни те поле TextВoxl
</asp:RequiredFie ldValidator>

,СО
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

< Ьг />
<asp :TextBox ID='TextBox2 " гuпа t="sеrvег">< /аsр :TextBox>
<asp:ReqlliredFieklValidato r ID='Val2" nmat="server"
Co ntrofГo Valid a te='TextВox2" Width= ''2 1 7рх''
Техt= "З апол ни те п оле TextBox2" />

Есл и мы хотим вы дать сообще ния о всех ошибка х сраз у, то это делается
ч е рез элемент ValidationSumma r y , а предупреждение от текущего

вал uдаmора нужно записать в его свойство Er r orMessage .

Разместить элемент RequiredFie l dVal i dator можно в любом


месте стра ниц ы , гд е мы хотим ви деть сообщение об ошибке .
Использование отведе нн ого места дл я вывода сообщения об ошибке
опред еляется свойством Di splay вал uдаmора , которое может
принимать следующие значения:

• Dynami с - не за ни мать м е сто , если нет ошибки


• Stat i c - держать место н езависимо от ошибки (устан овлено по
умолчанию)
• None - валuдаmор есть , но место н е занимает и ошибки не
отображает, а скрытн о контролирует элемент управления для
элем е нта суммарных ошибок Val id a tionSumma r y

Ниже пр иведен пример , в котором вал uдаmоры


RequiredFieldVal i dator следят за за п ол н е ни ем текстовых

полей и предупреждают п ользователя . Вал uдаmоры различаются


значен и ем свойства Dis play.

<%@ Page Language="C#" AutoEventWireup=''true'' %>

<html xmlns=''httр ://www.wЗ.огgl 1 999/xhtml''>


<head nmat="server">
<title>Untitled Page</tide>
</head>
<body>
< fо пn ю ="fо rm l " runat="server''>
Фамилия:
<asp :TextBox ID='TextBoxl " гuпа t="sе rvег''></аsр :TextBox>
<asp:ReqlliredFieklValidator ID='Val1 " nmat="server"
'"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Controrro Validate= 'TextBoxl " Техt="З аполните поле TextВoxl " Dis!=
!Оynашic!
< Ьг />
Имя:
<asp :TextBox ID='TextBox2 " runat="server''> </asp :TextBox>
<asp:ReqlliredFiek:lValidator ID='Val2" nшat= "sе rvег "
ControrroValidate='TextBox2" Техt="З аполните поле TextВox2" />
!Static!
< Ьг />
Отчество:
<asp :TextBox ID=' ТехtВохЗ " runat="server''> </asp :TextBox>
<asp:ReqlliredFieklValidator ID ='Vа lЗ" nшat="sе rvег"
Controrro Vаlidаtе= ' ТеxtВохЗ " Техt="З аполните поле ТехtВохЗ " Dis!=
!None!
< Ь г />
<aspButton ID="Buttonl " runat="server" Теxt='Заре гистрироваться" />
</form>
</body>
</html>

Листинг Применение валидаторов RequiredFieldValidator в


файле Validl.aspx

Страница с приведенным кодом ге н е рир ует на броузер следующий


результат

111 Untltled Page - MICrosoft Internet Explorer

Фawшия:: I Зшrошште поле TextВoxl !Dynamic!


Имя: I Зшrошште поле TextВox2 ! Static!
Отчество: rl------:::::O:· !None!
I Зарегистрироваться

1~i)~Dтe~======:::::'--------ГГГ~LОС3iltrа~t
Если исследовать поведение страницы, то можно сделать несколько
важных выводов:
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

• При первом запросе страницы клиенту предоставляются пустые


текстовые поля и сообщений об этом нет.
• При нажатии кнопки инициации постинга против пустых полей
появляются предупреждающие сообще ния и форма не отсылается.
Это работает JavaScript, который сгенерировали валидаторы
страницы.

• Валидатор с атрибугом Di splay= " Dynaт i c " при скрытии


сообщения сразу освобождает место. Валидаторы с д ругими
значениями этого атрибуга ведУГ себя так, как говорил ось ранее.
• Кнопка обратной отсылки начинает действовать только тогда ,
когда все поля будУГ непустыми.

Попробуйте ОТЮlючить в своем броузере подцержку активных


сценариев. Для этого:

• Г;;:;=Выполните команду броузера Toolsllntemet Орtioпs ... Откроется


окно lntemet Options, в котором перейдите на вкладку Security

m
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET
--~.;......;...
Internet Options ? Х

Geners.1 Security IPri\tв.C'y' I Content I Соnnеctiоnз I Progrsms I АdV8Лсеd I


Select ~ WеЬ content zone (о specify its security setlings.

о о
Trusted sites Restricted
sites

Local intranet
This соnе conts.ins sll Web sites thst ше
Sitез ..
оп your org ~n iz~tion's intr~net.

Security level forthis шnе

Custom
Custom sеttingз.
- То chsnge the зеttingз с dick OJstom Level ~
- То use the recommended settings, click DefOO!l Level

Custom Level" Def ~uK Level

ОК OTMeH~ Применить

• ~ыделите на вкладке з ону Local intemet и щел кните на кн о пке


Custom Level
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Securitv Settings

Settings:

о Disable
o Enable
О Prompt
~ Userdata pers isterce
О DisablB

, o ЕnaЫв
S[фt~

~ A[ti\le s[ript~
О Disable
o
u
Enable
О Prompt
~ Allow paste operations \lia scфt
О Disable
o ЕnaЫе
О Promot

, "езе, cu,tom settlngs
"ese' 10 I M8dum-lоw _ R888
------"1 1

СЗхвl

• r;:;'в открывшемся окне отметьте n ереЮIючатель ScriptlnglActive


scriptlngIDisable , тем самым ОТЮIючится поддержка броузером
сценариев JavaScript

Теперь можно увидеть, что валuдаmоры срабаты вают только после


п остин га, по скол ьку обрабатыв аются н а сервере .

Есть общее булево статическое свойство Page . IsVal i d для


страницы. Если его значение равно tr ue , значит п роверка всех

вали даторов стра ниц ы nрОlШlа усnеllllЮ . Небольшой п ример


демонстрирует nрименение этого свойства страницы. В нем , если
п роверка n РОlШlа успешно, то пользователь регистрируется (услов н о).

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

<%@ Page Lапguagе="С#" %>

<script nmat="server''>
protected void ЬtпRеgistег_Сlk:k(оЬjесt serкler, EventArgs е)
(
ЩР age.ls Valid)
{
11 Все введено, можно реrnстрировать
Labell.Text = "Вы зареrnст рир ованы";
Label1.ForeColor = Systеm.Dгаwiпg.со!ог.whitе;
Label1.BackColor = Systеm.Dгаwiпg.Со lor. Gгееп;
}
}
</script>

<html xmlпs=''httр ://www.wЗ.огgl1999/xhtml''>


<head nmat="server">
<title>Registered Page</title>
<lhead >
<body>
< fопn kl="fопnl" ruпаt="sеrvег''>
<div>
<asp:Labe! ID=''Labe!l '' ruпаt="sеrvег" Теxt=''Просим зареrnстриров
< Ьг 1>
First Name:
<asp:TextBox ID="tbFirst" nmat="server" 1>
<asp :ReqlliredFieklValidator ID= 'ReqlliredFieklValidatorl" nmat= "serve
ControfГo Validate= ''tbFirst'' Теxt=' 'Введите первое имя" 1>·
Last Nаше:&пЬsр;
<asp:TextBox ID="tbLast" nmat="server" 1>
< asp :Reqllired F ie kl Valida to r ID= 'Reqllired F ie kl Validato г2" nmat= "serve
ControfГo Validate=''tbLast'' Техt=''Введите второе имя" 1><
< Ьг 1>
<aspButton ID='ЪtпRе gistег" runat="server" ОпСliсk='ЪtпRеgistег_Сliс
</div>
</foпn>
<!body>
<lhtml>

'"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET
Листинг Пример ИСПОЛЬ90ваНИR свойства Page.IsValid в файле

IsValidTest.aspx

Элеме н т yn р авления Requi r edF i e l dVal i dator может

и спользоваться не только с текстовыми п олями , но и с д ругими

элемен тами ynравле ни я, например , CheckBo xL ist .


Chec k Bo x.
Rad i oBu t ton . Rad i oBu t tonL i s t , Dr opDownLi s t , L i s t Bo x .
Приведем пример ко нтр оля за выбором в с пи ске с при мен е ни ем
свойства 1 ni tial Val ие . БУдем и с п ользовать скрытый валuдаmор, а
его с игн ал БУдем пр оверять п о свойству Page . IsVal i d . Валuд аmор
будет уста н авливать это свойство в f alse (с игн ал ошибки) , если
н еотоб р ажаемый атрибуг Value выбранного пун кта списка сов п адет
п о значению со свойством 1 ni t i al Va l ие валuдаmора. Код стра ницы
с при мерам будет таким

<%@ Page L апguagе="С#" %>

<script nшat="sеrvег''>
protected void Buttonl_Ctick(object sender, EventArgs е)
(
if ('Page.lsValid)
(
11 С р абатыв ает при ОТЮlюченной подцержке JavaScript
11 в броузере. Инач е JavaScript на юш е н те
11 н е разрешает постинг. пока есть неправильный выбор
Labell .Text = "Э та опция запрещена!";
)
e~e
(
Label1 .Text = "Разр еше нный выбор!";
)
}
</script>

<html xm1пs=''httр ://www.wЗ.огgl 19 99/xhtml''>


<head nmat="server">
< title > List Valida te </title >
<lhead>
<body>

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

< fо пnid="forml " runat="server''>


<div>
<asp:Labe! ID=''Labe!l '' runat="server" Теxt=' 'Вы дели те опцию " />
< Ьг />
<asp:DropDownList ID=''DropDownList1 '' runat="server''>
<asp :Listltem Vа luе =' 'Н е вы д ел яемая ' '> Пус тышка </а s р :Listltem>
< а sр:L istltе m> Оnция 1 </asp:Listltem>
<asp :Listltem>O nция 2</asp:Listltem>
<asp :Listltem>O nция З</а s р:Listltе m>
</asp:DropDownList>
<asp :RequiredFieklValidato r ID='RequiredFieklValidatorl" runat= "serve
C ontrofГo Validate=''DropDownListl '' Display=''N опе " lnitia!Va!lle= "Н
< Ьг />
<aspBlltton ID='Buttonl " runat="server" Те xt="SllЬшit" OnC lk:k='Blltt(
</div>
</foпn>
</body>
</html>

Листинг Страница с примером в файле ListValidate.aspx

в последн ем при мере мы д олжны понима ть, что при ВЮJюч е нной н а
ЮJи е нте поддержке JavaScript nр едУЛ реж.цение об ошибке никогда не
будет выдано кодом страницы , п отому что п остинг броузером будет
заб локирован , п ока польз овател ь не сдел ает пр авильный выбор.
Обратите внимание н а н астройки в ал uдаmорй. О н не сможет выдать
те кстово е nр едynреж.це ние пользователю , по тому что мы сделали его

н еот об р ажаем ым ( Display= " None " ) и удалил и за ненадобностью


свойства-сообще ни я ErrorMessage и Te x t .

Элемент CompareValidator

Этот э лемент позволяет сравнивать введенное поль зо в ателем зн ачение


с этало нным з нач е ние м или срав нив ать тип вв еде нны х да нных с

за р а нее заданным типом. О н имеет следующие основные свойства

Основные свойства Sуs tеш.WеЬ.UI. WеЬ Сопtro/s.С ошр а геVаlidаtor

Свойство Описание
В.М. С """,,,в Про,р а ммupoвtJNШ' 110 ASP. N ET

ЭТО свойство контролирует ти п вводимого


значения в закрепл енное поле и может

принимать з начения :

• Currency - следит за соблюдением


ф:Jрмата денежного представления
Туре • Dа te - кон тролир ует ф:Jрмат даты
• Double - р азрешает только число с
плавающей то чкой
• In teger - ожидает ц елое число
• S t r ing - позволяет принимать любую
строку

Определяет, какую операцию сравнения


нужно вьшолнять. Подцерживает следУЮщие
операции сравнения:

• Equal - следит за соблюдением


равенства значений междУ
контролируемым полем ввода,
заданным в свойстве
Соп trol ToVal ida te , и эталонным
полем Соп trol ToCompare , либо
между Cont r o l ToVa l ida t e и

установленной константой, заданной в


Value ToCompare
• NotEqual - то же, что и Equal ,
только наоборот - следит, чтобы
соблюдалось неравенсmво
• Gr eate r Than - следит, чтобы
контролируемый ввод был больше, чем
в эталонном поле или установленной
константе

• GreaterThanEqua l - следит, чтобы


Opera tor контролируемый ввод был не меньше,
чем в эталонном п оле или

установленной константе

'"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

• LessThan - следи т, чтобы


контролируемый ввод был меньше, чем
в этало нном поле или уста нов ленной
константе

• LessThanEqual - следи т, что бы


контролируемый ввод был н е больше,
ч ем в этало нном поле и ли

уста нов ленной константе


• DataTypeCheck - следи т, что бы тип
данны х в контролируемом вводе

совпадал с типом , определенным в

свойстве Туре . При установке этого


режима свойства
ControlToCompare и
Value ToCompare игнорирую тс я (в
данном случае важен формат данных, а
не и х з н аче ние)

Взаимоисключающие свойств а,
Control ToCompa re,
определяющи е либо эталонное поле
Va lue ToCompare
сравнения, л и бо ко н стан ту

Прив едем прим ер:

<%@ Page L апguagе="С#" %>

<script nmat="server''>

protected void Buttonl_Ctick(object sender, EventArgs е)


(
if (Page.lsValid)
(
Response .Write("<hl > З а каз прин ят! <lhl >'');
Buttonl .Enabled = false;
}
}
</script>

'"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

<html xmlns=''httр ://www.wЗ.огgl1999/xhtml'' >


<head nmat="server">
< title > С ошраге Valid ator</title >
<lhead>
<body>
< fопn ю="fоrml" runat="server''>
<div>
<h2 >
Товар ''Ро га и копыта"< Ih2>
Им еется в наличии:
<aspTextBox ID='TextBoxl" runat="server" EnabIed=''False''> 25 </asp :
Сколько хотите заказать:
<aspTextBox ID='TextBox2" runat="server" I>< br 1>

<asp:RequiredFieklValidator ID='Val1 " nmat="selVer" ControrroValidatE


Display=''Dynamk:'' Техt=''Укажите количество товара" 1>

<asp:CompareValidator ID='Val2" runat="selVer" ControrroValidate=''Ji


Display=''Dynamk:'' Техt="Заполните прави льно поле заказа"
Type= '1nteger" Controrrocompare= 'TextВoxl" О perato r=''LessThar

<asp :Соmра ге Validator ID ='VаlЗ" runat= "selVer" Controrro Validate=''Ji


Display=''Dynamk:'' Техt="Заполните прави льно поле заказа"
УашеТоСоmраге=''О'' Орегаtог="GгеаtегТhaп" I>< br 1>

runat="selVer" Теxt="Отправить
< аsр:Вuttоп ID=''Вuttопl '' заказ"

OnClick='Buttonl Click" 1>


</div>
</form>
<!body>
<lhtml>

Листинг Пример использования валидатора CompareValidator в


файле CompareValidator.aspx

в п римере в поле Tex tBo xl указа н о имеющееся кол и чество товара.


Поле Text Bo xl является недоступным для редактирова ни я. За п олем
Te x tBo x2 закрепл е ны три валuдаmара:

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

1. Первый валидатор ( Vall ) следит, чтобы поле не было п устым


2. Второй валидатор ( Va12 ) контролирует, чтоб ы введенное
значение было цеЛО20 типа и было меньше или равно значению
п е рв ого поля

з. Третий валuдатор обеспечивает, чтобы введенное знач е ние было


больше н уля

Все валид аторы примера выводят сообщение в одно и то же место.


Если данные , введенны е поль зователем, Удовлетв о ряют установленным
критериям , то об р атн ая отсылка страницы прини мается , о ч ем
пользователю посылается и зве щение.

Элемент RangeValidator

Этот элемент подобен предыдущем у. В е го обязанность входить


контроль за тем, находится ли значение связанного элемента управления

в зада нном диапа зо н е. Диапазон может быть числом , датой и ли


строкой. Перепишем предыдущий пример , где вместо двух валидаторов
CompareValidator прим е ни м один RangeVal i dator .

<%@ Page Lапguagе= "С#" %>

<script nmat="server''>

protected void Button1_Clk:k(object sе пdег, Еvе пtAгgs е)


(
if (Page.lsValid)
(
Rеsро пsе . Write("<h1> Заказ принят! <1h1> '');
Button1.Enabled = false;
}
}
</script>

<html xmlns=''httр://www.wЗ.огgl 1 999/xhtml''>


<head id=''Неаd 1 '' nmat="server">
< title > С ошраге Valid ator</title >
в.м. С """,,,в Про,р а ммupoвtJNШ' 110 ASP. N ET

</head >
<body>
< fопn id="forml " runat="server''>
<div>
<h2 >
Товар ' 'Ро га и копы та "< Ih2 >

Имеется в наличии:
<aspTextBox ID='TextBoxl " runat="server" EnabIed=''False '' Text= "25 '
Сколько хоти те заказать:
<aspTextBox ID='TextBox2 " runat="server" I><br 1>

<asp:RequiredFieklValidator ID='Val1 " nшat="sеrvег " ControrroValidatE


Display= ''Dynamk:'' Техt= ''Укажите количество товара " 1>

<asp:RangeValidator ID='Val2 " runat="server" Controrro Validate='Textl


Display= ''Dynamk:'' Техt="Заполните правильно поле заказа "
Type= '1nteger" MirllmumVarue="l " MaximumValue= "25 " I><br 1>

<aspButton ID= 'Buttonl" runat="server" Теxt= "Отп р авить заказ "

ОпСliсk =' 'ВuttопС С liсk '' 1>


</div>
< /foпn>
<lbody>
</html>

Ли стинг . Пример и с пользовании валидатора RanqeValidato r в


файле RanqeValidator.aspx

Элемент RegularExpressionValidator - пока пропустим!

Элемент Custom Validator - пока про пустим!

Элемент ValidationSummary - пока пропустим!


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Применение серверных элементов управления

Прим е р исследования жизненного ЦИЮJa страницы. Перехват событий


жизненного цикла страницы в обработчиках. Ди на ми ч еское добавление
элементов ynравления.

Серверные элементы управления можно добавлять к странице как


декларативно, так и прогр амм но. Но нужно понимать жизненный циКII
страницы. Код окна локально го приложения Windows остается в памяти
компьютера до тех пор , пока пользователь н е закроет это окно. Web-
страница загружается в па мять сервера при пол учении запроса от

пользователя . Она анализирует постynившую инф:Jрмацию, генерирует


н еобходи мый код , отдает е го НТГР и автоматически выгружается из
памяти .

Такой порядок существования ст р аницы уста новл ен для экономии


ресурсов и масштабируелюсти (стремления обработать как можно
больше пользователей). Он называется жизненным циКIIОМ страницы .
Жизненный циКII страницы сопровождается рядом знаковых событий ,
для которых можно создать обработчиЮ1. Для ди намич еского
добавления элементов ynравления на страницу нужно знать, в
обработчике какого события страница готова принять свои дочерние
элементы.

Пример исследования жизненного цикла страницы

Давайте на практике исследУем порядок ген ераци и событий на


про тяжен ии жизненного ЦШU/Q страницы. Названия событий можно
получит ь даже из п устой .aspx -страницы, если включить трассировку в
испол няющей среде ASP.NET

• ~Создайте в выбранном каталоге п устой проект Web-


приложе ния LifeCyc!eEvents командой FilelNewlWeb Site оболочЮ1
Visua! Studio 2005
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

.1J~

..•
T...-rpl ..,... Гf! ;:;:

~ ~ ~
АЧ' r.ET \', 00 ASP J-ET W3!J ж-sma l Vloo
Sib SOfYEO Si'" stoc"" K~

• r;:;'в панели Solution Explorer (или в меню Website ) вызовите


контекстное меню для узла проекта и выполните команду Add
New ltem Настройте диалоговое окно мастера так
.1J~
T<><rpla>?> ri! ;:;:


l/ШIiIIIII
D
м.",..- Р"9"
[!j]
_ с_

ccrn-o l
00
КТf.1.. ""9"
!i
Web S• ..,~e
~
С ",,,
~
stj l< SCe" t

CiiJ
C~,

"«J 1 ~a~ ",


-
[}
crn~l;JJ a ~I ",
~
)(]VL F,", ХМ-
\JjJ
Schotm То"
~
Fil2
~
R о=л: .

.
Fi:"
ij
SQ.- о..:..ь=

1m
Dазset -~, ~
5Ite М"!)
1J]r"
с

M:N eVIOO
~
\'В5C r "" F(e
lf.jJ
,-,
~
J5CfjX ""
I-I.rd e.. ' ..m

rв::;" ~ -"'" ~ ф1 jjJ


I д form for Wob ц" ь""",

~W I Def<OJ lt<bpx

L~: I Vislя l С, iI ~ PliO:e с сОэ n "'1R ае fii3


Г Selea rrвstef IВ'J"

Обратите вниман и е, что мы добавляем страницу с отделенным

'"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

кодом (ВЮlючен флажок Р!асе code in separate fi]e ).


• ~Запустите добавленную стра ницу на выполнение щелчком на
кнопке Start Debugging.

Появится о кн о с предупреждающим сообщением, что для режи ма


отладки нужно создать канфигурацuонный файл Web.Config с
параметром ВЮlючения отладки

DеЬugglпg Not EnabIed .1J x


The Pag.:J carrot Ье run il ооЬщ modе because debuggilg is гюt enabled il lhe Web,crnf1g
file, what wo u(J ~ou Ii<:e to оо?

r- Act1 а new lNeb,crnf1g пе with deЬLЩiпg enctJled,

..n DeЬ uщ iпg Яlоu (J ье drsabled in Ihe W8b,crnf1g Ш:о before deplщilg the
W8b site to а prod..ctial ооугrnmепt,

r Rm wilhxit deb.Jggilg, (ECf-liузlепt to ClrI+F5)

• г;.:.=щелкните на кнопке ОК и оболочка создаст


конфигурационный файл в корневом каталоге пр оекта

Автом атически запустится встроенный броуэер с п устым


рен де рингом.

• ~Закрой те броуэер и вновь е го зап усти те кома н дой оболочки


FileNiew in Browser (или одноименной командой контекстн о го дл я
страницы меню)

в строке адреса броузе р а будет прим е рно следующий текст

ссылка: httр :l!lосаllюst :12 0бlLife Сус lеЕvепtslDеfauh . а s рх

• г;.:.=Замените в строке адреса броузера блок Default.aspx на


Trace.axd и ПОllИите запрос примерно с таким адресом

ссылка: httр :l!lосаllюst :12 0бlLife Сус lеЕvепtsfТга се. ахd

Сер вер выдаст сообщение об ошибке с предложением внести в


В.М. С """,,,в Про,р а ммupoвtJNШ' 110 ASP. N ET

конфuгурацuонный файл предлагаемый блок кода

< сопfigшаtiоп>
<system.web >
<trace enabled= ''true''/>
</system. web>
</соnfigшаtiоп>

• IJ$Скопируйте строку <trace enabled= " true " />


параметра , включающего трассировку страниц приложения , и

поместите ее в файл Web.Config проекта в секцию <system.web>,


где уже находи тся параметр <compilat i on
debug= " t r ue " /> , включающий отладку
• Г;:;=Запустите приложение и в строке адреса броузера вновь
введите вызов страницы Trace.axd

Появится страница трассировочных данных, в которой щелчком на


гиперссылке View Details (показать подробности) мы получим распечатку
трассировЮ1 нашей пустой страницы. В секции Тгасе Information
приведен список событий, генерируемых страницей на разных этапах
жизненного ЦШU/Q

Тгасе Iпfопrntiоп

Ргот
Category Message Ргоm First(s)
Last(s)
aspx.page Beg i n Pr eln i t
aspx.page End Prelni t 0,01754301175149360,017543
aspx.page Beg i n In i t 0,020 14781208226190,002605
aspx.page End Ini t 0,03765702065485980,017509
aspx.page Beg i n I nitComplete 0,0381149000780825 0,000458
aspx.page End In i t Complete 0,04003078603565540,001916
aspx.page Beg i n PreLoad 0,04203327517882860,002002
aspx.page End PreLoad 0,04339266582764010,001359
aspx.page Beg i n Load 0,0438189 76992886 0,000426
aspx.page End Load 0,04991751744984350,006099
aspx.page Beg i n LoadComplete 0,0503580762359462 0,000441
,ее
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

aspx.page End LoadComplete 0,05169120656396270,001333


aspx.page Beg i n PreRender 0,05257651461289070,000885
aspx.page End PreRender 0,0658033353401061 0,013227
Beg i n
aspx.page 0,06823520866478840,002432
PreRenderCo mple t e
aspx.page End PreRenderComplete 0,07015891684557670,001924
aspx.page Beg i n SaveState 0,164382065318358 0,094223
aspx.page End SaveState 0,39629729476791 0,231915
Beg i n
aspx.page 0,39674344085631 0,000446
SaveSta t eCo mple t e
aspx.page End SaveStateComplete 0,398069307691341 0,001326
aspx.page Beg i n Render 0,398760456985455 0,000691
aspx.page End Render 0,646856234521427 0,248096

Этот порядок следования события не меняется. Некоторые из них, пока


е ще страница способна прини мать управляющий код , можно
п ерехватить в обработчиках. Давайте для тренировки сделаем это.

Перехват событий жизненного цикла страницы в


обработчиках

• ~ змените код разметки страницы Defauh.aspx, чтобы он


выглядел так

<%@ Page Language="C#" AutoEventWireup=''true''


CodeFile= "Defauh. aspx.cs" Inherits="_Default" %>

<html xmIns='hup ://www.w3.or!j'1999/xhtml" >


<head runat= "server''>
<tide >Untitled Page</tide>
<lhead>
<body>
<form ю ="foгm1 " nmat="server''>
<div id="div1 " nmat="server">
<h1 align="center" style="co lor: Red ''>
Д иагностика со б ы тий стр а ницы < 1h1 >
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

</div>
</fonn>
</body>
<lhtml>

Листинг . Разметочная часть страницы Default


• Г;;:;=Откройте файл отделенно го кода Defauh.aspx.cs и заполните
е го так

using System;

риыic рапial class _Defauh: System.Web.UI.Page


(
protected void Page_Load(object sепdег, ЕvепtAгgs е)
(
System. Diagпоstk: s . Debug. WriteLine(
"** ** ********Page_Load ** ** ** ** *'');
Resp о пsе. Write("P age _ Load < Ь г> \п '');
divl.lппегНtml += "Раgе_Lоаd < Ьг> \п ";
}

protected void Page_PreLoad(object sender, EventArgs е)


(
System. Diagпоstk: s . Debug. WriteLine(
"************Page_PreLoad*********'');
Respo пsе. Write("P age _ Рге Load < Ьг > \п'');
divl.lппегНtml += "Раgе_РгеLоаd < Ьг>\п";
}

protected void Раgе_Ргеlпit(оЬjесt se nder, EventArgs е)


(
System. Diagпоstk: s . Debug. WriteLine(
"** ** ********Page_Pre l пit* ** ** ** ** '');
Resp о пsе. О utp ut. Write Line("P age _ Р ге lпit < Ьг > '');
divl.lппегНtml += ' 'Раgе_Ргеlпit < Ьг > \п'';
}

protected void Раgе_lпit(оЬjесt sender, EventArgs е)


{

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

System Diagпоstk:s. Debug. Write Line(


"************Page_lnit*********'');
Resp о nsе. О utp ut. Write Line(''P age _ lnit<Ь г> '');
div1.lппегНtml += ''Раgе_lnit < Ь г>\п'';
}

protected void Page_PreRender(object se nder, EventArgs е)


(
System Diagпоstk: s . Debug. Write Line(
"** ** ********Page_Pre Render* ** ** ** ** '');
Resp о nsе. О utp ut. Write Line(''P age _ Р ге Rerкler < Ь г> '');
div1.lппегНtml += ' 'Раgе_РгеRепdег< Ь г> \п'';
}

protected void Page_Rerкler(object sender, EventArgs е)


(
System Diagпоstk: s . Debug. Write Line(
"************Page_Rerкler*********'');
Respo nsе. О utput. Write Line(''P age _ Rепdег < Ь г> '');
div1.lппегНtml += ' 'Раgе_Rепdег < Ьг>\n'';
}

protected void Page_ UnLoad(object sender, ЕvепtAгgs е)


(
System Diagпоstk: s . Debug. Write Line(
"** ** ********Page_ UnLoad******** *");
/lResponse .Output. WriteLine(''P age_ UnLoad < Ь г> ''); // По здно, уже
div1.lппегНtml += ''Page_UnLoad <br>'';// По езд ушел , выводим]
}
}

Листинг . Кодовая часть страницы Default

в каждый обработчик событий жизненного циКIIa ст раницы мы


включили т екстовы й вывод в три места:

1. В окно Output оболочки в режиме от ладки (вызывается командой


меню Vtew!Output
2. В генерируем ый отклик страницы впереди разметочной части

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

з. в разметочную ч асть страницы динами ч ески добавляем


инqюрмацию

• г;;;?Запустите страницу п од ynр авле ние м оболоч ки


сгенерируется следУЮЩИЙ рендеринг
Р.., у, ­
~"'"--'''
Р"""-",",-",,,
р.,,_Сood
~ . .. _P< , R , Мo ,

Диагностика событий стра ницы

Р'''''-'''-
Р ... _""
Р . .. _",,,• ..,
Р. .. _,-
POI"_"""" _

в окне Output оболо чки посл едние строки будyr такими

************ Р age_Pre lnit* ********

************ Р аgе_I пk*********


************ Page_PreLoad*********
************ Page_Load*********
************ Р age_PreRender* ** ******
************ Page_UnLoad*********

Ин терес но заметить , что код отладки и з готовой страницы уби р ать не


н ужно. Он автоматически не включается в компиляцию, если из
конфигурационного файла убрать пар аметр < compi 1 а t i оп
debug= " tru e " /> или выполнить стр аницу без отладки.

Стра ниц у без отл а дки мож но запустить напрямую , вызвав броузер
че р ез контекстное меню разметочной части стра ницы командой VIew in
Browser, или выполнив командУ оболочки DebuglStart Without Debugging
(выполнить без ВЮlючения отл а дки). В любом случае с р еда исполнения
AS P.NET п ерекомпил и рует страницу (если был и по след ни е изменения
в исходном коде по сравнению с DLL) и выполнит ее , направив
сгенерированный HTML-КОd броузеру.

Динамическое до бавление элементов управления

Приведем пример п рorрамм ного добавле ния элемен тов ynравления на


страницу.

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

• ~ома н дой меню FilelNewlWeb Site создайте новый Web-проект


типа ASP.NET Web Site
• Г;;:;=Откройте файл Defauh.aspx.cs и заполните е го следУЮЩИМ
КОДОМ

usiпg System;
usiпg System.Data;
usiпg Systеm. Со пfigша tiоп;
usiпg System. Collections;
usiпg System. Web;
usiпg System.Web .Security;
usiпg System. Web.UI;
usiпg System. Web. UI. WebControls;
usiпg System.Web.UI.WebControls. WebParts;
usiпg System. Web.UI.HtmlControls;

public partial class _Defa uh: System.Web .UI.Page


(
11 Поля для видимости в методах
Labellbll , 1b12;
TextВox te xtВox;
Button Ьtn;

11 Свойств о для генерации тега <Ьг> < !Ь г>


protected HtmlGenericControl BR
(
get { геtшп new НtmlGепе гiсСопtго~ 'Ъг''); }
}

protected void Page_Load(object sender, EventArgs е)


(
Ibll = пеw L а Ь еЮ;
IbI2 = пеw L а Ь еЮ;
textВox = new TextBoxO;
11 Подписка на событие с реrnстрацией обработчика
textВox.TextCha nge d += new Eve ntНandle r(textВox_TextC hanged);
btn = new ButtonO;

fо nnl .Сопtrоls.Аdd(lbll );

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

10nnl.Сопtrоls.Аdd(ВR);
10 nnl. С о пtrо Is.Add(1b 12);
10nnl.Сопtrоls.Аdd(ВR);
fo пnl. С о пtrо Is.Add( textВo х);
10nnl.Сопtrоls.Аdd(ВR);
10 nnl. С о пtrо Is.Add(btn);
textВox.FocusO;

if (! this . I sPostВack)
(
11 Настройки при первом запросе,
11 далее сохраняемые в ViewState
Ibl1.Text:= ''Label'';
Ibl1.тооrпр = "Э то текстовая меткаl";
Ib12.Text:= ''Labe2'';
Ib12.тооrпр = "Э то текстовая метка2";
textВox.Style.Value := "color: red; foпt-stуlе: italic";
tехtВох.тооrпр = 'Это текстовое поле";
Ьtп.Техt = 'К нопка ";
Ьtп.ТооШр:= 'Э то кнопка Submit";
)
}

уою tеxtВох_ТеxtСhaпgеd(ОЬjесt sе пdег, ЕvепtAгgs е)


(
striпgstr := "< Ь > " + te xtВox.Text + "<!Ь > ";
lbl1.Text:= str;11 Интерпретируемый вывод
lb12.Text:= Нttрutilitу.НtmlEпсоdе( stг) ; II Неинтерпретируем ыЙ вывод
)
}

Ли стинг Динамическое до бавление элементов управления на


стра ницу

Для п риема да нны х и з н ен адежных источников все дескрипторы н ужно


превратить в обычные текстовые с и мволы. Для это го п риме н яются два
од инаковых метода

• Sys t em . Web . Ht t pUt i l it y . Ht mlE n code ( st rin g )


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. NET

• Sys t em . Web . U I. Page . Se r ver . HtmlEncode(st ri ng)

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Пользовательские элементы управления

Пользовательские элементы управле ния : создание, реrnстрация.


Порядок генерации событий инициализации. Добавление событий.
Доступ из кода Web-страницы к составным компонентам
пользовательско го элемен та управления. Ди на мическое создание
пользовательско го элемента управления. Преобразование ст р аницы в
пользовательский элемент управле ни я. Управление динамической
за грузкой многих пользовательских элементов управления (портальные
каркасы).

Файлы к лекции Вы можете скачать здесь скачать:

httр :l/оkl.iпtШ. ruld е р аrtmeпtliпtеmеtlр rasp пеtlБЮБ _ We bS Ке4. zip

Пользовательские элемен ты управления (user contro!) разрабатывает сам


прогр аммист в тех случаях, ко гда ста н дартные элемен ты управления его

не удовлетворяют или он разработал удачный вариант кода . Такой


элемент управления можно мно гокр атно использовать на мно ги х

страницах и последующие е го модернизации немедленно будyr


отображаться на всех страницах, где он и с пользуется. Часто
пользовательские элеме н ты управления применяются для

стандартизации (единообразия) интерфейса страниц , например ,


оф:Jрмления верхнего и нижнего колонтитулов.

Пользовательский элемен т управления представляет собой небольшую


часть страницы , которая может содержать статический HTML-кod и
стандартные элементы управления. В пользовательских элементах
управления можно предУсмотреть свои свойства , методы и события .
Пользовательские блоки кода MOryr многократно использоваться на
разных страницах, но только одн ого саЙ та. Для применения в другом
сайте е го либо нужно ско пировать в этот сайт, либо создавать
библиотечные специальные серверные элемен ты наподобие
стандартных ( custom server contro! ).

Файл пользовательского элемен та управления может содержать то же


самое, что и файл обычной исполнимой страницы, включая файл
п оддержки .cs, статический HTML -кod, стандартные элементы
управления. Они получают те же самые события , что и объект Page,
и меют доступ к таким важным объектам-свойствам, как Аррlkаtiоп,

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Session, Request, Response. Но есть и существенные отличия:

1. В отл и чие от страниц, файлы которых и меют р асширение .aspx,


пользовательские элеме н ты управлен и я должн ы хра ни ться в

файлах с расширен ием .ascx


2. Объект страницы п роизведен от масса Page , а объект
п ользовательского элемента управления производится от масса

UserControl . Но учи тывая, что оба масса


( Page и
Use r Con r o l ) наследУЮТ масс Temp l ateControl . они
п ри обретают много один аковых свойств и событий от этого
масса

ObJect Browser
Browse: .NEТ Framework ... ,.. I
System.WebUITempo.teConb"d •
EJ ..·'I$ System.WebUITempo.teConb"d
Base Types
Derived Types
",'1$ Page
8 '1$ UserCoob"ol

з. Среда исполнения не может напрямую вызвать файл .ascx, а


должн а это делать через .aspx, в который внедряется ссылка на
файл .ascx
4. Файл пользовательского элемен та управления не является
отдельной ст р аницей, поэтому н е должен содержать дескрипторы
<htm l > , <head> , <body> , <form>
s. Вместо директивы @Page файл пользовательского элемен та
управления соде р жит директиву @ Сопио!

Среда проектирования п озволяет видеть внедренный в страницу


п ользовательский элеме н т управлен и я на пове р хности конструкто р а
Design страницы.

Создани е пр остого пользовательского элеме нта

уп р авления
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Рассмотрим эту задачу на при мере. Заготовку поль зовательского


элемента ynравления легко создает мастер среды п роектирования .

Создадим пользовательский элеме нт ynравления , который будет


п редставлять собой про сто й верхний колонтитул стра ницы и состоять
и з статического НТМL-текста .

• г;:;=в,ыполните командУ Website/Add New ltещ выберите шаблон


Web User Сопtrо! и задайте имя Header.ascx

Add Ne\·, Item - C:\Chalr\Book\WEB\ASPJ\JET 2.0\Examples WebSlte4\ .1J~


Terrp~tes : 111 "
е -~

1'100 Fe< m
D
Мао"" Р"'9" •
l1li
1!1
н тм.. Р"'9" 1'100
~
_Y O: ~
~
C~,
~
sty k> ShGot

с <ы
~ iЭ
"оо
~
хм.. Fi" хи..
tm Schema
li1
Text Fi"
!IJI
Pescиce Fi "
IJ
SQ.. Database
"W1o:atL " Crnfg.xati",

tm -~, ~ шf· ~ ~ ~
DataSet
~ff
Si l9~ ~ i "Web
Fe<m
VВScr"t Fi "
"-' JScr " t Fi"

ri=\;" g' ,811 1,;; Ф .1 R1


IAn дsp , f.EТ ""по<" crntro l crected """'9 1he viou.:> l deogoer

Name : IНeader ,asc,


L~: IVisual С, iJ р" Росе [ ode n sEp<f"ate fi"
Г 58 ее! m.ster рзgе

Посмотрите , что создал мастер. Файл .ascx содерж ит только одну строку
директивы

<%@ Control Lапguagе="С#" АutоЕvепtWirе uр=''truе'' CodeFile="Header.asc:

Пользовательский элеме нт ynравления редактируется в оболо ч ке точн о


также, как и обычная ст р аница. Файл поддержки .ascx.cs содержит тот
же код, что и для обыч н ой страницы . В данном п римере он нам не
н уже н , поэ тому ничего в нем делать не БУдем (п усть болтается п устой) .

• ~ оместите в фай л Header.ascx следУЮЩУЮ НТМL- разметку


,ОС
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

<table width="100%" border=''O'' Ьgсоlог= ' Ъ!uе ">


<tr>
<td >
<font face ='Vernada, Arial" size="б" color= ''yellow''>
< Ь > Тестовая страница User Control<lb>
</font> </td>
</tr>
<tr>
<td align=''right''>
<font size='З" color=''white''>
< Ь > Время создания: март 2007 г. &сору; Все права защищены < lb;
</font> </td>
</tr>
</tab)e>

Листинг НТМL - ход файла Header.ascx

Эта р азметка даст такое ви зуальное представле ние

Тестовая страница User Соп!го!


..
-""""'_ ",,"', "' ............ --
Регистрация пользовательского элемента на странице

Продолжим рассмотрение наше го при мера. Поско льку )ФД

пользовательского элемента ynравления предполагает его

использование в страницах, то преж.це всего создадим тестовую

страницу.

• Г;:;=Создайте новую страницу с именем HeaderTest. aspx для


внедрения в нее пользовательского элемента ynравления

Чтобы использовать элемент ynравления на странице, нужно


интегрировать его в ф:Jрму. Для этого нужно выполнить следующие
шаrn:

1. Зарегистрировать элемент на странице, т.е. с помощью


директивы @Register, помещенной в начале страницы, нужно
сообщить ASP.NET, что где-то на странице есть ссылка на
пользов ател ьский элемент ynравления.

'"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

2. Поместить пользовательский элемен т управлени я на страницу,


вставив в нужно е место внyrри дескриптора < f or m> ссылку-те г
на этот элеме н т.

Д ир ектива @Register для нашего примера имеет следующий ви д

<%@ Register TagPrefix= ''myElem'' ТаgNаme= ' 'Неаdег'' Sгс=''Неаdег.аsсх'' %;

Мы знаем, что для р азличен и я ста н дартных элем е нтов управлен и я в


нач але их дескрип торно го пр едставления используется конструкция

< преФи к с : т ип эле м ента а т рибу т ы . 1> , например

<asp:TextBox ID='TextBoxl" гuпаt="sеrvег" />

Здесь азр играет роль префикса TagPre f i x (и ли условного


пр остранства имен), а Te xt Bo x - тип элем е н та уп р авле ния TagName .
Д ир ектива р е гистра ции также для лучше го ра зли чения
п ользовательских элементов управлени я подцерживает одинаковый
синтаксис . З начения myElem и Heade r мы задал и произвольно , но
далее эти значе ния на странице мы д олжны строго соблюдать, а
з нач ен ие атр ибyrа S r c ( So urce - источ ни к) означ ает ПОДЮlючаемый
файл с пользовател ьским элеме н том уп р авления.

в зарегистрироваННblХ обозначе ни ях п ользовательского элемен та


управления синтаксис е го ПОДЮJючения к ст р анице HeaderTest.aspx будет
таким (н у, как обычно ! ):

< mуЕlem :Неаdег ID=''Неаdе гl '' nmat="server" ></myElem:Header>

и ли таким

< mуЕlem:Неаdег ID=''Неаdе гl '' nmat="server" />

в Visual Studio 2005 нам не н уж но руками ПР О П ИСblвать приведенную


регистрацию. Достаточн о в окне Sоlutiоп Exp lorer п еренести в н едряемый
файл Head er. ascx в нужное место страницы и подправить , пр и
н еобходи мости , сгенерированную оболочкой регистрацию.

в резул ьтате п ользовательская страница HeaderTest.aspx до лжна иметь


такую НТМL- ра зметку

'"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

<%@ Page AutoEventWireup=''true'' CodeFile='HeaderTest. aspx.cs" lnherits="


Language="C#" %>
<%@ Register TagPrefix= ''myElem'' TagName= 'Header" Src='Header.ascx" %;

<html xmlns="httр ://www.wЗ.огgl1999/xhtml">


<head nmat="server">
<title>TecT элемента user control</tide>
<lhead>
<body>
< fо пn id="forml" runat="server''>
<div>
< mуЕlem:Неаdег ID='Headerl " nmat="server" 1>
</div>
</foпn>
<!body>
<lhtml>

Листинг НТМL - ход файла HeaderTest.ascx

Вот таким образом к стран иц е подключа ется файл , в котором


соде р жи тся внешний частичный код. Этот код реально может бы ть
любой сложно сти , ВЮlючая все мыслимые элементы ynравления.
Обратите вниман и е, что код файла Head er. ascx не соде р жи т ссылок на
другие страни цы и готов использоваться на любой стран иц е как
допол н ение. С другой стороны, на файл п ользовательского элемен та, в
свою очередь, может быть помещен другой пользовательский элемент,
разработанный ранее. В таком случае этот ПОДЮlюч аемый элемен т
н ужно заре ги стр ир овать на родителе точно так же, как это делается пр и

п одключе нии к коне чн ой страни ц е .

• ~Запустите тестовую страницу на вы п олнение , должен


получиться такой результат

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

'!i ТССТ ~лсмеltТа user control Мicтosofl Intcrnct [~plorcr ::::::::=- ____~~-ID I ~
----


Тестовая страница User Control
ВР!;'J\lЯ о.:U~Д<lНИЯ: МЩП 20071 ~ В(!;' IIp<lB<I j<lЩИЩ!;'НЫ

Добавление кода в пользовательский элемент

управления

в пр едьщущем примере мы н е использовали код файла поддержки, хотя


и создали его. Но чаще всего это н ужно делать, чтобы добавить
функциональность, которая может понадобиться ЮlИенту. Как это
делать, рассмотрим на прос тых примерах.

Обработка событий

Для начала воспользуемся стандартным элементом управления


Lin kBu t t on , который будет снимать с таймера сервера и отображать
клиенту текущее время. Для разнообразия код С# и разметку поместим в
одном файле.

• ~ызовите мастер для создания пользовательско го элемента


управления, выполнив команду Website/Add New Item. Установи те
ша бло н в значение Web User Co ntro~ сбросьте фrыжок Рlaсе code in
separate Ше и задайте имя файла ТImeDisplay.ascx
• ~ оместите в редактор Design стандартный элеме н т управления
LinkButton из вкладки Standard
• r;.:.=через пан ель Properties измените ID элемента на !nkТШlе
• IJ$Двойным щелчком на свободном месте редактора Design
создайте обработчик Page Load ()
• u;.;rп ри выделенном элементе lnkT i me установите панель
Properties в режим Events (кно пка с и зображением молнии вверху
панели), найдите событие Click и двойным щелчком на поле его
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

значе н ия создайте об р аботчик


1 n kT l me С 1i сk ()
• Г;;:;=Заполните файл следующим кодом

<%@ Control Language="C#" C lassN ame='TuneDisplay" %>

<script nшat="sе rvег''>

protected vo id Page_Load(object sender, EventArgs е)


{
Rе frеs hТпnео ;
}

protected vo id InkТпnе_С liс k(о Ьjе сt sender, EventArgs е)


{
Rе frеs hТпnео ;
}

public void Rе frеs hТпnе О


(
InkТпnе. Техt = DateTune .N o w. ToLongТnneString( ) ;
}
</script>

<asp:LinkButton ID=''lnkTune'' runat="server" ОпС liс k =' 'lnkТпnе_С liс k '' 1>

Листинг Код файла TimeDisplay.ascx

в коде мы добавил и свою функцию RefreshT i me () , п оскольку ее код


н ужн о вызыват ь в двух местах. Без этой функц и и вполне можно
обойтис ь , но мы п редставили себе, будто ее тело состоит из болы.lюоo
количества строк

• ~тобы протестировать наш код, добавьте к приложению новую


страницу с и менем TuneDisplayTest.aspx
• Г;:;=Перетащите на нее из п ан ели Solutlon Ехрюгег файл
ТпnеDisрlaу.аsсх с п ол ьзовательсЮ1М элементом управле ни я
• ~ыполните ст р аницу, кото р ая н а юш ен те бу,цет такой

т,
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

17:32:39

При каждом щелчке пользователя на ссылке-кнопке она будет снимать


(и отоб р ажать) с таймера серве р а н овое з нач ение времени.

Понятие свойства класса

Свойство, это специальн ый чле н класса С#, который управляет


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

• типа , равного типу п оля , доступом к которому оно управляет

• из им е ни с модификаторам доступа , п о которому бу,цуг ч и таться


или писаться знач е ни я п оля , контролируемые свойством
• из пары аксессоров get и se t, содержащих кон трол ирующий
поле код

Основное досто ин ство свойства состоит в том , что его можно


ис пользовать в вы р ажениях и инструкциях при сва ив ания как обыч н ую
п еременную-член класса , хотя на самом деле здесь автоматически будуг
вызываться get - и set - аксессоры. Си н такис свойства таков:

модификатор.....Доступа ти п имя_свойства
(
get
(
11 код аксессо р а чт е ния поля

",
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

гешm поле;

}
set
{
11 код акс есс ор а записи поля

поле := value;
}
}

П усть, н а при мер, пер еме нной x F i eld целого типа тр ебуетс я
обеспечить ко нтролир ую щий доступ с помощью свойства с и мен ем х,
которому в пр о грамме можно при св аивать тол ько н еотр и ц ат ель ны е

чи сла. То гда простейший код свойства можно за пи сать так

class М УС Iass
{
public MyClassO
{
xField = О;
}

private iпt xField; 11 ЭТО поле будет управляться свойством х

1/ Э Т О свойство подцерж ив ает доступ к закр ытом у полю xField


// чер ез имя доступа х, равное им е ни с вой ств а
// Для юшен та это го Юlасса х видна как переменная
public iпt х
{
get
{
гешm xField;
}
set
{
1/ П е рем е нная value - зар езерв ир ованн ое имя переменной
1/ обобщенного типа , прини маю щей значение от Юlиента
1/ Э Т О имя менять н ельзя
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Щуа!ие >= О)
xField = value;
}
}
}

Теперь клиент класса БУдет ви деть только перем е нную х, но при


присваивании ей з начения эта операция БУдет контролироваться кодом ,
следящим за т ем, чтобы присваемые значения были неотрицательными.

Добавление свойств

Вернемся к нашей т еме р аз р аботки пользовательского элемента


управления. РасlШfРИМ возможности пред ы дуще го при мера. Добавим в
код общедоступное свойство Forma t , которому в клиен те
(использующая элемент страница) будем п ередавать либо п устую строку,
либо строку qюрматирования. В зависимости от этого по льзо ват ельский
элемент управления БУдет способен отображать надпись н а кнопке
Lin kBu t t on в разных qюрматах.

• ~ змените код файла ТпnеDisрlaу.аsсх следующим образом

<%@ Сопио! Language="C#" ClassName=''xx'' %>

<script runat= "server''>

protected void Page_Load(object sепdег, ЕvепtAгgs е)


{
Refгe shTllI1I'O;
}

private striпg fопrnt; // Контролируемое свойством поле


риыic striпg Fопrnt // Определение свойства Fопnat
{
get { геturп fопnat; }
set { format = уа!ие ; }
}

",
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

protected void lnkTnne_ Clic k(object sender, EventArgs е)


{
RefгeshTllI1I'O;
}

риыic void RefreshTnneO


{
~ (югта. == ''')
lnkTune.Text = DateTune.Now.ToLongТuneStringO;
else // З н ач ени е fопnat задаем в кrJИенте чер ез свойство Рогта
lnkTune.Text = DateTune.Now.ToString(format);
}
</script>

<asp:LinkButton ID ="lnkТlП1е " runat="server" OnClick ="lnkТIme_Click " /

Листинг. Улучшенный код файла TimeDisplay.ascx


• ~ змените КОД тестовой страницы TuneDisplayTest.aspx
следУЮЩИМ образом

<%@ Page Language="C#" %>

<%@ Register Sгс =' ТпnеDisрlaу.а sсх " TagName='TmleDisplay" TagPref

<h.m1 xmIns= . huр ://www. wЗ.ог&.1999/xh.m1.. >


<head runat= "server''>
< tidе > Стран ица TnneDisplayTest</title>
<lhead>
<body>
<form id ="forml " nшat="sе rvег ''>
<div>
< исl :TuneDisplay ID='TnneDisplayl "
runat="server"
Format= "" />
< Ьг />
< Ьг />
<hr />
< Ьг />
< исl TnneDisplay ID='TnneDisplay2 "
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

гuпаt= "sеrvе г"


Fоrmat="С его.цня dddd, dd ММММ уууу< Ьг I> Текущее вр(
</div>
</fonn>
<lbody>
<lhtml>

Листинг. Код тестовой страницы TimeDisplayTest.aspx

Тестовая стра ница является кrJИентом п ользовательско го элемен та


ynравления. Им ен но в дескрипторе элеме н та на ЮJИенте мы
определяем значе ни е доб авленного свойства For ma t как атрибyr этого
дескриптора. Обратите внимание, что в подсказч ике кода IntelliSense,
при ме н яемом п ри редактировани и дескриптора пользов ательского
элемен та ynравления, появилось новое свойство Forma t .

Представление тестовой страницы с пользовательским элемен том


ynравления на броузере ЮJИента БУдет вы глядеть так

22:06:57

Сегодня воскресенье, 18 марта 2007


Текущее время 22:06:57
[11 Оопе [П г ~ Loca injyanet

Здесь создаются два экзем п ляра элеме нта ynравления Ti meD i splay,
первый из которых отображает дату в ф:Jрмате п о умолчанию , а друго й -
в задан ном ф:Jрмате.

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

Порядок генерации событий инициализации

При создании пользовательских элементов ynравления и добавления в


них своих свойств важно знать, в каком порядке происходит создание и
шшцuалuзацuя объектов на странице, использующей по льзо вательский
элемент ynравл е ния. Этот порядок следующий:

1. Производится Удаленн ый запрос страницы и она загружается в


память сервера

2. Создается и инициализируется конструкторам масса

по льзовател ьский элемент ynравления


з. Присваиваются значения атрибугов , предусмотренные в

дескрипторе пользовательского элем е нта ynравления


4. Создается объект род ительской страницы
S. Выполняется событие Page . Load родительской страницы, в
обработчике Page Load () которого можно предусмотреть
п е реназначение атрибугов-свойств пользовательского элемента
ynравления

б. Выполняется событие Page . Load пользовательского элемента


ynравления

Отсюда важный вывод, что если мы БУдем инициализировать


пользовательский элем е нт ynравления в его обработчике
Page L oad () , ТО он перезапишет все свои настройки , выполненные
в родительском коде , поскольку срабатывает по следним . Так, если бы в
послед н ем примере обработчик Page Load () пользовательского
элемента ynравления инициализировал поле f o rm at и имел бы вид

protected void Page_Load(object sender, EventArgs е)


(
format = о п ,;
if (!Page.lsPostВack)
RеfrеshТпnео;
)

ТО мы бы всегда получали результат варианта без qюрматирования , а


именно

",
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

23:25:40

23:25:40

I iп1Тю еt ~
AJ

Применение дополнитель ных классов при создании


сложных п ользовательски х элеме нтов управле ния

Ин огда п риходится создавать специальные классы для орган изации


взаимодейств и я между nользовательсЮ1М элемен том yn р авления и Web-
страницей. Рассмотр и м п ример , в котором создадим сложный
n ользовательсЮ1Й элемен т ynравления L i n kTable , п редназначенный
для генерирования набора ги n ерссылок в форматированной таблице .
Для удобства часть кода размести м в отдельн ом самостоятельном классе
Lin kTableltem .

• Г;:;=Создайте страницу Web Form с раздельн ым кодом и имен ем


LinkTableTest.aspx
• ~Сделайте эту страни цу стартовой
• г;.:.='Добавьте к n роекту новую папку с зарезервированным имен ем
App_Code

",
C:\ ... \WebSite4\
~ Build Web ~te
PubIish Web ~te

ill Add New Item ...


D Add ЕХlStJпg Item ...
New FoIder
Вп Add ASP.NEТ Fdder ~ I
Add Reference".
Арр _ GlobalResources Add Web Reference.,.

Арр _LocalResources G. View Class Diagгam


App_WebReferences biii Сору Web ~te
App_Вrowsers Start ОрООns."
ТПете [!l View in Bгowser
Browse With,,,
[!!] RefГesh Folder

~ CUt

Сору

Paste
§I Property Pages

• ~ерез кон текстное меню на созда нн ой п ап ке выполни те


командУ Add N ew Item

",
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

в .1"=-- - - - - - - - - '1
Add Existing Item".

В··, New F~der

View Class Diзgгат

R e~esh F~der

Cut

Сору

Paste

'Х Delete
Rеn.зmе

• ~ ерез окно маст е р а добавьте к п р и ложе н и ю нов ый класс С# с


име н ем LinkTable 1 tem . с s

,,,
В.М. СН"",,,В Про,раммupoвtJNШ' NQ ASP.NET

.1J~
ri! о:::


T""l""»>

~ !;]J ..;
[!jJ ~
IШII Тех! f ile D<Ot1oS,t

"- е:,,, D"Ч,m

Этот масс в своих полях бу,цет хран и ть информацию ,


необходимую пользовательскому элементу уп р авления, а через
свойства осуществлять доступ к ней .
• u;.;rЗаполните вс п омогательн ый масс в файле
Lin kT able 1 tem . cs следУЮЩИМ кодом

using System;
using System. Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebContro ls;
using System.Web.UI.WebContro ls.WebParts;
using System.Web.UI.HtmJControls;

/// <summary>
/// Вспомогательный масс LinkTableItem
/// </summary>
public class LinkTabIeI tem
{
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

// Хранимые поля закр ы того ти па


private string text, ur!;

// Конструктор по умолчанию
риыic LinkTable Item()
{
// Пустой ко нстр уктор по умолчан ию обязателен
// поскольку есть общий конструктор
}

// Общий конструктор
public LinkTabIe Item(string text, string ur!)
{
// Внугренним полям присваив аются з начения ,
// переданные и з родительского объекта
this.text == text;
this.ur! == ur!;
}

// Определение свойств доступа к внугренним полям


public string Text
{
get { return text; }
set { text == value; }
}

public string Ur!


{
get { return ur!; }
set { ur! = value; }
}
}

Листинг. Код файла App_Code/LinkTableItem . cs

Те п е р ь н уж н о создать п ользо в ательс ки й э леме нт, кот о ры й будет


упра в лять э ти м в с п омо гательн ы м массом .

• ~Создайте за го товку п ользо в ательского элемен та уп равле ни я с


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

р аздельн ым кодом и им е н ем LinkTable. Для этого выполните


командУ Add N ew ltem, вызвав кон текстное меню для узла п роекга
(самый верхний узел) в пан ели Sо!utiоп Ехрloгег и устан овив
шабло н Web User Со пtго !
------.11~
T...-rpl~""

lliJ

~
с _,
~C

Vlю Fa m

ДPP l t,~",
D

-
§ -
М38:В- Р ",?,

C001:g..<"'i.. ,
l1li

~
_о .
~
НТf<\. Р ",?,

liJj
Xf<\. Schetm

~

~
Sff, t e

Те х ' f ie
~
("'8'

~
Rеюcrcе г1е SQ.-
~
,-
Щle 5Сев!

[j
С<озь.> ",

11!J ~ ~ 111f' i ~ ~
D,bSot -,
~.
Siw М"I' ~,A:blQ щоо

l,'В3cr ipl: FIQ
00

"-, JScrp ' Fi"

liI=
~
gi" ,001 Rt ~ f!.J
Iм ~SP , I.ET _yвr (00.-0 1crе,Зd us r __ 1tJe ,~ш l ms от'"
~~ "I'-;;~"
'''·'''-------------------C,

CI'-;;~~·C"",------:iJ" го' PllIce code n "Р"'* fi e


г ~ ~ 7I3$ter p3~e

• r;:;n оместите в таблицу пользовательско го элемента следующие


стан дартны е компоненты:

о ТаЫе из вюыДки НТМL, который будет форматировать


размещение стандартных элементов управле ни я

о Label из вкладки S tа пdагd в верхнюю ячейку таб ли цы ,


который будет определять заголовок н абора ссылок
о Iтage из вкладки НТМL, определяющий р и сунок марке р а
ссылок

о Da taLi s t и з вкладки Data в нижнюю ячейку таблицы


о Hype rLink из вкладки Standard
• ~ астройте дескрипторный код пользовательского элемен та
управления так

<%@ Со пtго l Lапguagе="С#" АutоЕvепtWirеuр= ' 'truе '' CodeFile="LinkTabIe.a


Iпhег its=''LinkТа Ь!е '' %>

<tab!e border="l" cellpadding=''2'' cellspacing=''O'' width="lOO%''>


ш
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

<tr>
<td>
<asp:Labe! ID= ' 'lbrПtle'' runat="selVer"
F orеСо!ог= ''#С ООООО'' F ont- Bok:l=''true''
F ont- N ames= 'Vemada" F о п!: - 5 ize=''Small''>
< !--Здесь будет за головок-- >
</asp:Labe!>
</td>
</tr>
<tr>
<td>
<asp:DataList ID="listCo ntent" runat="server">
<ltemTemplate>
<img width=''25'' hеight="lЗ" src=''Yes.gif' a!t="MapKep''>
< аsр:НурегL ink I D=''НурегLiпk1 " runat="server"
NavigateUr!='<%# Dа tаВindег.ЕvаI(Сопtаine г. Dаta l tещ 'Ur!'') (
Text=' <%# DаtaВindег.ЕvаI(Со пtаinег.Dа tа l tещ 'Text'') %>' 1>
< lItеmТеmр1з tе >
</asp:DataList>
</td>
</tr>
</tab)e>

Ли с тинг Код фа йла Link Table . a scx

Дескриптор <i mg> дл я кра с оты о п ределяет маркер , котор ы й вы


можете сами и з готовит ь р а змером 25хlЗ и л и взять из да нн ой р а боты
(файл Yes .gif, который и меет и зображен и er;$). Атри буг аl t задает
альтер н а ти вную н адп ись в п оле рисун ка , есл и последни й не будет
н айде н .

Те п е рь П Р ИlШlа пора р а сширить функцио н ал ьность п оль зов ател ьского


эл ем ен та управл е н ия LinkTable . Для этого

• ~ызовите на реда ктирова н и е файл LinkTable.ascx.cs и


за п ол ни те его сл едующим кодом

usiпg System;
usiпg System.Data;

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

us iпg Systеm. С опfigша tiоп;


us iпg System. Collections;
us iпg System.Web ;
us iпg System. Web.Security;
us iпg System. Web.UI;
us iпg System. Web.UI.WebControls;
us iпg System. Web. UI. WebControls. WebParts;
us iпg System. Web. UI. HtmlContro ls;

public partial class LinkTable : System.Web.UI.UserControl


(
public string Tlt1e
(
get { геtшп Ibmde .Text; }
set { lbmtle.Text = value; }
}

private LinkTableItem{J items;


public LinkTableItem[] Items
(
get { геtшп items; }
set
(
items = value;

11 Обновляем сетку
listСопtепt.DаtaSошсе = items;
listCo ntent.DataBindO;
)
}
}

Листинг Код фала LinkTable. ascx. cs пользовательского

элемента управления

Разработка пользовательского элемента управления закончена. Теперь


нужно поместить его на пользовательскую тестовую страницу

LinkTableTest.aspx, которую мы создали в самом начале выполнения


этого примера и сделали ее стартовой.

ш
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

• ~ыполнит е кома н ду Window/C lose All Documents, чтобы


закрыть все окна р едактирования

• Г;;:;=Откройте через панель Solution Explorer н а редактирование


файл LinkTableTest.aspx в режиме Design и п еретащите н а форму из
этой п а н ели узел LinkTable.ascx пользовательско го элемен та
уп р авления

После этого форма ст р аницы должн а выглядеть так

l,r[inkTabIeTest,aspx j

r,;.;r Databound
[;.;i'" D шаЬ оun d
~ Databound
[;.;i'" D шаЬ о un d
~ Databound

Дескрипторное п редставление тестовой страницы с


зарегистрированным на ней пользовательским элементом управления
имеет такой в и д

<%@ Page L апguagе="С#" АutоЕvепtWirеuр=''truе''


С ode F ile= "LiпkТаЬ leTest. asp х . cs" Inherits= ' 1.iпkТаЫе Test" %>

<%@ Register S гс ="LiпkТаblе. аsсх" TagName='1.inkTable" TagPrefix="ucl" %

<html xm1пs="httр:llwww.wЗ.огgl1999/xhtml">
<head nmat="server">
< title >Тестовая страница сложного элеме н та ynравления </tit1e>
</head>
<body>
< fопn id="fопnl" ruпаt="sеrvег' '>
<div>
< uсl:LiпkТаЫе ID='1.iпkТаblеl" runat="server" 1>
</div>
</foпn>
<!body>

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

</html>

Листинг Дескрипторное представление тестовой страницы


LiпkТаblеТеst.аsрх

• г;.:.=ОткроЙте на редактирование файл п одцержки: страницы


LinkTableTest.aspx.cs и за полните его следующим кодом

using System;
using System.Data;
using Systеm. Со пfigша tiоп;
using System. Collections;
using System.Web;
using System. Web.Security;
using System. Web.UI;
using System. Web.UI.WebControls;
using System. Web. UI. WebControls. WebParts;
using System. Web. UI. HtmlControls;

public partial class LinkTableTest: System.Web.UI.Page


(
protected void Page_Load(object sender, EventArgs е)
(
// Формируем заголовок списка
LinkTab lel .Тide = "Список жизненно важных гиперссылок";

// Создаем список элементов - гиперссылок


LinkTableItem[] items = new Linkтаыetеm[з ];;
items[O] = new LinkТаblеItеm("Ссылка Nq l к Большому Биллу",
•.http://www.mk:roso ft. со т');
items[l] = new LinkТаblеItеm("Ссылка Nq2 к автошколе \"Диало г-СеРЕ
·.http://www.dialog-service.net·.) ;
items[2] = new LinkТаblеItеm("Ссылка NqЗ к затыч ке JavaScript",
'1avascript:void(O)');
LinkTablel.Items = items;
}
}

Листинг Файл LinkTableTest.aspx.cs поддержки тестовой


страницы

ш
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

• ~Запустите приложе н ие и убедитесь, что ге н ерируемый


пользовательским элеме н том управле ни я набор гиперссылок
р аботает исправно

ffi:j Favorites
http:/~ocalhost lО б9/Wе Ь~tе4iln kТаt>eТеst.аs р х ... r6> Go

Список жизненно важных гиперссылок

~ Ссьшка Но 1 к Большому Бruшy


r..:> Ссьшка Н22 к автошколе "Диалог-Сервис"
r..:> Ссьшка Н23 к затычке J avaScript

[i) oone inIYanet

Добавление событий

Событие - это встроен н ый меха ни зм С#, с помощью которого


автоматически обесп ечивается уведомление заре гистрированных
объектов о необходимости выполнения ими какого-то действия. Объект
предоставляет сво и методы-обработчики для реагирования на
возникновение о п ределенного события. В этом случае говорят, что
объект подписался на некоторое событ и е. Такой механизм позволяет
отдельным объектам обмениваться сообщениями и реа гировать на них .

Технически событие представляет собой н екую адресную переменную ,


ссылающуюся н а зюем п ляр масса, поддерживающего собы тие. Если
значен ие этой ссылки рав н о null, то собы тие не прОИЗОllИо, п оскольку
нет соответствующего объекта . Один объект генерирует собы тие
(создает эюемпля р ) и п осылает уведомление через канал сообщений
опе р ационной системы. Другие, подписанные на это собы тие объекты
приложения , получают это сообщение вместе с дополни тельн ой
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

ин форма ц ией и за п ускают соответствую щи е обработчиЮ1 ,


п редва р и тельн о п е р едав им до п ол н и тел ьн ую и н форма ци ю в качест ве
ар гуме нтов.

Для объявле ни я адрес н ой п ереме нн ой событи я ис п ользуются деле гаты.


Делегаты представляются с п е ц иальным массом , определяющи м
сигн а туру (ти п ы, коли ч ество и п орядок следования ар гуме н тов)
п ередаваемой с соб ы тием и н форма ции от п равляющей сторо н ой , и
сигнатуру обработч иков соб ыти я п р ини мающей сторо н ы. Делег а т
объя в ляется в глобал ьн ой обл асти видимости уровня масса , чтобы
сд елать событие в и д и мым во всех кла ссах пр иложен ия. Объект,
п орожде нн ы й классом-делегатом , и является событи ем .

С п омо щью конструктора делегата п р и создан и и е го ново го эюемпля р а


в событ и е добавляется сс ы лка на обработчик и уста н авливается
кон троль за си гн атурой этого обработч ика . Э т от п ро ц есс н азывается
ре гистра ци е й событи я в массе и л и п одпи ской на соб ытие. Собы тия
п оддерживают м н о гоад р есат н ую п е р едач у (mu/ticasting). Э ТО з н ач и т, чт о
од н о и тоже собы тие мо гуг п р ин и мать мно гие объект ы , но
обрабатыва ть это собы т ие кажд ы й объект буд ет своим методом ,
кото ры й он указал в ко н структоре дел егата п ри п од пи ске на это
соб ы ти е.

Вот так ле н иво, об щи ми сло в ами , без соответствующих п р и меров кода


мы обозрел и меха ни зм и с п ользо в ания соб ы тий и делегатов в ч истом
С#. БУдем с ч и тать , что мы будто бы вс п ом ни ли те азы языка С #,
кото ры е нам должн ы б ы ли да в ать вместо Па скаля н а младших курса х (я
же не могу оди н р асхлебывать за всех). Те п ер ь пр и ступ и м к
рассмотр е н ию на шей темы - как доб а вит ь событ и е к пользовательскому
элемен ту уп р авле н ия , чтоб ы он д олж н ым образом реа гир овал на
соб ы ти е, п р и сла н ное ему кrlИе нтом ст р аницы.

М ы эту задач у поста ви м как р азв и тие предьщуще го пр и мера, п оэтому


для дал ьней ше й р аботы н уж н о создать ко пию фа йлов это го п р и мера .

• ~ п ан ел и So lutio n Explo rer, Уд е р жи вая мави шу Ctrl, вы д ели те


узлы LinkTable.ascx и LinkTableTest.aspx
• u;.;rч ерез ко н текстн ое ме н ю п а н ели в ы полн и те кома н дУ Со р у, а
затем че р ез кон текст н ое ме н ю н а узле пр оекта (ввер>о') выполни те
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

командУ Paste
• ~ ереименуйте созданные копи и в имена оригиналов , но с
добавле нием Ext (extension расширенный), а именно:
LinkTableExt.ascx, LinkTableExtTest. aspx (файлы подцержки
LinkTableExt.ascx.cs и LinkTableExtTest.aspx.cs оболочка
п ереименует сама)
• r;;,;:rСделайте страницу LinkTabIeExtTest.aspx стартовой, вып олн ив
на ее узле в представлении пан ели So lution Ехрюгег командУ Set А5
Start Page кон текстно го меню
• r;;:;noAnpaBbTe в файле LinkTableExtTest.aspx демарацию
@Register, чтобы новая тестовая страница применяла
п ользовательский элеме н т управления из друго го файла

<%@ Register Src='1.inkTableExt.ascx" TagName='1.inkTabIe" TagPrefu

• ~Запустите новую тестовую страницу на выполнение , чтобы


убедиться в ее работо с пособности с пр ежней функциональностью

Все, те п ерь мы готовы модернизировать новые файлы пред ы дущего


при мера . Посмотрим , что мы хотим сделать.

В предыдущем пр имере мы с помощью вспомогательного масса


Lin kTableltem мо гли доб авлять в массе пользовательского
элемен та управления LinkTableTest новые 2uперссЬ/лкu типа

asp : Hyper Link к элементу а sp : Da taLi s t . По щелчку мие н та на


одной из гиперссылок он безусловно направлялся по указанн ому адресу
Теперь же мы хоти м перехватывать и распознавать щелчок на любой
2uперссылке для ко н троля за действ и ями пользователя: о н хочет туда · то ,
а можно ли ему Вдруг п ользователь хочет в закрома, а мы считаем, что
он не имеет на это достаточных прав. Сейчас мы не будем оцен и вать
п ользователя , просто распознаем 2uперссылку и выведем ее н а экран.

Ранее в дескр ипт ор но м представлении пользовательского элемен та


управления мы применяли стандартный элемен т asp : HyperLink .
Если посмотреть на масс это го элемен та
System . Web . UI . WebControls . HyperLink через панель Object
Browser, то можно увидеть , что он не имеет никаких событий
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

ObJect Browser ..... -Q- Х

Browse: Му Solutюп

<Search> Г 9 MdAl:IYit<JtesToRender(System .
II----,---=~=---,---:-.,...:;::;...-i I (. . ~o MdParsedSubObject(obj€ct)
щ- . 4t$: GridViewUpdateEven.... ;
: · о НурегLlПkО
ffi··~ HiddenField '
: "о LoadVieWState(obj€ct)
,
4:
ci:J ... Hlerarc:hio:alDataBouг .
i,··-" ORenderContents(System,Web.U
1i>. '11 Hots~t
C~ :!5' ImageUrl
"''11 ....
ц оt:'jXJЬ:оПесооп .(~ NavigateUгl
';''11
~,'. 4$ HyperLinkColumn i···· .- Target
(. . !5' Text
ffi··~ HyperLinkConuolBuil

с д ругой стороны , масс LinkBu t ton име ет д в а событ и я , которые


ге н е р ир ует э л ем ент пр и выбо ре п оль зо в ател я

m
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

ObJect Browser '" J;l Х

Browse: му SoIubOll

<Search> • .....</ AddAttri:JutesToRender(System.


fт--т-т-;;:-c~:-:---:-:---,-,--:=-----11 ' ..", AddParsedSubOb]€Ct(ob]€Ct)
I±J'..~ GridViewLpdateEven .... ; .t>.
....,.~ Gеt?оstвасkОрtюnsО
,;,. . '1$ HiddenFffi
......,. LinkButtOll О
ciJ...~ HierarchicalDataBour ,....... LoadV","State(object)
", . '1$ Hotspot ' ,," OnChck(System,EventAгgs)
НJ .. ·~ Hotspotcollecbon ; л
· . ·1~ OnCommand(System,WebUI.
",'1$ HyperLink ~
, i.... " .., OnPreRender(System.EvenUl.r
ri,J . ·~ HyperLinkColumn
i "'-';~ RaisE9ostБackEvent(sUilg)
I±J".~ HyperLinkConu oIEIuil :"'--i~ RenderCOIltents(System.Web.U
rn··'1$ HyperLinkField :.... ~ CausesValidation
~.' ..~ Image
:.... ~ Сот mandArgument
I±J"'~ ImageButtOll '
:... ~ Сот mandName
НJ .. ·~ ImageField ;
. . . . m ' OnСliепtcliсk
';''1$ ImageMap ,... ~ Росtвзdkll"l
~ ...~ ImageMapEvenUl.rrк
""" 't'j' Text
", . '1$ Label 'm' VaIкJa"onGгoop
rn··'1$ LabelConuolBuilder
$. '1$ '1 СН
!} Соттаnd
"' '1$ LinkЕluttОПСOIl"'ОПЗU

Эти соб ыт ия мы и будем п ерехва тывать в н ашем элеме н те управления .

• ~ зме н ите тип элемента в шабло н е <ItemTemplate>


дескр иптор н ого п редставле н ия файла LiпkТаblеЕхt .аsсх и новое
имя атрибуга Co mmandA rgu ment , п осле ч его файл долже н бы ть
та ки м

<%@ C ontrol Language="C#" AutoEventWireup =''true'' CodeFile="LinkTabIe E:


Inherits=''LinkTable '' % >

<table bord er="l " cellpadding=''2'' ce llspacing=''O '' width="lOO%''>


<tr>
<td >
<asp:Label ID =' '1ЬГПtle'' runat="selVer"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

ForeColor= ''#COOOOO'' F ont- Bokl=''true''


Fопt-Nаmes = 'Vе mаdа " Fо пt-Size="Sma ll" >
< !--Здесь будет за головок- ->
</asp:Label>
</td>
</tr>
<tr>
<td >
<asp:DataList ID="listCo ntent" runat="server">
<ItemTemplate>
<img width=''25'' hеight="lЗ" src=''Yes.gif' alt="MapKep''>
<asp:LinkButton ID=''НурегLinkl '' runat="server"
СО П1П1апdАгgumе пt= '< %# DаtaВindег.ЕvаЧСопtаinег.DаtаItеm
Text='<%# DаtaВindег.ЕvаЧСопtаinег.DаtаItещ 'Text') %>'>
</asp:LinkButton>
< lItеmТеmр1зtе >
</asp:DataList>
</td>
</tr>
</tab)e>

Листинг
LinkTableExt.ascx
Смена типа элемента
• шаблоне файла

Мы хотим создать событие с именем L inkCl i c k ed . Для


распознавания выбранного п ункта списка нам вместе с будущим
событи ем L i n k Cl i ked н ужно будет п ередавать инqюрмацию о
знач ени ях свойств Te x t и Ur l , которые мы о пр еделили р анее во
вспомо гательном классе L i nkTableltem . сз . Затем в обработчике
событи я Li n k Cl i c k ed мы р аспознаем эту инqюрма ци ю и выведем ее
на экран .

Напрямую эюемпляр класса LinkTableltem . сз в аргументах


событи я п ередавать н ельзя - не тот тип, п оэтому упакуем е го в класс
L i nkTable EventArgs , который обяза н быть наследни ком
библиоте ч ного класса
Sys t em . E ventArg з . Объявим также делегата
событи я в глобальной области видимости .

• ~Откройте файл LinkTab Ie Ext.ascx. cs подцержки

ш
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

пользовательского элеме н та управления и добавьте в него


объявление ново го масса и делегата, п осле чего общий код
долже н бы ть таким

usiпg System;
usiпg System.Data;
usiпg Systеm. Со пfigша tiоп;
usiпg System. Collections;
usiпg System. Web;
usiпg System. Web.Security;
usiпg System.Web.UI;
usiпg System. Web.UI. WebControls;
usiпg System.Web.UI.WebControls.WebParts;
usiпg System. Web.UI.HtmlControls;

public partia l class LinkTable : System.Web.UI.UserContro l


(
public string Tlt1e
(
get { геtшп Ibmde .Text; }
set { lbmtle.Text = value; }
}

private LinkTab leItem{] кешs;


public LinkTableItem[] Items
(
get { геtшп items; }
set
(
кешs = value;

11 Обновляем сетку
listСопtе пt.DаtaSошсе = кешs;
listCo ntent.DataBindO;
)
}
}

11 Объявляем деле гат события LinkClicked


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

11 в гл обальной области видимости,


11 который определит си гнатур у события и обработчика
public de!egate void LinkClickedEventНand!er(object sender, LinkTabIeEve ntAr:

11 Класс-ynаковка экземпляра LinkTableItem для


11 передач и с событием в качестве аргумента
public class LinkTableEventArgs : ЕvепtAгgs
(
11 Конструктор
public LinkТаЬ!еЕvепtAгgs(LiпkТаЬ!еItеm item)
(
se!ected Item = кет;
)

11 Внугреннее поле БУдет хр анить объект гиперссылки


11 и контролируется свойством 'только для чт ения"
private LiпkТаЬ!еItеm se!ected Item;
public LinkTab!eItem Se!ectedItem
(
get { геtшп se!ected Item; }
}

11 Внугренне поле хран ит флаг отм ены , переданный с генериро вавши


11 событие массом- источ нико м для обработчика ЮJасса-приемника
private Ьоо! сапсе! = false;11 Инициализируется при создании
public Ьоо! Carк:e!
(
get { геtшп сапсе~ }
set { са псе! = va!ue; }
}
}

Листинг

LinkTableExt.ascx.cs
Добавление нового хласса - упаховхи
• файл

Таким образом, мы объявили масс для ynаковки п ередаваемой в


событии информации . мы также объявили делегата , с пом о щью
которого будет создано соб ытие. Теперь нужно добав ить код, который
перехватит поль зовател ьский щелчок на о п ределенной гuперссылке.

ш
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

распознает эту 2 ипер ссылку и через событие L ink Cl i c k ed отправи т


эту информацию в канал сообщений Windows. Конеч н о же , этим должен
заниматься масс Li n k Ta bl e подц ержки пользовательского элемен та

управления.

• ~Откройте на редактирование файл LinkTableExt.ascx в режи ме


Dеsigп
• ~ы делите пользовательский элемен т управления и в панели
Prop erties создай те об р аботч и к для события I t e mComma n d
(Проследите , чтобы в дескрипторе п ользовательского элеме н та на
тестовой стран ице не появился атрибуг Wi d t h )

LinkTabIeExt.ascx Properties .... -j:::] Х

IistContent System.Web.UIwet·
~:' l1]lJ I [;] [2J I ~
CancelCommand
DаtaВlгЮlr>;J
DeleteCommand
Disposed
ЕditCоmmaгЮ
Inlt
ItemCommand
ItemJeated
-
• IJ$Добавьте в масс Li n k Table и созданны й обработчик
стан дартн ого собы тия следующий код

us iпg System;
us iпg System.Data;
us iпg Systеm.С опfigша tiоп;
us iпg System.Collections;
us iпg System. Web;
us iпg System. Web.Security;
us iпg System. Web.UI;
us iпg System.Web. UI. WebCo ntrols;
us iпg System. Web. UI. WebCo ntrols.WebParts;
us iпg System.Web. UI. HtmlControls;
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

public partial class LinkTable : System.Web.UI.UserControl


(
public string TJtle
(
get { геtшп Ibmde.Text; }
set { lbmtle.Text :::: value; }
}

private LinkтаыlItеmпп кешs;


public LinkTableItem[J Items
(
get { геtшп items; }
set
(
кешs = value;

11 Обновляем сетку
listСопtе пt.DаtaSошсе = кешs ;
listContent.DataBindO;
)
}

11 Объявляем в классе наше событие LinkClicked


11 с помо~ю ранее созданного глобального дел егата
public event Link C lickedEventНandler LinkClicked;

protected void listContent_ItemCommand(object so urce, DataListCommandE


(
if(LinkClicked != null)
(
11 Выделяем объект ссылки , на которой был выполнен щелчок
LinkButton link = (LinkButton)e.Item.Controls[l];

11 Выделяем нужные свойства Text и Url через атрибугы


11 дескр ип тора элемента LinkButton и сохраняем их
11 в эюемп л яре вспомогательного класса
LinkTableItem кет :::: new LinkTabIeItem(link.Text, link.CommandArgun

ш
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

11 Передаем ссылку на сохраненные свойства в класс упаковки Щ


LinkTableEventArgs args == пеw Linkтаыevеп tAгgs(itеm);;

11 Генерируем событие
LinkClicked(this, aгgs);

11 Пускаем клиента к закромам по ссылке, если класс-получатель


if (args.Cancel !== иие)
(
Respo пsе .Red irect( item. Url);
}
}
}
}

11 Объявляем делегат события LinkClicked


11 в глобальной области видимости,
11 который определит си гнатур у события и обработчика
public delegate void LinkClickedEventНandler(object sе пdег, Linkтаыevеп tAг::

11 Класс-упаковка зкземпляра LinkTabIeItem для


11 передач и с событием в качестве аргумента
public class LinkтаыeveпtAгgs : EventArgs
(
11 Конструктор
public LinkTableEventArgs(LinkTableItem item)
(
se lected Item == item;
)

11 Внугреннее поле БУдет хранить объект гиперссылки


11 и контролируется свойством 'только для чт ения"
private LinkTableItem selectedItem;
public LinkTableItem SelectedItem
(
get { геtшп selected Item; }
}

11 Внугренне поле хран и т флаг отм ены , переданный с генерировавши

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

11 событие массом- источ ником дл я обработчика ЮJасса-приемника


private Ьооl сапсеl := false;11 Инициализируется при создани и
public Ьооl Carк:e l
(
get { rеtшп cancet }
set { са псеl := value; }
}
}

Листинг Добавленный ход в !Сласс LinkTable файла


LinkTableExt.ascx.cs

Теперь событие L inkClicked БУдет воз ни кать всякий раз , когда


п ользователь щелкнет на гиперссылке пользовательского элемента

управления. Классом-получателем этого события определим нашу


тестовую страницу. Именно в ней мы создадим функцию-обработчик,
которая распакует переда нные событием аргументы и выведет
п олученную инqюрмацию на экра н . Проверку существования события
мы выполняем на всякий случай, чтобы наверняка предотвратить
ге н е рацию систем н ого ИСЮJючения.

Учитывая, что в режиме проектирова ни я оболочка поддерживает


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

• ~Откройте на редактирование файл LinkTableExtTest.aspx.cs и в


конце обработчика события Page Load () ЮJасса
L i n kT able Test начните набирать имя объекта L i n kT able l,
под которым на тестовой странице у нас числится эюемпляр
зарегистрированного на ней пользовательского элемента
управления. Вы сразу увидите реакцию п одсказчика кода
IntelliS ense
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

_ pUbJlC: p.o.rt:bl. l cJ~~~ L;nkТ ~ ЬJ~'JI-~ t gY"t: = _ I! ",b . UI. ~ ~ g~

(
protected void paQe_ LOadl object sende r, !:',entA'QS е)

!! OOF"""PV""" ~~ ~al!O " O~ с ун.с""


L шkТ"bl",l . тi t J~ = "Сп ~<:;ок """Н"ННО ~ <fi:H>< X ~ хпе рсс"",ок ";

!! Co"д~ "" слис'ж ~1!~"~"TO~ - Г1fЛ"РССWIO~


LшkТ"ЬJ"Н = 1 1 ;t",.. _ """'" Lшkт"ыl,н, ,,,1 3 j ::
it",, ~ [ OI = n ~W LinkTdbl"'Il" [I ("CCNJ]" ~ lI'l ~ ЕО 1!НО "У Виллу" ,
"ЬПр' ((www lI icro ,o tt соо") ;

i t:=~ [l ] - n ~'" ,inkT~bj"T t:"" I "C=M Jl'2 ~ ~ ИОI~О 1!" \ " ДIIЫIOГ -С",р~ис\"" ,
' http ' ((WWW d i e 1Qg ,~ п к ... n ... t ' );
i tens [2) nЕ'" LinkTdblelte,, ('CCWJ ~a lI'З ~ 9а'ЫЧ~8 J ачаsсriрt',
'j"y,ycr;pt ' voi iJ !О )" );
L in kТ~bl"l.It ~,, ~ - i t ~ ,.~ ;

Нажав два раза клавишу ТаЬ мы получим и реrnстрацию собы тия в


классе - п риемнике ч е ре з глобально го делегата, и заготовку обработчика.
После генерации оболочкой таким способом заготовки обработчика
далее мож н о п оступить одни м из следУЮЩИХ способов:

1. Либо оставить все как есть и начать за полнять обработчик


2. Либо остав ить заготовку обработч ика, а код ре ги ст р ации собы тия
уничтожить

LinkTable1 .LinkC licked += пеw LinkсliсkеdЕvепtнапdlег(Linkтаыl1_LL

Если выбрать второй способ, тогда нужно в дескрипторном


представлении пользовательского элемен та добавить ат р ибуг
On Link Cl i cked= "Li nkTablel LinkC li cked ", чтобы
привязать к событию созданны й обработч ик (обратите внимание , чт о
имя атрибуга qюрмируется из им ен и событи я и nрефuкса ОП ). Но и в
этом случае Большой Билл нам тоже ч угь-чугь п омогает
В.М. Сн"",,,в Про,раммupoвtJNШ' 110 ASP.NET
,.~ W~bS;t~"I - r-11<rosoft Visual Studio

r ablerestExt.aspx* lrtT~Xt.=X ,CS LrtТз.:еЕxt , asсх

~ Clent Objects g, Events . . Iс'ю ЕуentБ)


9" ~age
Сo::iеЕ' i
Language =' C#" Au t oEventW~reup= "true"
l e = "LiJltTableTestExt . aspx .cs" Inhe[it5 = 'Li nkTab l eTest " %>

EJ <htrr.l xralns = "htt D' ! !\ОWoЧ . wЗ • org/H 9 9 !xht;nl '>


- <head [ШJa t = " sе[v е r" >
..;titlе> тестовая страница сл ожно го элемеНТа у лравления </titlе>­
</h .,,,d>-
- <bo dy>
..; for;n ~d = "foLI0 1 " runat=" s erver'>
<d ~ v>

<ucl : Lin kTable Ш=" LinkТаЫеl '


</div>-
..; / forlO>-
</body>
</htm l >

Давайте выберем вто рой с по соб ...

• ~ничтожте реги страци ю соб ы тия в ЮJассе LinkTableTes t ,


ско пир уй те имя сгенериров а нного обработчи ка и доба вьте его в
атри буг OnLinkC 1 i c ked= " LinkTablel Lin k Cl i c ked"
дескриптора <ис l: Link Table ID= " Link Tablel "
run at= " server " /> фай ла т естовой страницы
LinkTableExtTest.aspx
• ~ режиме Design т естовой страницы р азмест и те текстовую
метку asp : Label из ВЮJа.цки Standard, задай те е й имя lbl I n fo
и очистите п оле ее свойства T ext (л ибо у,цал и те одноиме нны й
атри буг в дескрипторе). В н е й мы будем отоб ражать информацию
о на жатой гиперссылке
• ~ер ни тесь в файл LinkTableExtTest.aspx.cs и за п ол ните

об р аботчи к та к

using System;
using System.Data;
using Systеm. Со пfigша tiоп;
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

usiпg System. Collections;


usiпg System. Web;
usiпg System.Web .Security;
usiпg System.Web.UI;
usiпg System. Web.UI.WebControls;
usiпg System.Web.UI.WebControls. WebParts;
usiпg System. Web.UI.HtmlControls;

public partial class LinkTableTest : System.Web.UI.Page


(
protected void Page_Load(object sender, EventArgs е)
(
// Формируем заголовок с писка
LinkTab lel .Тide = "С писок жизненно важных гиперссылок";

// С оздаем с пи сок элементов - гип е р ссылок


LinkTableItem[] items = new LinkТаЬ)е Itеm[ З];
items[O] = new LinkТаblеItеm("Ссылка N91 к Бол ьшом у Биллу",
•.http ://www.mk:roso ft. со т');
items[ l] = new LinkТаblеItеm("Ссылка N92 к автошколе \''Диало г-Се РЕ
· .httр ://www.diaЮg-sеrviсе.пеt·) ;
items[2] = new LinkТаblеItеm("Ссылка N9З к затыч ке JavaScript",
'1 а vascript:vo ю(О) '');
LinkTablel.Items = items;
}

public void LinkTablel_LinkClicked(object sender, LinkTableEventArgs е)


(
// Ищем подстроку в вызывающей строке
if(е.SеleсtеdItеm.Техt.lпdехОf("Диалог-Сервис") > О)
(
е.Сапсеl = fu lse;// Пропус тить
)
e~e
(
е.Сапсеl = tпJе ; // Н е п ускаем дальше
IblInfo.Text = ''Вы щелкнули " +
'\'11' + e.SelectedItem Text + '\". ";
IblInfo.Text += " И зв ини те, но Вам н е р азрешено и дти на "+
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

e.Se)ectedItem.Ur! + "!! !";


}
}
}

Листинг Обработчих добавленного события LinkClicked

• ~Запусти те тестовую страницу LiпkТаЫеЕхtТеs t .аsрх и


полюбуйтесь н а свою работу

..j-o Back ..,.. .... ..,.. ~ M ea a


дddг е s;s

Список жизненно важных гиперссылок

...- Ccьmкa .N"" 1 к Большому Биллу


r;.;s- Ccьmкa 1'{о2 к авТОПIКоле "Диалог-Сервис"

ii$ Ccьmкa Х23 к затычке J avaScript

Вы щелкнули "Ccьmкa Х21 к Большому Бшшу".


Извюпгге. ио Вам ие разрешеио иДП! иа
http://www.rnicrosoft.coт!!!

1. Donе iпtr.леt

Доступ из кода Web-страницы к состав ным

ко м п о н ен там п ользовательского эле м е н та уп р авления

Web-стран иц а, которая содерж ит интегрированный в нее

п ользовательский элемен т ynравле н ия, н е может без до п ол н и т ель н ых


п риемов п олучать достyn к компо н ен там этого элеме н та: к их методам ,

событи ям , свойствам. Такое п оложе н ие являет ся обос н ова н н ы м, чтобы


случайно в Web-страни це не в н ести н ежелательные изме н е ни я в ее

ш
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

дочерний элемент.

Но учитывая, что сам пользовательский элемент имеет достyn к своим


компонентам , а страница имеет достyn к пользовательскому элементу,

это правило можно обойти. Для это го существует два способа:

1. Ввести в масс пользовательского элемента допо лнительные


свойства и функции достyn а к нужным членам индивидуально
для каждого компонента

2. Ввести в масс пользовательского элемента ynравления для


каждо го компонента по одному дополни тельном у свойству,
возвращающему ссылку на соответствующий компонент

Первый способ

в пользовательский элемент вводят промежугочные свойства и ли


методы доступа, через которые из Web-страницы обращаются к его
компонентам. ЭТО напоминает прием, который применяется в С ++ для
п оддержания инкапсуляции (закрытости) да нны х: п ереме нны е-члены
масса с людuфикатором доступа pr i vate ynаковывают в функции
достynа publ i c , которые сами видят эти переменные , а их, в свою

очередь, видят миен ты этого масса .

Пусть, например , пользовательский элемен т управления MyCo n t r oll


как объект порождается массом MyCont r o l и в качестве одного из
компонентов содержит в себе объект L abell библиотечно го масса
System . Web . UI . WebCont r ols . Labe l . Класс Label наследует
от базовою класса Sys te m. Web . UI . WebCon trol s . WebCon t r o l
свойство BackColo r , которое, в свою очередь, имеет тип
System . Draw i ng . Colo r . Напрямую из Web-страницы н ельзя
установи ть новое значение свойства BackColo r компонента Labell
пользовательско го элемента. Но можно раскрыть это свойство для Web-
страницы , введя про межугочное свойство BackColor (или с другим
и менем) в массе самого пользовательского элемента. Сказанное
схематично изображено на рисунке

'"
в м С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

Web - страница

i
BackColor I >~
МyContro l l

I BackColor I
LaЬell

Выполним это на практике.

• ~Создайте за готовку пользовательского элемен та Web User


Co ntrol с име н ем MyControLascx с раздельн ы м кодом (флажок Place
code in separate filе масте р а вютючен)
• ~ ерейдите в режим Design редактора за готовки и поместите на
н ее из вютадки Standard элемен т Label с именем Labell
• ~ п анели So lution Explorer откройте файл подцержки
MyControLascx.cs, удал ите из ютасса MyCont r o l заготовку
об р аботчи ка Page_LoadO за ненадобностью и до п олните класс
свойсmвалш доступа, чт обы он стал таким

using System;
using System.Data;
using Systеm. Со пfigша tiоп;
using System. Collections;
using System. Web;
using System.Web .Security;
using System. Web.UI;
using System. Web.UI.WebControls;
using System.Web.UI.WebControls. WebParts;
using System. Web.UI.HtmlControls;

ш
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

public partial class М уС опtrоl: System.Web .UI .UserContro l


(
public string Text
(
get { геtшп Lab ell.Text; }
set { Label1 .Text = value ; }
}

public SystemDrawing.Color BackColor


(
get { геtшп Lab ell.BackColor; }
set { Label1 .BackColor = value ; }
}

public SystemDrawing.Color F огеС оюг


(
get { геtшп Lab ell.ForeC olor; }
set { Label1 .ForeC olor := value; }
}
}

Листинг Добавление посреднических свойств доступа х классу

MyControl из Web - страницъ!

Здесь мы и с п ользовали имен а посредн и ческих свойств родителя


MyCont r o l l то ч но такие , как у п рямых свойств компонен та Label l .
Но это не обязательн о . Мож н о ис п ользовать любые имена. Просто ,
когда И ванов, П етров, Сидо р ов оз н ачают одн о и то же лицо, но в
разных ин ста нци я числятся по разному, это " хужее Н.

• Г;:;=Создайте пользовательскую тестовую стран ицу с раздельным


кодом п од именем MyCo ntroIГest. aspx и п ереведи те ее в режи м
редактирования
Design
• г;:.=из панели Solution Ехрюгег из дерева файлов п риложения
п еренеси те н а тестовую стран иц у узел МуСопtгоlаsсх . Убеди тесь ,
что эюемпляр пользовательско го элемента уп р авления

заре гистрировался на тестовой стра ниц е п од имен ем

MyControl l
• ~ о п робуйте выделить элемент уп р авления и убедитесь, что он

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

не выделяется и добавленные нами свойства н е видны в панели


Prop erties. ЭТ О з начи т, что декларативно (в режиме
пр оектирова ния) из страницы на страи вать его н елься, н о можно
пр о гра мм но ynравлять (в режиме выполнения) ч е рез введенные
нами общедостynны е свойства, в чем мы и хотим убедиться .
• r;:;nоместите на страни цу под пользовательски м элементом
ynравления компон е нт Rad i oButtonLis t из вкладЮ1 Standard
и убед и тесь, что он имеет ID= " Rad i oButtonLis tl "
• ~ ерез коллекцию Items элем е нта Rad i oBu t tonListl
задайте три радиокнопки с таки ми свойствами
о Va l ue= " Red "
Техt = " красный ";

о Техt = " Зеленый "; Va l ue= " Green "

о Техt = " Синий "; Value= " Blue "


• Г;;:;=Установите свой ство Repea t Direction эл ем ента

RаdiоВuttопL i stl в з н аче ние Ноrоzопtаl

• ~ы делите компонент RadioButtonL i stl и через пан ель


Prop erties создай те обработчик для его события
Selectedlnde x Changed
• ~ oд с пи ском радиокнопок поместите компонент Input
(Submi t) из вкладЮ1 НТМL

Дескри п тор ное пр едставление страницы бу,цет иметь вид

<%@ Page L апguagе="С#" Аutо ЕvепtWirеuр=' 'truе ''


С ode F ile= ''М УС о пtrо rrest. asp х. cs"
Iпhег its=''МуСопtrоrrеs t '' %>

<%@ Register S гс =''МуСо пtго L аsсх'' ТаgNаme= "МуСопtго l " TagPrefix="llcl "

<html xm1пs="httр ://www.wЗ.огgl 19 99/xhtml" >


<head nmat="server">
< title > Uпtitled Page</tide >
<lhead>
<body>
< fопn id ="fо пnl " ruпаt="sеrvег' '>
<div>
< llсl:М уС опtго) ID="MyControl1 " nmat= "server" />
< Ьг />

ш
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

<br 1>
<asp :RadioButtonList ID='RadioButtonList1 " runat= "server"
RереаtDirесtюп=''Ноriwпtаl''
OnSelectedlndexChanged='RadioButtonListl_SelectedlndexChanged '~
<asp :Listltem Value='Red"> Кра с ный </asp:ListItem>
< asp :Listl tem Value= "Gree п"> 3 ел е н ы й </as р :Listl tem>
<asp :Listltem Vа luе =''В luе ' '> С иний </asp:Listltem>
</asp:RadioButtonList></div>
<br 1>
< inр и! id="Submitl" type="submit" value="submit" 1>
</form>
</body>
</html>

Листинг Дескрипторное представление тестовой страницы


МуСопtrоlТеst.аsрх

Мы хотим , чтоб ы на клиенте при щелчке на кнопке Submit выполнялась


обратная отсылка на сервер, где бы код страницы через вв еде нные нами
в класс пользовательского элемента управления допо лни тельные

свойства менял н астройку элемента Labe 1 1. Этот код смены


настройки нужно поместить в созданный н ами обработчик
радиокнопок, чтобы он срабатывал каждый р аз, когда получит обратную
отсылку с требованием пользо вателя выполнить новые настройки. В
результате элемент L abe11 сгенерирует нужный HTML ~кod и отошлет

его юш е нту.

• ~3аполните обработчик
Rad i o Butt on Li st1 Se1ected I nde x Changed( )
страницы в файле MyControrrest.aspx.cs следующим кодом

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebContro ls;

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

using Sуstеm.WеЬ.U I .WеЬСопtrо ls.Wе ЬРаrts ;


using Sуstеm.WеЬ.U I . НtmJСопtгоls ;

риыic рапial class МуСопtгоfТеst: System.Web.UI.Page


{
protected vo id RаdioВuttоnList1_sеleсtеdIпdехСhaпgеd(ОЬjесt send el
{
int index = RadioВuttonList1.SеlесtеdIпdех;

switch (index)
{
case О:
МуСопtгоl1.FогеСоlог = System.Drawing.Color.White;
МуСопtгоl1.ВасkСоlor = System. Drawing.Co lor.Red;
break;
case 1:
МуСопtгоl1.FогеСоlог = System.Drawing.Color.Aqua;
МуСопtгоl1.ВасkСоlor = Sys tеm. Dгаwing. Со lor. Gгее п;
break;
case 2:
МуСопtгоl1.FогеСоlог = Systеm.Dгаwing.Соlог.УеПоw;
МуСопtгоl1.ВасkСоlor = System. Drawing.Co lor.Blue;
break;
}

if(index!= -1)
М уСо пtго l1 .Теxt = RadioButtonList1.1tems[index]. Value;
}
}

Листинг. Код обработчика в файле MyControlTest.aspx.cs


• ~Откомпилируйте страницу и проверьте ее работос пособность.
При щелчке на кнопке код страницы ме н яет свойства компонен та
Labe 1 1 , хотя он входи т в состав п ользовательско го элемен та

уп р авления МуСо пиоl1 . Вза и модействие стра ницы с Labell


пр оисходит через добавленные на ми в пользовательский элемен т
уп р авления до п ол ни тель ны е глобаль ны е свойства.
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Второй способ

Есть еще один способ обеспечить доступ к компонентам ,


интегрированным в поль зовательский элемент управления , это
до бавить в пользовательский элемент по дополнительному свойству,
возвращающее ссылку на каждый компонент. При этом н ужно
использовать только get -аксессоры, поскольку адреса компонентов

менять нельзя. В дальнейшем через это свойство-ссылку, доступную из


страницы , можно обратиться к любым членам раскрытого таким
образом компонента, входящего в состав поль зовательского элемента.

Поясним сказанное на пр едыдущем прим ере .

• г;.:.=СкопирУЙте через панель Solutlon Explorer, как это мы делали


р анее, фай л тестовой ст р аницы MyControrrest.aspx и файл
пользовательского элемен та управления MyControLascx
• Г;;:;nрисвойте копиям новые имена МуСопtгоlEхtТеst.аsрх и
MyControlExt.ascx соответственно (файлы сопровождающего
скрытого кода оболо ч ка переимен ует автоматически)
• г;;;?Сделайте страни цу МуСопtrоlEхtТеst.аsрх стартовой, выполнив
на ее узле в панели So lution Explorer командУ Set As Start Page
• ~ змените парам етр S r c директивы регистрации в файле
М yControlExtTest.aspx

<%@ Register Src="MyControlExt.ascx" TagName='MyControl" TagPr€

• г;;;?Откройте файл скрытого кода MyControlExt.ascx.cs и измените


в н ем масс МуСоп trol , чтобы он выглядел так

using System;
using System.Data;
using Sуstеm.Сопfigurаtiоп;
using Sуstеm.Соllесtiо пs;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using Sуstеm.WеЬ.U I .WеЬСопtrоls;
using System.Web.UI.WebControls.WebParts;
,,,
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

using System.Web.UI.HtmlControls;

риыic рапia l class MyControlExt: System Web.uI.UserControl


{
// Раскрываем весь компонент Label1
// Имя свойства IrmerLabell выбрали произвольно
// Используется только get-аксессор

риыic Label Iпne гLаЬ е l1


{
get { return Label1 ; }
}
}

Листинг . Добавление в класс пользовательского элемента


управления свойства-ссылки на его внутренний компонент
Labell в файле MyControlExt.ascx.cs
• Г;;:;=Скорр е ктируйте в файле MyControlExt.ascx атрибyr директивы
СОП t rol так Inhe r i t s= " MyControl Ex t "

• Г;;:;=Откройте файл MyControlExtTest.aspx.cs скрытого кода тестовой


страницы и отредактируйте его дл я достynа к прямым свойствам
компонента Label l с использованием созданного адреса

InnerLabe l l

using System;
using System.Data;
using Sуstеm.Сопfigurаtiоп;
using System.Collectio ns;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using Sуstеm.WеЬ.U I .WеЬСопtrо ls;
using Sуstеm.WеЬ.U I .WеЬСопtrо ls.Wе ЬРаrts ;
using System.Web.UI.HtmlControls;

риыic рапial class MyControlExtTest: System.Web.uI .Page


{
protected void RаdioВuttоnListl_sеJeсtеdIпdехСhaпgеd(ОЬjесt send el
{
in! index = RadioButtonListl.SelectedIndex;

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

// Достyn к прям ым свойствам Ю)мпонента Lab el1 выполняеr.­


// ч ерез ссылку на этот Ю)мпонент в родителе М уСо пtго l1
switch (index)
{
case О:
М уСо пtго l1.lnnегL а Ь е l1. F oreColor = 5 ystem Drawing. Color.'
М уСо пtго l1.lnnегL а Ь е l1.Вас kСоlо г = System.Drawing.Colo r.
break;
case 1:
М уСо пtго l1.lnnегL а Ь е l1. F oreCo lor = 5 ystem Drawing. Color.J
М уСо пtго l1.lnnегL а Ь е l1.Вас kСоlо г = System.Drawing.Colo r.
break;
case 2:
М уСо пtго l1.lnnегL а Ь е l1. F oreColor == 5 ystem Drawing. Color.'
М уСо пtго l1.lnnегL а Ь е l1.Васk Соlо г = System.Drawing.Colo r.
break;
}

if(iпdех!= -1)
М уСо пtго l1 . lnnегL а Ь е l1 . Text = RadioButtonList1.Items[index]. V
}
}

Листинг Доступ к прямым свойствам Labell через адрес

IпnеrLаЬеll на странице MyControlExtTest.aspx


• ~ыполните стран ицу и убедитесь, что п олучился тот же
самый результат, что и в предьщущем при мере при реализации
п е рвого способа

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

11 Untitled Page - Мicrоsоft Internet Е.


File Edit Vi€.... Favoгites Tools Help
*' Back ~ .. ~ 10 @I Gl I <t\Search
Address ebSite4 !МуСоп1т OIТestExt, asp х

r Красный r Зеленый r. Синий

I submi t

ГlГlГ Im! Local intra",t

Какой cn особ выбрать - решать Вам.

Дин амич еское создани е п ользовшельского элемента


уп р авления

На протяже ни и этой темы мы рассматр и вал и во п рос создания


пользовательско го элемен та уп р авления в режиме п роектирован и я и

последУЮщее уп р авление им в п ро грамм н ом режиме. Но может


потребоваться н а стра н ице подгружать и настраивать пользовательский
элемен т управления динам и чески (''на лету') . Мы уже пр о граммно
создавал и и з библиотечно го элемен та управлен и я Ht ml Table объект­
таблицу на стра н ице DynamicTab)e.aspx. Те п ер ь п осмотрим, как это
делается для пользовательского элемен та уп р авления.

Требуется выполнить следУЮ щи е шаги:

1. Создават ь при каждой загрузке стран иц ы в обработчике ее


соб ы тия Page . Load экземпляр класса п ользовательского
элеме н та управления, заран ее под готовленно го в фай лах * .ascx и
* .ascx.cs. Создание и регистрация экзем п ляра п ользовательского
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

элемента в коде страницы осуществляется статическим методом


Page . LoadCon t r ol() .
2. Р езер вирова ть с помощью э лемента PlaceHolde r место
р азме щения для точ ного позиционирования на странице

по льзовател ьс кого элеме нта ynравления.

з. Обязательно присваивать посл е дина м ич еского создания значение


свойства 1О пользовательского элемента ynравления, особенно ,
когда создается несколько экзем п ляров одного и того же элемента.

Это может п онадоби ться для однозначной ид е н т ификации


элемента в коде стран ицы при поиске сс ы лки на экзем п ляр ,

выпол ня емом с помощью статического метода

Page . F in dCont r ol () , который как раз иcnользует значение


идентификатора 1 D.

Есть н екотор ая с п е цифика динамического создания пользовател ьского


элемента ynравления. Н ел ьзя создать пользовательский элемен т
напря мую , как это делается с библиоте чным элементом ynравления
че р ез конструктор кл а сса. Пользо в ател ьский элеме нт ynравления
состоит н е только из подцерживающего масса в файле >1< .ascx.cs, но и
дескрипторной части фай ла >I<.ascx. Поэт ому на эт апе праектuравания
он н е пр едставле н общим массом, экзем п л яр которого можно было-бы
создать с помощью конструктора. Экзем пляр пользовател ьского
элемента ynравления создается самой ASP.NET объединением эт и х двух
частей на эта п е выполнения.

• ~Скопируй те чер ез панель Solutlon Explorer, как это мы делали


р анее, файл те сто вой страницы МуСопtгоlEхtТеst.аsрх и фай л
по льзовател ьс кого элеме нта ynравления MyControlExt.ascx
• ~ рисвойте копи ям новые и ме на MyControlDynamicTest.aspx и
MyContro!Dynamic.ascx соответственно (файлы сопровождающего
скрытого кода оболо ч ка переимен ует автоматически)
• ~Сделайте стр аницу MyContro!DynamicTest.aspx стартовой ,
выпол нив на ее узле в пан ел и Solution Explo rer команду Set As Start
Page
• ~Закройте все пр едыдущие редактируемые документы командой
меню Wirкlow/Close All Dосuшепts
• ~Откройте на редактирование страницу
MyContro!DynamicTest.aspx в режиме Design, у,цал и те наш

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

пользов ател ьский элемент управления Labe 1 1 и пом естите на


е го место и з ВКlIадки Standard стандартный элемент управления
PlaceHolder
• r;:;n ерейдите в файле MyControlDynamicTest.aspx в режим Sошсе
редактор а страницы и у,цалите полностью старый код директивы
регистрации

<%@ Register Src="MyControlExt.ascx" TagName='M yC ontrol" TagPr€

На дан н ом этапе страница в дескрипторном представл е нии БУдет такой

<%@ Page Language="C#" AutoEventWireup=''true''


С ode F ile= ''М УС о пио lDynamicTest.aspx. cs "
Inherits='MyControrrest" % >

<html xmlns =' 'httр ://www.wЗ.огgl 19 99/xhtml'' >


<head nmat="server">
<title>Untitled Page</tide >
<lhead>
<body>
< fопn id ="fо пnl " runat= "server''>
<div>
<asp:PlaceHolder ID="PlaceHolderl " runat="server" 1>
< Ь г 1>
< Ьг 1>
<asp:RadioButtonList ID='RadioButtonList1 " nmat= "server"
RереаtDirесtюп= 'Horiw ntal''>
<asp :Listltem Value='Red"> Кра с ный </asp:ListItem>
< asp :Listl tem Value= "Gree п"> 3 ел е н ы й </as р :Listl tem>
<asp :Listltem Vа luе=''В luе' '> С иний </asp:Listltem>
</asp:RadioButtonList>
< Ьг 1>
<input id= "Submitl " type="submit" value="submit" 1>
</div>
</foпn>
<!body>
<lhtml>

Листинг Страница MyControlDynamicTest. aspx после удалеНИА


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

пользовательского элемента

Все, теперь пользовательский элемен т управления на странице не


существует! Вместо не го существует пустое место P l aceHolde rl .
Далее мы программно должны создать этот элеме н т, доба вить ссылку
на н его к ст р анице, а потом и управлять свойствами е го компо н ен тов.

• ~Откройте на редактировани е файл скрытого ю)Да

MyContro!DynamicTest.aspx.cs, выполнив команду контекстного


меню viJeW Cd
о е редактора

.!! Cut

lt1I Сору

if!, Paste
Paste Alteгnate

'х D€lete

V~Code
I I
1!1 View Rl Browseг

Synchroniz:e Document OutJine

Foгmat selec:tion
Foгma1jjng аnd Valid.aoon ...

• ~ змените код об р аботчика Page Load ( ) , чтобы он стал


таким

using System;
using System.Data;
using Systеm. Со пfigша tiоп;
using System. Collections;
using System.Web ;
using System. Web.Security;
using System. Web.UI;
using System. Web.UI.WebControls;
using System. Web. UI. WebControls. WebParts;
using System. Web. UI. HtmlContro ls;

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

public partial class MyControrrest: System.Web .UI.Page


(
protected void Page_Load(object sender, EventArgs е)
(
11 Создаем экземпляр масса поддержки
11 пользовательского элеме н та управления
МуСопиоl MyControll := (MyControl)Page.LoadControl('MyControlDyn
11 Добавляем объект в зарезе рвир ованное место страницы
Р !асе Н о k:ler 1. С о пио 15. Add(M УС о ntro 11 );

int index:= RadioButtonListl.SelectedIndex;

11 Доступ к прямы м свойствам компо н е нта Label1 выполняем


11 чер ез ссылку на этот компонент в родителе MyControll
switch (index)
(
case О:
М yControll . InnerLabel1 .ForeColor := SystemDrawing.Color. White ;
М yControll . IппегLаЬ е l1 .ВасkСоЮг := 5 ystem.Drawing.Color. Red ;
break;
case 1:
М yControll . InnerLabel1 .ForeColor := SystemDrawing.Color.Aq ua;
М yControll . IппегLаЬ е l1 .ВасkСоЮг := 5 ys tеm. Dга w ing.СоЮг.Gгееп;
break;
case 2 :
М yControll . InnerLabel1 .ForeColor := SystemDrawing. Color. Yellow;
М yControll. IппегLаЬ е l1 .ВасkСо Юг := 5 ys tеm. D гаw ing.СоЮг.В luе;
break;
)

if(index ,=
- 1)
М yControll. InnerLabel1 .Text := RadioButtonListl. Items[ind ex]. Value;
}
}

Листинг Код обработчиха Paqe_Load() для создания

пользовательсхого элемента

Обратите внимание , что при на боре кода создания пользовательского

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

элемента в редакторе кода механизм Intel1 i Sense нам не


помогает, потому что страница не знает, что где-то в файле
MyControlDynamic.ascx существует класс МуСоп t rol .

Преобразование страницы в пользовательский элемент


управления

Чаще пользовательсЮ1Й элемент ynравления проще сделать из обычной


страницы .aspx, чем мы и воспользуемся ниже. ЭТО делается так:

1. С начала нужно разработать обычную страницу, отладить ее и


проверить в де йствии.
2. Переименовать расширение файла из aspx в ascx
з. Директиву @Page вместе с ее атрибугами следует удалить и
заменить директивой @Control с требуемыми атрибугами.
4. Удалить из кода все дескрипторы <h tm l> , <body> , <fo r m> ,
<head> .
s. В коде файла подцержЮ1 заменить базовый кл асс Page на
Use r Cont r ol .
б. Если мы используем модель совмещенного кода , то нужно в

директиву Cont r o 1 обязательно доб авить атрибуг


ClassName= " ИМЯ _ Фа й ла _ и л и _ л юбое _ и мя ". Он извещает
ASP.NET, что код , который нужно компилировать, находится в том
же файле в дескр иптора х <scr i pt> . Без этой июlюрмации файл
компилироваться не будет.

Управление динамической загрузкой многих


пользовательских элементов управления (портальные
каркасы)

Итак, мы разработали несколько пользовательсЮ1Х элементов


управления:

1. Header.ascx - верхний колонтитул


2. ТпnеDisрlaу.аsсх кнопка-ссылка, возвращающая
н еформатированную и форматированную дату-время

'"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

з. LinkTable.ascx - список гиперссылок


4. LinkTableExt.ascx - список гиперссылок с предварительным
анализом выбора пользователя (для этого создали свое событие)
S. MyControLascx - с применением промежугочных средств доступа к
настройкам внугренних компонентов
б. MyContro!Ext.ascx - с созданием общего свойства-ссылки на
встроенный компонент для доступа к любым его членам
7. MyControlDynamic.ascx - то же самое, что и MyContro!Ext.ascx,
только применяли способ динамической загрузки
пользовательского элемен та на тестовую страницу

Для каждого из этих элементов управления разрабатывалась своя


тестовая страница, на которую элемент управления помещался

декларативно. Только в последнем случае мы сам пользовательский


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

н есколько р аз ны х пользовательских элементов управления.

• ~Создайте новую страни ц у DynamicUserControls.aspx с


р аздельны м кодом и сделайте ее стартовой
• ~ раскрывающемся списке панели Properties выберите элемен т
DOCU ME NT и задайте его свойству T i tle значение
Порталь ны е к ар к асы

• ~ режиме Design пом естите с вкладки S tапdагd элемент Рапеl


и присвойте ему имя Panel1 (оно генерируется автоматически).
Этот элемент БУдет служить контейнером для других элементов
управления, в том числе и для пользовательского

• ~ оместите внугрь контейнера Panel 1 друг за другом по


вертикали стандартные элементы

о Dr op DownList с автоматически сгенерированным

именем Dr opDown Li st1 - для выбора загружаемого в


контейнер пользовательского элемента управления
о PlaceHolder с автоматически сгенерированным именем

PlaceHolder1 - для позиционирования в контейнере


пользовательского элемента управления

о Labe l с автоматически сгенерированным именем Labell


- для отображения имени файла, И 3 которого в контейнер

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

загружен пользовательский элемент ynравления

По большому счету нам в данном примере безразлично, какие имена


будуг иметь зкземпляры до черних элементов. Однозначно различать их
в коде мы можем по най де нным ссылкам. Сс ылки , в свою очередь ,
будем искать в именованном контейнере по типу до чернего элемента ,
поскольку пом е щенные нами элементы имеют разный тип. Но сама
оболочка Visua! Studio 2005 требует, чтобы на странице не было
декларативно объявляемых дескрипторов с одинаковыми значениями
1О .

• ~ роследите в дескр ипторном представлении страницы, чтобы


ни один из элементов, включая контейнер , не имел атрибугов
Wi dth и Height , ограничивающих свободную рQсширяемость
до черних элементов

Заметим , что контейнер Рапе 1 1, как родитель, по умолчанию будет


определять основные свойства своих до черних элементов, такие как
цвет фОНQ , цвет п е реднего плана , шрифг и т.д., если только мы не
определим их явным образом.

Ранее мы перечислили пользовательские элементы ynравления ,


которые создали в да нной работе. Выберем несколько из них дл я
динамического размещения. Имена этих элементов нужно занести в
список DгорDоwпList1. Пусть это БУдУГ элементы:

1. Header.ascx - Верхний колонтитул


2. ТпnеDisрlaу.аsсх - Кнопка ' время -дата '
З. Liпkтаыeаs схx - С писок гиперссылок
4. Liпkтаыeхt.аsсхx - Контролируемый список гиперссылок
5. MyControLascx - С настройкой внугренних компонентов

• r;.:.=выделите объект DropDownL i st l в контейнере Р1асе l и


заполните декларативно е го свойство I tems так
Декларативные настройки объекта DгорDоwпList1

Items[i] Text Va!ue


I tems [ О ] (None) None
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Items[ l ] Верхний колонтитул HeaderTest . asc x


Items[2] Кнопка 'в ремя -дата ' T i meDisplayTest . asc x
Items[3] С пи сок гип ерссылок L i nkTableTest . ascx
Контроли р уем ый
Items[4] L i nkTableExtTes t. ascx
сп исок гиперссылок

С настройкой
Items[5] внугр е нних MyCon t rolTest . ascx
компонентов

• ~ скрытом поле Value мы указал и имена файлов , которые в


БУдущем должны будем создать
• ~становит е для элемента DropDownList1 его свойство
AutoPostBack в значение True , чтобы обес п еч и т ь постин г
страницы при выборе польз о вателем нужной опции

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

Таким образом, оди н ко н тей н ер мы по чт и н астроили . Но мы .хоти м


размести ть на странице три таких контейнера, чтобы иметь
возможность в каждый ИЗ ни х програ мм но загружать выбранны е через
список DropDownList l пользовательские элемен ты управле ни я. При
этом мы хотим убеди ться , что о ни ра ботают н еза ви симо д руг от друга и
каждый делает то, что долже н пугем реагирования на свои собственные
события .

• ~ режиме Design тестовой страниц ы разместите по


верти кал и друг за другом три копии контейне р а Place l вм есте с
е го до ч ер ними элементами . Про следи т е, чтобы ко нте йн еры
имели имена Panel1 , Panel2 , Panel3
• ~ ерез р аскрываю щийся список панели Properties выд ел яйте
п оследо в ател ьно каждый кон тейнер Panel1 , Panel2, Panel3
и н астро йт е и х свойства та к
о BackColor=Web/Gainsboro
о BorderWidth=lpx
о HorizontalAlign=Center
о BorderStyle=Ridge
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

о EnableViewState= " False "

Мы з акончи л и эта п про екmUРО6анuя страницы дл я да нн ого п ри м е ра .


Д е скрипторное п редс та в л ение с траницы должно б ыть таким

<%@ Page AutoEventWireup= ''true '' CodeFile=''DynamicUseгControls . aspx . cs'


Language="C#" % >

<html xmlns="httр ://www.wЗ.огgl 1 999/xhtml">


<head id= 'Head l " nmat= "server">
< title > Портальные кapKacbI </title >
<lhead >
<body>
< fопn kl ="fопnl " runat="server''>
<div>
<asp:Panel ID="Panel1 " runat="server" BackCo lor= "Gainsboro " Border:
Horiw ntalAlign= "С enter" ЕnaЬ Ie ViewS tate= "F alse ''>
<asp:DropDownList ID= ''DropDownList1 '' ruпа t="sеrvег" AutoPostB
<asp :ListItem Value= ''N o ne">(N опе )</asp:ListItem>
<asp :ListItem Value= 'HeaderTest.ascx''> Верхний колон ти тул </а
<asp :ListItem Value= 'TnneDisplayTest. ascx''> Кнопка ' время- дат,
<asp :ListItem Value= ''LinkTableTest.ascx''>C писок гиперссылок
< asp :ListItem Value= ''LinkTab lе ExtTest.ascx"> Ко нтроли р уемы й
<asp:ListItem Value= 'MyControrrest.ascx">C настройкой внугр
</asp:DropDownList><br />
< Ьг />
<asp:P laceHolder ID= ''P IaceHolderl " runat= "server''></asp РвсеНоl
< Ьг />
<asp:Label ID= ''Label1 '' ruпаt="sеrvег" Text="Label"> </asp:Label><!
< Ь г />
<asp:Panel ID="Panel2 " runat="server" BackCo lor= "Gainsboro " Border:
ЕnaЬ lе ViewS tate= ''F а Ise" Н о riw ntalAlign= "С enter''>
<asp:DropDownList ID= ''DropDownList2 '' ruпа t="sеrvег" AutoPostB
<asp :ListItem Value= ''N o ne">(N опе )</asp:ListItem>
<asp :ListItem Value='HeaderTest.ascx"> Верхний колон ти тул </а
<asp :ListItem Value= 'TnneDisplayTest. ascx"> Кнопка ' время- дат,
<asp :ListItem Value=''LinkTableTest.ascx''>C писок гиперссылок
< asp :ListItem Value= ''LinkTab lе ExtTest.ascx"> Контроли р уемы й
<asp:ListItem Value= 'MyControrrest.ascx">C настройкой внугр

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

</asp:DropDownList><br 1>
< Ьг 1>
<asp:P laceHo!der ID=''P IaceHo!der2 " runat= "server''></asp РвсеНо!
< Ьг 1>
<asp :Labe! ID=''Label2 '' runat= "server" Text=''Labe!''></asp:Labe!><!
< Ьг 1>
<asp:Pane! ID=' 'РапеLЗ'' runat="server" BackCo!or="Gamsboro " Border:
ЕnaЬ!е ViewS tate= ''F а Ise" Н о rizo ntalAlign= "С enter''>
<asp:DropDownList ID =''Dгор DоwnListЗ'' runat="server" A utoPostB
<asp :ListItem Value=''N o ne">(N опе )</asp:ListItem>
<asp :ListItem Value='HeaderTest.ascx''> Верхний колон титул </a
<asp :ListItem Value='TnneDisp layTest. ascx''> Кнопка ' время- дат,
<asp :ListItem Value=''LinkTab!eTest.ascx''>C писок гиперссылок
< asp :ListItem Value= ''LinkTab!e ExtTest.ascx"> Контроли р уем ы й
<asp:ListItem Value='MyControrrest.ascx''> C настр ойко й внугр
</asp:Drop DownList><br 1>
< Ьг 1>
<asp :PlaceHo!der ID=''P IaсеНо!dегЗ " runat= "server''></asp РвсеНо!
< Ьг 1>
<asp :Labe! ID =''LаЬеlЗ '' runat= "server" Text=''Labe!''></asp:Labe!><!
< Ьг 1>
</div>
</form>
<!body>
<lhtml>

Листинг ДеСlCрипторное представление страницы

DупаmiсUsеrСоntrоls.аsрх

• ~ыполните сф:J р мирован н ую страницу

DynamicUserCo ntrols.aspx, чтобы убедиться в работоспособности


настро ек режима пр оектирования. Результат на дан н ом этапе
долже н бы ть таким
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

11 Портальные каркасы - Мicrоsоft Internet Ех ..


Fie Edit V"VI F аvопtes To~o Нф

т .. т liiII @J GI ~ se"ch tжJ Favorites

I (NOne) 3

I (NOne) 3

I (None)

31
- - ..:J
Lосзl in1J" anet

Таким об р азом, мы выполнили ин терфейсн ую заготовку портальных


каркасов на тестовой странице. Теперь пришла пора наполнить их
функц и ональностью, которая бы обес п ечила ко н тей н ерную загрузку
выбранных пользовательских элеме н тов ynравления. Э ту
функц и ональность мы обеспечим, кодируя файл
DynamiсUsеrСопtrоls.аsрх.сs скрытого кода ст р аницы. Ниже мы убедимся ,
что программно загруженные в по ртальн ые каркасы пользовательские

элемен ты ynравления обрабатывают свои события точ н о также , как


будто бы каждый из н их находится н а отдельной тестовой стран ице .

• IJ$Откройте н а редакти рование файл DynаmicUsеrСо пtrоls.аsрх.сs


• ~Добавьте в масс Dynam i cUse r Co ntr ols следУЮЩИЙ код

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

usiпg System;
usiпg System.Data;
usiпg Systеm. С опfigша tiоп;
usiпg System. Collections;
usiпg System. Web;
usiпg System. Web.Security;
usiпg System. Web.UI;
usiпg System. Web. UI. WebControls;
usiпg System. Web. UI. WebControls. WebParts;
usiпg System. Web. UI. HtmlControls;

public partial class Dynamk:UserControls : System.Web.uI.Page


(
protected void Page_Load(object sender, EventArgs е)
(
11 Загружаем портальные каркасы
М yLoadControls(Panel1);
м yLoadControls(Panel2);
М yLoadControls(P апеlЗ);
}

11 Вспомогательная функция
private void MyLoadControls(Control сопtaшегРапеl)
(
11 Объявляем вспомогательные ссылки на ин терфе йсны е
11 элем ен ты текуще го контейнера
DropDownList list = null;
PlaceHok:ler ph = null;
Labellbl = null;

11 П е ребир аем все дочерние э леме нты текущего


11 контейнера и ищем ссылки на объекты дочер ни х
11 интерфейсных элементов п о их типа м
foreach (сопtгоl си! iп сопtашегРаneL Со пtrоls)
(
if (ctrl is DropDownList)
list = (DгорDоwпList)сtr~
else if (си! is PlaceHolder)
ph = (PlaceHolder)ctrl;
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

e~e if(ctrl ~ Label)


Ibl = (Label)ctr~
)

// Берем инqюрмацию из выделенного


// элемента списка текущего контейнера
strmg IstValue := list.Se!ectedItem Va!ue;
strmg IstText := list.Se!ectedItem.Text;
lbL Text = '"';

// Заполняем текущий контейнер.


// Проверяем наличие нужного расширения
if (~tVаlllе.Епdswith(".аsсх '))
(
р h. С о ntro 15. Add(P age. Load С о ntro ~Ist Value ));
lbLText = "З агрузили: " + IstVa!ue + "- "+ IstText;
}
}
}

Листинг Код файла DynamicUserControls.aspx.cs

Создадим пользовательские элеме нты управления, которые реализуют


пользовательский интерфейс и функциональность, использованную
нами при выполнении прим еров в тестовых страницах. Из этих
тестовых страниц мы их и п еределаем.

• ~ пан ели So!ution Explore выделите при нажатой ЮIaвише Ctr!


следУЮщие файлы
о HeaderTest.aspx
о TuneDisplayTest.aspx
о LinkTabIeTest.aspx
о LinkTabIeExtTest.aspx
о MyControIГest.aspx
• ~ыполните команду Сору затем Paste (на верхнем узле
пр оекта) контекстного меню
• ~ рисвойте копиям те же самые имена , только с расширением
.ascx
о HeaderTest.ascx
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

о TuneDisplayTest.ascx
о LiпkТаЫеТеst. аsсх
о Liпkтаы Ехtтеst.аsсхx
о M yC ontro IГe st. ascx
• ~Откройте новые файлы в дескрипторном режиме и замените
директиву @Page н а @Control , все остал ьны е атрибугы
директивы @Page оставьте пр еж ни м и . Теперь это будуг не
страницы, а польз о в ател ьские э леме нты управления. Директиву
@Reg i ste r с ее атрибугами остав ьте в покое
• ~дали ть и з кода все дескрипторы <html> , <body> ,
< f o r m> , <head> и за крыв аю щие их дескрипторы.
• г;.:.='Для н ов ых файлов >I< .ascx откройте файлы скрытого кода
>1< .ascx.cs и замените в объявлении масса и м я наследую щего
масса с" Sys t em . Web . UI . Page " на "
Sys t em . Web . UI . Use r Cont r ol " Остальной код массов
оста нется пр еж ни м.

Мы зако нчи ли выпол н е ни е примера. Код т естовой страницы пр и


очередной за гр узке БУдет пр огр амм но создавать сво и польз овател ьские
э л емен ты управления для каждого контейнера Рапеl и р азме щать и х в

э л емен тах PlaceHo l der .

• ~ыполните страницу Dynamk:UserControls.aspx и испытайте ее .


Р езул ьтат будет прим ер но таким
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

11 ПОртальные KapKaCbl - Мicrоsоft Internet Explorer


---------------------------- -

I Ве рхн ий кол о нтит ул

: HeaderT est. ascx -

I Список гип е рссыл о к

Список жизненно важных гиперссылок

..: Ссылка N<> 1 К Большому Биллу


..: СсылкаNо2 к автошколе "Диалог-Сервис"
r;.: СсылкаNQ3 к затычке JavaScript

з зишr: LinkTableTest.ascx - СШIСОК пше сс ьшок

I Кн о пка ' b p eMR-д ата'

19:02:44

Сегодня пятшща, 23 марта 2007


Текущее время 19:02:44

з зишr: TimeDis lа Test.ascx - Кнопка 'в емя- дата'

1111 ГГГ ~ Local htr~t

Ин огда при отладке приложения оболочка начинает сбоить, выдавая


н епонятные ошибки. Может помочь п ерезапуск VlSua! Studio 2005 и ли
удален ие файла web.co nfig, все равно оболочка создаст его

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

автоматичесЮ1 при очередной компиляции. Пока нам этот файл не


жалко, потому что его настройками мы все-равно еще н е занимались.
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Много кадровые элементы управления

Элеме н т управления MuhMew. Ynравление отображением


пр едставлений. Элемен т управления Wizard. События элемента Wizard.
Стили элемен та Wizard. Ша блоны элемен та Wizard.

Файлы к лекции Вы можете скачать здесь скачать:

httр :l/оkl.iпtuit.ruldераrtmeпtJiпtеmеtJрrаsрпеtJ7 /07 _ WebSiteS.zip

Два высокоразвитых элемента управления Ми1 t i V i ew и Wi zard


по зволяют организовать для пользователя имитацию сложного

мно гостранично го пр осмотра. Они содержат встроенные средства


локальной навигации, обеспечивающие смену кадров с разным
пользовательским интерфейсом, но единым оформле ни ем.

Элемент управления MultiView

Элеме н т уп р авления Ми] t i V iew по зволяет организовать ст р аницу в


виде множества вюыдок. Каждая вкладка может содержать свой
пользовательский интерфейс и обеспечивать свою форму
пр едставления одной и той же информации пользователя .

• ~Создайте новый проект с именем WebSi t e5 , выполнив


командУ меню FilelNewMebSite и определив пар аметры масте р а
так
в.м. СН"",,,В Про,раммupoвtJNШ' NQ ASP. N ET

.1J ~
T...-rpl ..,... Гf! ;:;:

~ ~ ~ ~
АЧ' r.ET \', 00 ASP J-ET W3!J ж-sma l Vleb ЕrrjЖ)l Web
Sib SOfYEO Si'" stoc"" K~ Sib

I~ Ь:ОП A5P, rEТ Vieb s.te


Loc<Otoo : "IFi~>~~=,"О"::---::J:ll mtm-.,."",iЦ'i!I'"Ш;;;-М!§iI 3 [:'-0"'''' .. ,

I v ~"'" CI

• r;:;nереименуйте, для тренировЮ1 смелости в отношении


модификации кода, сгенерированную страницу Default.aspx в
MultiViewControLaspx, в ее демарации @P a ge введите новое
значение параметра Inhe ri ts= " Mu l t i ViewCont r o l", а в
файле скрыто го кода переименуй те масс в Mul t i Vi ewCon t rol
(или не п ереиме н овывайте ни масс и Inhe ri ts , ни страницу,
но я будУ говори ть об этих име н ах и код при водить С их
использованием)
• ~ оместите на страницу в режиме редактора Design из вмадЮ1
Standard ком п онент-кон тейнер Ми1 t i Vi ew
• ~ оместите на ст р аницу в режи ме редактора Design внугрь
созданного объекта Ми 1 t i V i ew 1 из той же вмадки Standard три
экзем п ляра компонен та Vi ew. Компонент Vi ew н азывают
предсmавленuем данных

в результате оболочка сге н ерирует следующий дескрипторный код

<%@ Page AutoEventWireup =''true''


Со d е Filе =' 'МultiViewС опtrоLа s р х. с s''
Inhеrпs=' 'МultМеwС опtrо l'' Language="C#" % >

'"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

<html xmlns=''httр ://www.wЗ.огgl1999/xhtml'' >


<head nmat="server">
<title>Untitled Page</tide>
<lhead>
<body>
< fопn ю="fоrml" runat="server''>
<div>
<aspMulttView ID =''М ukМе w l '' nmat="server''>
<asp:View ID=''Viewl '' nmat="server">
</asp:View>
<asp:View ID=''View2'' nmat="server">
</asp:View>
<asp:View ID=''ViеwЗ'' nmat="server">
</asp:View>
</asp:MuluView></div>
</form>
<!body>
<lhtml>

Листинг Дескрипторный код файла MultiViewControl.aspx

• Г;;:;=Запустите приложение и вы получите чистый экран броуэерй ,


п оскольку созданные вкладки - пр едставле ния еще н е были
заполнены интерфейсными элементами и показать им нечего

Заме чани е. Пр едстав ле ния V i ew можно добавлять и программно п о


мере необходимости (как и любой другой элемент управления). Для
этого нужно создать экзем п ляр (например, V i ew l ) нового
представле ния и добави ть ссылку на него в коллекцию Vi ews
экземпляра (например, Mul t i Vi ewl ) элемента Миl t i V i ew с
помощью Mult i V i ewl . V i ews . Add(Viewl) и ли

Mult i Viewl . V i ews . AddAt ( i nde x, V i ew l ) . Свойство Vi ews


определено в классе

Sys tem . Web . U1 . WebCon t r ols . ViewCollec tion , который и


имеет указанные методы Add () и AddA t ( ) . Но мы БУдем для
простаты использовать декларативный способ этапа проектирования.

Web-форма в оболочке после наших действий БУдет и меть вид

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

/ MultiViewControl,aspx l ,., х

,.- MultiViewl
, ~

i" Viewl

View2
-
.- View3

,
Visual Studio 2005 во время проектирования показывает все
представления View в раскрытом виде , но на этапе вы п ол н ени я на

странице может отображаться только одно ИЗ них, которое раскроет


пользователь . Кажд ое представление можно редактировать в оболочке
точно также , как любую часть обычной страницы .

Будет ли при загрузке страницы раскрыто какое-либо п редставление


или нет, определяется свойством MultiView . ActiveViewlndex,
доступном и на этапе проекmUРО6анuя и про граммно. Если значение
это го свойства равно "-1 ", то п ри начальной загрузке страницы ни одна
из ВЮJaДОК н е БУдет раскрыта. Если свой ство установлено в н оль , то
будет раскрыта первая вклад ка и т. д .

Давайт е прод олжим выполнение нашего примера и н а п ол ни м


представления каким-ниБУдЬ содержимым .

• r;:;n оместите в корневую папку сайта какой-н и будь рисунок


щадящего Web-qюрмата ( >1< .gif, .... jpg, >1< .рпg ). Один из вариантов
ри с унка, файл MyPhoto.jpg, пр ила гается ...
• Г;:;=П оместите в пред ставле ни е V i ew l из вкладки Staпdагd
компонент Image (контейнер для рисунка) и декларативно
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

настройте его так:


о I mаgеU r l~ " -/МуРhо t о . jрg " . Символ (тил ьда)
обозначает корень виртуального каталога сайта
• ~ оместите в пред ставление V i ew2 какой - нибу,ць текст
• ~ оместите в представление View3 элемент Calenda r из
ВЮJaДКИ Standard и настройте е го внеlШlИЙ ви д
• ~ы делите объект Mult i V i ew l и установите его свой ство
ActiveViewlnde x в значение ноль, чтобы при начальной
загрузке страницы было открыто п е рвое пр едставление

Управление отображением представлений

Вариант 1

Как один из вариантов ynравления вкладками можно дать


пользователю раскрывающийся спи с ок, с помощью которо го он будет
выбирать нужное представл ени е.

• ~ оместите на qюрму страницы вперед и эл ем ента


Mul t i V i ew l компонент Dr opDownLi s t из вкладки Standard
• ~становите для с пи ска свойство AutoPostBack в значение
True , чт обы при выборе нового пункта автоматически
выполнялась обратная отсылка
• ~ы делите эюемпляр DropDownL i s tl и ч ерез панель
Prop erties в режиме Even ts создайте обработчик события
Selectedlnde x Changed

Дескрипторное пр едставление страницы бу,цет таким

<%@ Page АutоЕvе пtWirе uр=''truе''

СоdеF ilе="МuhМеwСо пtго L аsрх.сs"


Inhег its= ' М ultiViеwСопtrоl" Lапguаgе="С#" %>

<html xmlns="httр ://www.wЗ.огgl 1 999/xhtml" >


<head nmat="server">
< title >Элеме н т ynравле ни я м ножеством п редстав ле ний </tit1е>
<lhead>
'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

<body>
< fопn kl="fопnl" runat="server''>
<div>
<asp:DropDownList ID= ''DropDownList1 '' runat="server"
AutoPostBack='True"
О пS е lected IndexC hапgеd = ''Drop DownListl_S е lected IпdехС hanged I

</asp:DropDownList><br 1>
<aspMuluView ID='MuhMewl " nmat="server" ActiveViewIndex="O">
<asp:View ID::::''Viewl '' runat= "server''>
< Ы > Мое qюто < lhl >
<asp:Image ID='1magel " runat= "server" lmagеUгl= "~lМуРhоtо.jр:
</asp:View>

<asp:View ID::::''View2'' runat= "server''>


< h1 > Мои стихи < lhl>
<р>

У Лукоморья дуб зеленый < Ьг 1>


Златая цепь на дУбе том < Ьг 1>
И д нем и ночью кот ученый<Ьг 1>
Все ходит по цепи кругом
</p>
</asp:View>

<asp:VJew ID= ''ViеwЗ'' runat= "server''>


< h1 > Мой календарь < lhl >
< аsр:Саlепdаг ID =''С аlепdагl ''
runat="server" BackColor=''#C OFI
BorderColor= 'Red " BorderStyle=''Ridge''>
</asp:Calendar>
</asp:View>
</asp:MuluView>
</div>
< /foпn>
<!body>
<lhtml>

Листинг Дескрипторный код файла MultiViewControl.aspx

• r;.:;=поместите в файл МuhiViеwСопtrоLаsрх.сs следУЮЩИЙ код


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

usiпg System;
usiпg System.Data;
usiпg Systеm.Сопfigшаtiоп;
usiпg System. Web;
usiпg System. Web.Security;
usiпg System.Web.UI;
usiпg System. Web.UI.WebControls;
usiпg System.Web.UI.WebControls.WebParts;
usiпg System. Web.UI.HtmlControls;

public partial class MultiViewControl: System.Web.UI.Page


(
protected void Page_Load(object sender, EventArgs е)
{
11 Заполняем список только при первом запросе страницы,
11 а потом все бу,цет сохраняться в состоянии вида.
11 Иначе список всегда будет переустанавливаться в начало
if (!lsPostBack)
{
11 Подсоединяем коллекцию с ВЮJaДками к списку
DгорDоwnListl.DаtаSошсе == MuluViewl.Views;
11 Назначаем идентификатор , значениями которого
11будуг заполнены поля 'Text" списка
DropDownListl.DataTextField == "ID";
11 Заполняем список подсоединенными данными
DгорDоwnListl.DаtаВiпdО;

11 Отображаем первое представление


MultiViewl.ActiveViewlndex == О;
11 Синхронизируем список
DropDownListl.Selectedlndex:= О;

11 Выделяем текущую дату


Calendarl.SelectedDate := DаtеТпnе.N ow.Date;
Calendarl.SelectedDayStyle.BorderStyle:= BorderStyle.Solid;
}
}

11 Обработчик события выбора в списке

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

protected void DropDownList1_SelectedlndexChanged(object serкler, Event


{
MultiViewl.ActiveViewlndex:= DropDownList1.Selectedlndex;
}
}

Листинг Код файла MultiViewControl.aspx.cs управления

представлениями

• ~ыполните страницу, результат долже н быть не менее


лучезар н ым, чем этот...

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

11 Элемент управления множеством представл ..


FM
e Edlt y~w Favorites ТОols Help
t2t search @] Favorites
: 1041ANеЬSitе5МultiViеwСоп-о-, .....

Мое фото

Local in-o-.:net

Вариа н т 2

В обработчике события Page Load () мы , для тренировки , встав и ли


КОД, чтобы пр и п ервом за п росе страницы список п ро граммно
заполнялся значе ни ями атрибугов ID представлений. Это го можно и не

'"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

делать, если вручную на этапе праектuраванuя заполнить свойство


1 te ms списка более осмысленными именами.

Мы, также , назначили для списка Аи toPos tBack= " True ", чтобы он
индивидуально осуществлял обратн ую отсылку Ну; а если на странице
будет мно го интерфейсных элементов с возможностью постинга ,
которые долже н БУдет нас трои ть пользователь. В этом случае будет
расточительно, что каждый элемент интерфейса при настр ойке
индивидуально посылает страницу на сервер для обновления. Лучше
предусмотреть отдельную кнопку; которая отдаст команду браузеру на
обратную отсылку после настройки всех интерфейсных элементов .
Выполним эти модификации на новой странице.

• Г;;:;=Через панель Solution Explorer выполните копию страницы


MultiViewControLaspx и присвойте копии новое и мя
Mul t i Vi ewCont r oll . asp x .

Обратите внимание , что файл кода .cs автомат и чески копируется и


переименовывается вместе со страницей. Более то го , в оболочке даже
не пр едусмотрена возможность переименовать е го отдельно, пока он

связан со страницей . Правда, его можно ско пировать отдельно, то гда он


переименовывается.

• г;.:.=выполните команду меню Window/Close АН Documents, чтобы


закрыт ь все прежние окна редактирования рабочей области
оболочки
• Г;;:;=Откройте новую страницу MuluViewControl1.aspx на
редактирование и выполните команду меню Website/Set А5 Start
Page, чтобы сделать теперь ее стартовой при запуске и з оболочки
• ~ыделите список через панель Properties и сбросьте его
свойство AutoPostBac k в False
• r;:Fчерез раскрывающийся список в верхней части панели
Properties выделите объект Mul ti Viewl и задай те
ActiveViewInde x =- l, чтобы ни одно представление при
первой за гр узке стра ницы у пользователя не было раскрыто
• r;;:;=в файле MultiViewControll.aspx.cs полностью очистите
об р аботчи к события Page Load () , код которого в предыдущем
прим ере прогр амм но заполнял список (можно полностью Удали ть

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

этот обработчик, н ам он здесь не понадобится)

Сейчас мы должн ы заполн и ть список декларати вно (на этапе


проекmuрованuя) .

• u;.;rвыделите список и за п олните его свойство 1 tems так


Декла р ативные настройЮ1 объекта DropDownList1

Items[iJ Text Value


1 te ms [О] Моя ф:нографи я не имеет значения .. .
1 te ms [ 1 ] Мои стихи не имеет значения .. .
1 te ms [2] Встроенный кале н дарь не имеет значения .. .
• ~Добавьте на новую стра н ицу сп рава от с п иска кно п ку Input
(Submi t) из вкладЮ1 НТМL п анели Toolbox (вос п ользуемся
п ростой кнопкой) и задайте ей Value=Show i
T itle= PacKp blTb вкладку
• ~3апустите приложе ни е и неизменяя сп исок п он ажи майте
кнопку Show.

Ни чего не п ро и сходи т, пока в списке мы не выбирем новый п ункт.


Только после этого свойство Mul ti Viewl . Acti veV i ewIndex
п римет отл и чное от -1 значение и п редставления при обратн ой отсылке
н ачнуг работать. Чтобы и с п рав и ть это , нужно код п рисвое ни я значения
свойству ActiveViewIndex п ереместить в обработчик нажатия
кнопЮ1.

• IJ$Создайте обр аботчик для кн оп Ю1 1 D=Sub mi t 1 двойным


щелчком на ней мышью

Мы видим, что оболочка создала код заготовЮ1 JavaScript -с ц е н ария ,


который мы должны зап ол н ит ь и который ст р аница готова п осылать на
клиентсЮ1Й броузер. Чтобы не в н икать в JavaScript приведем в свое
оправдание аргумен т, что поддержка сценариев JavaScript - дело
н енадежное, поскольку пользователь может в своем броузере ее
отключ и ть.

• ~дали те созданный оболо ч кой предыдущим действием код


JavaScript -сценария. Для это го в режи ме Source помести те
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

те кстовый курсор редактора внугрь блока кода < зе r i pt


lang uage= " javaser i pt "
t ype= " te x t/ j avascript " > .. I .. </ scr i pt> и в нижней
ча сти р амки окна редактора щел кните на кнопке <script>. Весь
выделенный код можно Удалять
• ~далите из дескриптора <i nput> кнопки Submit1
one li e k =" retu r n Subm i tlonel i c k( ) ",
сгенерированный оболочкой
• Г;:;=Щел кните на Submit l правой кнопкой мыши и выполните
командУ RШl As Server ControL Этим действи ем в дескриптор
<i np ut > будет добавлен атри буг runat= " se rv e r", который
заставит AS P. NET за п ус кать обработчик кнопки (если мы его
предУСМОТРИМ) , если с броуэерй с обратной отсылкой будет
прислан о событие , что кли ент щелкал на этой кнопке
• ~ы делите список Dr opDownL i st l и чере з п а нель Properties
в режим е Events очистите пол е события
Selec t edlnde x Cha n ged
• ~Двойным щелчком на , теперь уже серв ерной , кнопке Submit1
создайте дл я нее обработчик в файле MultiViewC ontroll. aspx.cs
• r;:;nеренесите код обработчика события
Selec t edlnde x Cha n ged в КОД нового о бработчика , а старый
обработчи к удал ите

в результате код файла будет таким

using System;
using System.Data;
using Systеm. Со пfigшаtiоп;
using System.Web ;
using System. Web.Security;
using System. Web.UI;
using System. Web.UI. WebControls;
using System. Web. UI. WebControls.WebParts;
using System. Web. UI. HtmlControls;

public partial class MultiViewControl: System.Web.UI.Page


(
11 Обработч ик события на кнопке Submitl

m
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

protected void SubmitCServerClick(object send er, EventArgs е)


{
MultiViewl.ActiveViewlndex:= Dro pDownList1 .SelectedIndex;
}
}

Листинг НОВЫЙ КОД файла MultiViewControll.aspx.cs

• ~ыполните страницу

Теперь по прибытию на сервер обратной отсылки система ASP.NET


распознает присланное событие щелчка на кнопке. Свойству
Mul t i Viewl . Acti veV i ew l nde x в обработчике события кнопки
присваивается значение выбранной поль зователем опции списка.
Клиенту страница отправляет СQЦержимое вклil,цки , соответствующей
его выбору.

Добавление в представления функций навигации

в предыдущих при мерах мы знакомились с механизмом р аботы


элемента МИl t i Vi ew. Мы использов али для смены ВЮJaДОК внешний
по отношению к Ми1 t i Vi ew элемент списка. Но Ми1 t i Vi ew имеет

собственные средства для перехода по своим ВЮJaДками. Рассмотрим


эти возможности.

Серверные элементы Виttоn , IтageButton , LinkBu t ton


реализуют интерфейс
Sys tem . Web . U1 . WebCon t r ols . IB u t t onCont r o l, от которого

наследуют способность генерировать не только событие Сl i c k, но и


событие Coтmand . Такие элементы управления называются
кнопочными. Они реали зуют ряд полезных свойств интерфейса, таких
как CommandArgu ment , Co mmandName и д р.

m
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

ObJect Browser .... ~ Х

Вrowse: AI Components •

.~ CommandAгgument
; .~ СоттandNате
i""b Base Types I.. ·~ PostвackUrl
~"1b Derived Types i-~ Text
riJ···4$ Вutton I.. ·~ ValidatJonGroup
$. .4$ ImageВutton ,_о , Cl,ck
r4J ...4$ LinkВutton
!.... '1 соттаnd

в свою очередь, элемент управле ни я М иl t i Vi ew содержи т


об щедо ступные пер еме нные (поля) , которые ожидают поступления
определенных команд, чтобы Миl t i V i ew соответствующим образом
и х исполнил .

Ob)eCt Brow$et" ...... -!;::; х

BrOW$e: ,1. 1Component:3 .. .. Ъ f::jJ .

createCoo1yo ~c:fec1j oo О

~ GetActiveVlew O
.~ МJ I1jV~W O

CflAc1jveV~wCh.:n;led (Sy:;te m ,EverltAr gз)


CflБLkЫеЕVerlt(cbje ct, Syste m,EVerltArgs)
SetActiYeView(Sy~tem, Web.UI. W ebCootrd ~, V~w)

ActiVeVieW!гdex
Enatk1Пеm h;)
V..ews
{J Nextv~wCommard\Jame
~ FТeVio..lsVi€wComma l"d Name
OQO SWitchViewByIOComm zrd.j ame
{J SW itchViewBy Irde xComm cп:f.Ja me
' AcbYeY~

Ниже приведены команды , которы е ожидает Миl t i Vi ew.

Имена кома н д , которые может распознать MultiView


аЛ.
Поле Ждет команду

Пере:

ш
В.М. С """,,,в Про,р а ммupoвtJNШ' 110 ASP. N ET

слею

пред(

Ne x tViewCo mmandName Ne x tView Кома


з н аче

Co ml1
КНО П I

Пере:
пред]

пред(

PreviousViewCommandName Pr evView Кома


з н аче

Co ml1
КНО П I

Пере:
пред(

з н аче

и д ен '

Sw i tchV i ewByIDCommandNa me SwitchViewByID пере)

свой(

Co ml1
КНО П I

упра l

Пере:
пред(

о п ре/

ин д еl

Sw i tсhV i еwВуlпdе х Соm m апdNаmеSwitсhViеwВуlпdе х пер ~

свой(

Co ml1
КНО П I

упра l

Вос п ользуемся опис а нным механизмом в нашем примере. Развитие


п рим е ра выпо л ним на копии .

• ~ панели Solution Explorer с копируйте страницу


MultiViewControll .aspx, п рисвойте копии имя

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Mul t i ViewCont r ol 2 . asp x и сделайте эту страницу


стартовой
• ~ з вклil,ЦЮ1 Standard п ан ели Toolbox поместите в первое и
последнее представления по одной сервер ной кнопке Button , а
в среднее - д ве кнопЮ1

• ~ астройте кнопки как показано в таблице

Настройка кнопок навигации на


пред ставлениях

Представление Свойство Значение

IO b t nNe xt O
Views[O ] Te x t Ne x t >
Co mmandNameNe x tV i ew
IO b t nPrev l
Te x t < Pre v
Co mmandNameP rev V i ew
Views[l ]
IO b t nNe xtl
Te x t Ne x t >
Co mmandNameNe x tV i ew
IO b t nPrev2
Views[2 ] Te x t < Pre v
Co mmandNameP rev V i ew

у нас в обработчике кнопки Submi t 1 выполняется синхронизация


выбранного пункта списка и активного пред ставления. Если те перь
осуществлять переход по пр едставлениям введе нными кно п ками

навигации , то об р атной синхронизаци и представлений со списком не


будет. Исправим это ...

• ~становит е редактор страницы в режим Dе s igп


• r;:;=в пан ели Properties в
верхнем раскрывающемся списке
выберите объект Mul t i Viewl , п еревед ите пан ель в режим
Events (кнопка с пиктограммой мол ни и) и двойным щелчком на
поле события ActiveV i ewChanged создайте обработчик,
который запол ни те кодом си н хронизации с пи ска
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

в результате файл п одце р жки страни ц ы должен быть таким

using System;
using System.Data;
using Systеm. Со пfigша tiоп;
using System.Web ;
using System. Web.Security;
using System. Web.UI;
using System. Web.UI.WebControls;
using System. Web. UI. WebControls. WebParts;
using System. Web. UI. HtmlControls;

public partial class MultiViewControl: System.Web .UI.Page


(
// Обработчик соб ытия на кнопке Submitl
// С ин хро ни зация представлений со списком
protected void SubmitCServerClick(object sender, EventArgs е)
(
MultiViewl.Active ViewIndex = DropDownList1.SelectedIndex;
)

// С ин хро ни зация списка с представ ле ниям и


protected void Muh.iViewl_ActiveViewChanged(object sender, EventArgs е)
(
DropDownListl.SelectedIndex = MultiViewl.ActiveViewIndex;
)
}

Листинг Файл скрытого кода MultiViewContro12.aspx.cs

Фай л дескр ип то р но го пр едставле ни я БУдет та ки м

<%@ Page AutoEventWireup=''true''


CodeFile='MuhMewCo ntrol2.aspx.cs"
Inhег its=''М ultiViеwСопtrоl'' Language="C#" % >

<html xmlns=''httр://www.wЗ.огgl1999/xhtml'' >


<head nmat="server">
< title >Элеме нт управления м ножеством представлений< /title >
<lhead>
п,
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

<body>
< fопn kl="fопnl" runat="server''>
<div>
<asp:DropDownList ID=''DropDownList1'' runat="server''>
<asp :Listltem> Моя фотография < /аsр:Listltеm>
< аsр:Listltеm>Мои стихи </asp:Listltem>
<asp :Listltem> Встроенный календарь < /аsр:ListItеm>
</asp:DropDownList>

< inр и! id ="Submitl " type="submit" vаше="Shоw"


title=''PacKpbITb ВЮlадку" nшаt="sеrvег"
onserverclick="S ubmit C ServerClick " /><br />

<aspMultNiew ID='MuhMewl " nmat="server"


ОпАсtivеViewСhапgеd=''МultiViewl _АсtivеViеwСhaпgеd' '>
<asp :View ID=''Viewl '' nшat= "sеrve г ''>
<Ы >
Мое фото < lhl >
<asp:lmage ID='1mage l " runat="server"
l mageUrl="~lМyPho to.jpg" />< Ьг />
< Ьг />
< аsр:Вuttоп ID='Ъ tnNехtО " runat="server"
CommandName= 'NextView" Text='Next >" />
</asp:View>

<asp :View ID=''View2'' nшat= "sеrve г ''>

<Ы >
Мои стихи<lhl>
<р>

У Лукоморья дуб зеленый < Ьг />


Златая цепь на дУбе том < Ьг />
И д нем и ночью кот ученый<Ьг />
Все ходит п о цепи кругом
< /р >
< аsр:Вuttо п I D='ЪtnP геvl " nшat= "sеrveг"
Со пunaпdN ame=''PrevView''Text="< Ргеу" />
< аsр:Вuttо п I D='ЪtnNехt1" runat= "server"
Со пuпапdNаmе ="NехtViеw" Text='Next >" />
</asp:View>
m
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

<asp:View ID =''ViеwЗ'' runat="server''>


<Ы >
Мой календарь<lhl >
< аsр:Саlепdаг ID ="Саlепdагl "
nmat="server"
BackColor=''#COFFFF'' BorderColor='Red"
BorderStyle='Ridge" />
< Ьг />
< аsр:Вuttоп ID= 'ЪtnPгеv2"
runat="server"
СОП1J1la пdN ame=''PrevView'' Text="< Ргеу" />
</asp:View>
</asp:MuluView>
</div>
</form>
</body>
<lhtml>

Листинг ДеСlCрипторное представление страницы

MultiViewContro12.aspx

• ~ыполните страницу и у6едитес ь, что все работает как н ужно


В.М. СН"",,,В Про,рйммupoвtJNШ' Na ASP.NET

11 Элемент управления множест ..


FMe Edlt y~.". Fаvопtеs Tools
Bxk т .. т ~ @) G'! ~ se"ch
hl:ljo:!~ocalhost:

I мои стихи iJ ShO\N

Мои стихи
у Лукоморья дуб зеленый
Златая цепь на дубе том
И днем и ночью кот ученый
Все ХОДИТ ПО цепи крутом

< Р г еу Next >

Loca in1J"anet

ХОРОШИЙ элемент, что и говорить . Но есть оди н существенный


недостаток. Поскольку хранится несколько представле н ий, то мы
должны быть готовы вер н угься к любому представлен ию, если его
повторно вызовет пользователь. Это значит, что мы должны сохранять
состояние вида всех п редставлен и й, в том числе и нев и димых в
данный момен т. Из-за этого элемен т п осылает на клиен тскую машину
большой объем кода состояния вида. О т этой не п риятности можно
избавиться, отключив свойство EnableV i ewState .

Еще одна особенность, о КОТОрОЙ стои т помнить. Элемент Ми1 ti V i ew


не является контейнером для имен элемен тов управления на вкладках .
Это значи т, что в пределах стра ниц ы все элементы управления должны
иметь ун и кальные значен ия иден тификаторов ID, и н аче компилятор
заблУдИТСЯ.
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Элемент управления Wizard

Элеме н т управления Wiz ard (масте р) является более развитым, ч ем


элемент MultiView. Он имеет богатую настраиваемую
функц и ональность, ВЮlючающую в себя

• Возможн ость п оследовательного отобр аже ния од н ого и ли


н ес колью1Х пр едставле ний
• Встроенные ююпЮ1 на в и гац и и
• Встроенное боковое меню со ссылками на выполняемые шаrn ­
вЮJ 3ДЮ1

• Ст и л и и шаблоны

Содержи м ы м шагов - ВЮJ 3Док мастера являются Web- и НТМL-элеме н ты


управления, обычно используемые при п остр ое нии страниц .
Ра ссмотри м п оследовател ьно свойства элемента управле ни я Wi zard
на пр имерах.

• Г;;:;-Добавьте новую страницу с именем Wi zardCon tr ol . азр х


и файлом отделенного кода. Н аз н ачьте ее ста рто вой
• ~ режиме Design редактора пом ест ите на страницу элемен т
управления Wi zard из ВЮJадЮ1 Standard пан ел и Too lbox

Б удет сгенерирова на така я загот овка

/ WizardControl,a5px* ~ J
ЕЕ го'

SteD
Steo 2
INext I
Дескри п торное п редставление за готовЮ1 БУдет таЮ1м

<%@ Page L апgua gе="С#" Аutо ЕvепtWirеuр =' 'truе''

С оd еF ilе='WizaгdС опtrоLа s р х. с s" lпhе гits='WizaгdС опtrоl" %>


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

<html xmlns =' 'httр ://www. w З .огgl 1999/xhtml'' >


<head nmat="server">
< title >Эле мен т управ ле ния Wizard</tit1e>
</head>
<body>
< fо пn ю ="fо rml " runat="server''>
<div>
<asp:Wizard ID='Wizardl " runat="server" ActiveStepInd ex="O">
<WizardSteps>
<asp:WizardStep nmat="server" 1it1e="S tep 1 ">
</asp:Wizard Step >
<asp:WizardStep nmat="server" 1it1e="S tep 2">
</asp:Wizard Step>
<lWizardSteps>
</asp:Wizard>
</div>
</form>
<!body>
</html>

Листинг Дес~рипторное представление страницы

WizаrdСопtrоl.аsрх с заготов~ой Wizard

Д альнейшей задач е й программиста БУдет настройка этой заготовки в


полноценный элемент управления. Оболочка предоставляет llШрокие
возможности для р азработч ика на этйпе проекmUРО6ЙНUЯ. Кр оме
традиционной панели свойств Properties элемент Wi z а r d имеет
дополнительную локаль ную панел ь задач для оперативных действий п о
на стройке. Чтобы вызвать локальную панель задач элемента Wiz a r d .
нужно щелкнугь мышью на пиктограмме в виде треугольника в его

прав ом верхнем углу

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

WiZ8rdControl.8SPX*
,.ЕН . Wizard Ta5k5
ilstep 1 Auto Foгmat ...
IIStep 2 Step IStep 1 ElI
!I~~~~~. ~_ .~.~~N~e~xt~l~ AddjRemove W~ardSteps ...
Convert to StartNalkJationTem~te

Convert to StepNalkJationTem~te

Convert to F,nshNa"gatiooTerrplate
Convert to S,deBarTem~te

Ecit т em~tes

в элементе управления Миl ti Vi ew все п редставления на этапе


проектuрованuя р аскрыты для р азработчика. Для элемента Wi zard
оболочка VJsua! Studio 2005 п оказывает разработчику п редставление
только одного текущего ша га.

Чтобы создать н овые шаги мастера, нужно :

• п росто добавлять в его контейнер дескри п торы

<asp : Wiz ardStep>


• или через локальную панель задач выполни ть опцию Аd dlRепюvе
WizardS teps
• или в п анел и Properties вызвать на редактирова н ие свойство
Wi z ardSteps

'"
в.м. С""",,,в

WizardStep CoNection Editor ===-......;..; Про,раммupoвtJNШ' 110 ASP. N ET

Мembers: Step 1 properties:

~
о

1 Яер 2

~ AIowRеtllЛ
EnaЫеThе пg
T,~

Тс",

EnaЫeVIe'f)'State T, ~

ЯерТуре Auto
Title Step 1

dd'---_.J-I _-,ес:,,,mo:::.,:.:,,---,
_---"A::
еж Са гсel

Обратите в ни ма ние , что по умолчанию дескр ип торы

<asp : Wi z a r dS t ep> шагов -вкладок не им еют значения

иде н т ификатора ID. Здесь подразумевается , что для тако го сложного


элемен та управления р аз р аботч ику достаточно декла р ат ивной
настройки. Если же в дальне йше м разработчик пр ед полагает
программ н о управлять шага м и мастера, то без атрибугов ID не
обойтись.

в прив еденном окне редактирования коллекции ша гов-вкладок


наиболее существенными являются следУЮщие свойства дескрип то р а
<asp : Wi z a r dS t ep>

Н екоторые свойства дескри п тора <asp:WizardSteI


С войство О пи са ни е

T i tle Имя шага, видимое пользователю в ссылках н а боковой

Э то свойство о пр еделяет тип кнопок нави га ции , кото р ь


поль зо в ателю данным шагом, и рав н о одн ому и з з начен

Sуs t еm . WеЬ . UI . WеЬСолt r оls . Wi z аrdStерТу


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

• Auto - определяется по умолчанию и устанаВЛИЕ

зависимости от местонахождения шага в Ю)ллеКЦl

S t epType п ервом месте , то бу,цет кнопка Start, во в с ех пром€


кнопка Step, если на последнем месте - будет кног
• Complete - не показыва ет никаких кнопок и CKr

• F i n i sh - показывает кнопки Finishи Previous


• S t ar t - показыва ет кнопку Next
• S tep - показывает кнопки Next и Previous

Показывает, может ли пользователь возвращаться к это]

его прой дет. Если это свойство имеет значение fa l se ,


Al l o wR eturn ~
пользователь прои дет этот шаг, он н е сможет вернугься

ссылки, ведущие к этому прой денному шагу; немедленн

Наполним шаги маст е р а конкретным содержимым элем ента ми

управления, и настроим и х свойства. Всего создадим четыре шага , в


Ю)торых ра зместим :

• Wiz ardStepl - раскрывающийся списо к Dr opDown Li st


• Wi z ardStep 2 - список ра.циокнопок Rad i oBu t ton Li s t
• Wiz ardStep3 - текстово е пол е Te xt Bo x
• Wiz ardStep 4 - обычный текст

Оболочка VJsual Studio 2005 все отличные от значений по умолчан ию


свойства элементов сохраняет в дескрипторах текстового файла .aspx
как дополнительные атрибугы. Бол ее того , при уст ановке значений
отдельным свойствам оболочка сама генерирует новые дескрипторы и
даже ц елые блоки Ю)да. Поэтом у все декларативны е настройки сл ожных
элемен тов управл е ния нужно выполнять через пан ель Properties, но дл я
краткости излож ения прив едем уже готовый код настройки страницы
наше го прим е р а .

<%@ Page Lапguagе="С#" Аutо ЕvепtWirеuр=' 'truе ''

СоdеF ilе='WizaгdСопtrоLаsрх.сs" lпhегits='WizaгdСопtrоl" %>

<html xm1пs="httр ://www.wЗ.огgl1999/xhtml" >


<head nmat="server">
< title>Элемент управления Wizard</tit1e>

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

<lhead>
<body>
< fо пn id="form1 " runat= "server''>
<div>
<asp:Wizard ID=''Wizard1 '' runat="server" Васk С оlог= "# ЕFF З FВ"
BorderColor= ''#B5C7DE''
BorderWidth="1px" Width="100%" ActiveStep lnd ex=''O''
StartN еxtВ uttопТеxt="Далее >"
StерNехtВuttопТехt="Далее >" StepPreviousButtonText="< Назад"
FinishCompleteButtonText='ToTOBO " FinishPreviousButtonText="< Н.
Н еаdегТехt='Жи з н е нно важная ан кета!">
<WizardSteps >
<asp:WizardStep ID=''WizardS tep1 '' nшat= "sе rvег " Тitle ="Д рузья "
< hЗ >
Какой пр ез и де н т самый лучший? <lhЗ>
<asp:DropDownList ID=''DropDownList1'' runat="server">
<asp :Listltem> Наш П угин </asp :Listltem>
<asp :Listltem> Их Клинтон </asp:Listltem>
<asp:Listltem> Похожи й на Чингиз -Хана </а s р :ListItеm>
<asp :Listltem> Вы сам и </asp:Listltem>
<asp :Listltem> Ваша соседка </аsр:Listltеm>
</asp:DropDownList>
</asp:Wizard Step >
<asp:WizardStep ID=''WizardStep2'' nшat= "sе rvег" Тitle =' Туризм '
<h2 >
Где Вы были с 19 по 21 августа 1991 года?<lh2 >
<asp :RadioButtonList ID='RadioButtonList1 " runat= "server''>
<asp:Listltem> На Красной п ло щади </а sр:Listltе m>
<asp:Listltem> На Луне </аsр:Listltеm>
<asp:Listltem> В ч ужом огороде </аsр:L istltеm>
<asp :Listltem> У тетеньки </asp:Listl tem>
<asp:Listltem>B ayre</asp:Listltem>
</asp:RadioButtonList>
</asp:WizardStep >
<asp:WizardStep ID =''WizaгdS tе р З'' nшat= "sе rvег " Тitle =' 'ВстреЧI
< hЗ >
Кайтесь! Место встречи изменить нельзя! < IhЗ >
Ваш ИНН :
<asp:TextBox ID='TextBox1 " runat= "server" 1>
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

</asp:WizardStep >
<asp:WizardStep ID='WizardStep4" nmat="server" Тitle="Досуг">
<h2 >
Мера ПООI.l.lpения < lh2 >
Ус и ленная диета + кrlИзьма ззз перцем!
</asp:Wizard Step >
<lWizardS teps>
<HeaderStyle ВасkСоloг=''Вluе'' Fопt-Воk:l='Тruе" Fопt-Size="Х-L~
</asp:Wizard>
</div>
</form>
<!body>
</html>
Листинг Дес~рипторное представление страницы

WizаrdСопtrоl.аsрх с элементом Wizard

Несколько замечаний:

1. Такой дураштlИВЫЙ текст Вы долж ны изменить (Технари MOryr


себе позволить, пока Органы отдыхают, а ''Утомленные Солнцем"
до ц е нты - т ем более)
2. Боковую панель навигационных ссылок можно отключать
свойством Wi z ard . Di sp l ayS ideBa r = " Fal se "
з. Оболочка в режиме проектирования автоматически изменяет
значение свойства Wiz a r d . Act i veStep I nde x при
редактировании текущего шага. Поэтому, чтобы страница при
запуске показала первый шаг, небходимо в конце редактирования

либо на него перейти , либо установить


Wiz a r d . Act i veStep I nde x = " 0 "
4. Мы еще ничего не программировали , а уже успели добиться такой
мощной функциональности страницы
s. Последни й дескр иптор кода <HeaderStyle> определяет стиль
заголовочного блока элемента Wiz a r d , о чем мы е ще поговорим
ниже

• ~3апустите страницу с настроенным элементом Wi z а r d и


' 'подывитесь '', какой же все-таки Большой Билл умный, да еще так
вовремя - какие масuпабы и горизонты открывают для нас эти его

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

инструм е нты (н у, прямо , Э льдорадо!)

~ Элемент уnpавления Wlzard - Мicr050ft Internet Explorer .=J.gJ~


FIe Ed t Vfew Favcrites TooIs н.ф ~C-~-----_•
.... Back ... .....10 a'J ~ ' ~ Seif"ch [ij Favcrites '9 ~ () ' ~ ... .3 G! IВ .,. О ~
Addess Ji1 http://ocahJst: 104 1/INеЬstе5/INiиdCооtr,j .,,+,х :::J~

Жизненно важная анкета!


Где Вы бьJJШ с 19 по 21 августа 1991 года?
Друзья v

Т уризм
r На Краснои IШощади
Встречи r На Луне
l.I2.m r В чужом огороде
r. у тетеньЮI
r B ауте
I < Назад Далее>

ГГГ ~ Lосз пtrюеt


cJl

События элемента Wizard

До сих пор мы занимались настройками Wiz a r d в режиме


про ектирования, ПРИlШlа пора при ступить к программированию его

времени выполн е ния. Мы уже говорили , что для раз р аботчика задача
управления объ е ктами страницы во время выполнения сводится к
с озданию и программированию обработчиков событий , на которые
MOryг реаrnровать эти объ е кты. Ниже перечислены события , на которы е
может реагировать э кземпляр класса Wi z a r d .
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

ObJect Browser ...- --J;:I Х

Бrowse: All components

System.Web.UI.WebCOIltJols.\ ". ,.~ StepPrevirusButtonStyIe


.~ StepPreviQ/SButtOllText
.~ StepPreviQ/SButtOllType
5' StepS1yle
. 'ff: T.ag<ey
.~ WizEf"dSteps
C.arк:elButtOllID
.. Q C.aIYelCom mand\J.ame
СustоmF п isГВuttOllID
Custo mr-.JeхtвuttопID
CustomPreviousВuttonID
Data..istID
FinisГВuttOllID
FinisГPreviQ/SButtOllID
.. Qo rvIOveCompleteComm.ardN.ame
.. Q rvIOVeI\JextcommandName
.. " rvIOvePreVirusCommandName
.. " rvbveToComm.amName
SideBarButtOllID
StartNextвuttonID
Step\JextвuttonID

.. ., Carк:elButtOnCliCk
.. ., FinisГВuttOllClick
..'1 NextвuttonO:: k

.. " Ргеviru,вuttоnCick
..'1 SideBarButtOnClick

Собы тия , подцерживаемые элементом WiZQ j


Событ ие Описание

Ага! Пользоват ель переключился на новый


ActiveStepChanged
СВОЙСТВО АсtivеStерlпdех

Ага! Пользоват ель щелкнул на кнопке Сапсе


умолча нию н е отображается, од н ако ее мож

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

5 tep сразу, если установип


представления

Wizard . DisplayCancelButton= " Tr


инициирует обратную отсылку, и если не Щ
CancelButtonClick соответствующе го обработчика , то ничего н
одновременно определено свойство

Wizard . Cance l Des ti nationPageUr


СапсеlDеstiпаtiопРаgеUrl= " -/Мu
то п о щелчку пользователя на этой кнопке е
ст р аница

FinishButtonClick Ага! Пользователь дошел до последнего шаг

Эти события возникают при щелчке на кнOl


любом шаге. Но сменить шаг пользователь ~
Ne x tBu t tonClick , ~
Prev iousBu t t onC l ick панель. Чтобы такои момен т н е упустить и (
сме н у LIJara, лучше вместо этих событий обр
ActiveSteplndex
S ideBarBut tonCl i c k Ага! Пользователь щелкнул на ссылке в оБЛi

Чувствуете?!!! Мы сидим СО своим кодом на другом конце провода и


ждем очередных пожеланий ненасытного пользователя. При по лучении
от него очередного запроса мы анализируем выбор по присланным
событиям и пакуем для н его новую п осылку, в которую закладываем и
тр ебуемый текущий ответ, и интерфейсные элемен ты для ввода новых
пожеланий. Да все это еще должн о быть красивым, блестящим и
пyuntстым. Вот Большой Билл нам здесь и помогает - осталось только
руки приложить.

Используем событие FinishButtonClick , чтобы


усовершенствовать наш пример. Когда пользователь щелкнет в
последнем шаге на кнопке Finish (Готово), соберем его выбор с каждого
шага и вернем в раскрытом представлении это го по следне го шага .

• IJ$Откройте страницу WizardControLaspx в режиме Design и


перейдите на последний шаг WizardStep4 для его редактирования
• ~ оместите в середину контекста текстовую метку Label из
вкrJaДКИ Standard пан ели Toolbox, присвойте ей имя lblSummary
и очистите свойство Text

'"
В.М. СН"""'f~'•~~~~~~:~~~~=:~~~~~~П~"'~'~'"~~~"~-~"~",~"~"~"'~'~.N~П
/ Wizif"dCmtтd ,aspx,cs* WizaгdContгol.aspx* т Х

Жнзненно важная анкета!


lII>Ylli! Мера поощрения
ТУРИЗМ

Встречи lri~($~~~
~ Усиленная днета + клизьма ззз перцем!

< Наз ад ГОТ О В О

• ~ы дел ите объ е кт Wiza r dl и через п а н ель свойств в р е жи ме


Even ts со здайте обработч ик дл я собы тия
FinishBu t tonClick
• ~3а пол ните обработчик следующим кодом

using System;
using System.Data;
using Sуstеm.Сопfigurаtiоп;
using Sуstеm.Соllесtiо пs;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using Sуstеm.WеЬ.U I .WеЬСопtrоls;
using Sуstеm.WеЬ.U I .WеЬСопtrоls.Wе Ь Раrts;
using Sуstеm.WеЬ.U I .НtmlСопtгоls;

риыic рапia l class WizardControl: System.Web.UI.Page


(
protected void Page_Load(object sепdег, ЕvепtAгgs е)
{

protected void Wizard l_FinishButtonClick(object serкler, Wiza rdNa~


(
// Библиотека Framework 2.0 в на шем распо р яжен ии
System Теxt . S tr iпg8uildег sb:= пеw System Text.String8uilderO;
sb.Append("< h3> ');
sЬ.А р ре пd(''Вы выб р али : < Ьг /> '');
,,,
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

string tide ;

title = WizardStepl.1ide;
sb.App end(tit1e + ":" + DropDownListl.Text + "< Ьг />");

title = WizardStep2.1ide;
in! index = RadioButtonList1.Selectedlndex;
if(index! = - 1) // Есл и что-то выбрал
sb.App end(tit1e + ":" + RadioButtonListl.Items[index]Text + "<Ь

/* !! !!!!!!!!! !!!!! !!!!! !!!!! !!!! !!! !!!! !!!!! !!!!! !!!!! !!!!
// Для элеме н та класса C heckBoxList н ужн о пров е рять коллею
C heckBoxList C hec kBoxListl ;
foreac h (ListItem item in C hec kBoxListl .Items)
(
if (item.Selected)
sb.Append(item.Text + "; '');
}
!!!! !! !!!! !!!!! !!! !!!!! !! !!!!! !!!!! !! !!! !! !!!! !!!!! !!!!! */

title = WizaгdStерЗ . 1idе ;


if (ТеxtВох 1 . Теxt.Lепgth > 0)// Есл и что-то ввел
sb.App end(tit1e + ":" + TextBox1.Text + "< Ьг />< /ьг /> '');

sЬ.А рр е nd( "<IhЗ> ');

sЬ.А рр е пd(''В ам рекомен дуется:'');

// Отображаем собра нны е данные


IblSlll1lIrnry.Text = sbToString();
}
}

Листинг . ОбработчиlC событии FinishButtonClick в файле

WizardC ontrol.aspx.cs
• ~ ерейдите в режиме Design на первый шаг WizardStep1, чтобы
автоматич ески уста новил ось в НОЛЬ з нач е ние свойства
ActiveSteplndex объекта Wi z ardl и пользователю вначале
отображался первый ша г

'"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

• ~ыполните страницу, заполни те анкету и на последнем ша ге


щелкните н а кно п ке Готово. Обработчик отобразит пользователю
пр имер н о такой результат
~ Элемент уnpавления Wlzard - Мicr050ft Internet Explorer ~~_="ID I~
FIe Ed t Vfew Favcrites TooIs НеР
----
=-__ _
.... Back ... ..... ($) ffi ~ : ~ Seз:сh [ij Favcrites 1;' Мес1а (J 1 ~ "' .3 G! IВ r О -..--J
Addess Ji:I http://ocahJst :104 1/1.11 еЬSitе 5/1.11izз:dCооlrU ,aspх :::J~

Жизненно важная анкета!


Мера поощреЮlЯ

Друзья Вы выбрали:
Туризм Друзья: Их Клинтон
Встречи Туризм: В чужом огороде
i!<>m Встречи: 0123456789

Вам рекомендуется:
у сrшеЮlая диета + КШlЗьма ззз перцем!
< На зад ГОТОВО

1;.i1'"Dte=:-------------ггг ~ LОС3 Illrюеt

Стили элемента Wizard

Элеме н т Wi z a r d содержит средства, позволяющие легко менять его


внешний в и д . В н ем можно задава ть собствен н ый по льзовательский
ин терфейс, отлич н ый от интерфейса по умолчанию. Через
высокоуровневые свойства можно упр авлять цветами , шрифгами ,
интервалами и стилями гра ниц , н астраивать внешний вид каждой
кнопки, добавлять верхний колонтитул и т.д.

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

ObJect Вrowser ..... ~ х

Вrowse: AlI COmp:xelts

System, wro,LЛ. WebCon1YoIs, 1,. ..- --~ DispаУСЗIYelвutton


,,-~ DispауSideВзГ
, -~ F h ishCompleteВuttonImageijl
,,-~ FhishCompleteВuttonstyle
, -~ F h~ hCompleteВuttonText
,,-~ Fh~hCompleteВuttonTyp€
, -~ F h~ hDestinationPageLtI
" -~ Fh~hr-.JavigationТеmplatе
--~ F h~ hPreYiaJSButton]mageIJrl
--~ Fh~hPreYiaJSButtonStyle
--~ F h~ hPreYiaJSButtonText
--~ FhishPreYiaJSButtmType
..ts' C*""rSМe
--~ l-\e.ю:гТеmрlаtе
--~ l-\e.ю:гТехt
--~ r-.Javigationвuttonstyle
..I:'!i' Nav>]a''''Stylo
--~ SideBarButtOnStyle
, -~ SideBarStyle
,,-~ SideBarTemplate
, -~ SkipLriText
,,-~ Starl:f.JavigationTempate
-!'j' StarlJ.JextвuttonI mageUrl
,,-~ StartNextвuttonStyle
, -~ StartNextвuttonText
--!5I StartNextвuttonType
--~ Stepr-.JavigationТеmplatе
--~ Stepr-.Jeхt8uttonImagelJгl
--~ Stepr-.Jeхt8uttonStyIe
--~ Stepr-.Jeхt8uttmТехt
--~ Stepr-.Jeхt8uttmТуре
--~ StepPreYiaJSButtmImageIJrl
--~ StepPreYiaJSButtmStyle
--~ StepPreYiaJSButtOnText
--~ StepPreYiaJSButtOnType
I:'!i' StepSМe

Например , для кнопки StartNext п р и меняются следующие свойства:


в.м. С """,,,в Про,р а ммupoвtJNШ' 110 ASP. N ET

Некоторые свойства для настройки кнопок

Свойство Описание

Задает изображение для


S t a r tNe x tBu t ton I mageU r l б
и зо р ажения-кнопки

Использует стили внешней каскадной


S t a r tNe x tBu t tonS t yle
таблицы стилей CSS
Настраивает текст кнопки и л и
S t a r tNe x tBu t ton Te x t
ссылки

Определяет кнопку; ссылку и л и


S t a r tNe x tBu t ton Type
выбираемое изображение-кнопку

Среди свойств компонента Wiz ard есть общие сти ли, затра rnв ающие
на стро йки всех элементов, а есть ИН Д ИВИдУальные для каждой группы
элемен тов . Следует по м нить , что если одновременно определены те И
д р уги е стили , то конфrlИкта не БУдет, прос то ИН Д ИВИдУальные
пара метры нас тройки п ерео пр ед елят (отме нят) общие стили. В языках
прогр амм иров а ни я используется тот же принцип , переменная

локальной обл асти видиЛ1Ости п ерео пр ед еляет (делает н едоступной) в


текущем блоке кода одноиме нн ую переменную внешней обл асти
видиЛ1Ости.

Ниже при веде ны свойства мастера Wi zard, опред еляющие общие И


ин див и дуал ьны е сти ли его отдельных областей.

С войства Wizard , определяющие ст и л и е го элементов


Ст иль Описание

Наследуется
Wi z ard от класса
ControlSty l e WebControl И применяется ко
всем е го р азделам

Прим е ня ется к разделу верхнего


колонтитула , который будет
отображаться тол ько в то м случае,
Heade r Style
есл и бу,цет задан какой-нибудь
текст в свойстве
Wiz ard . Heade r Te x t
Прим е ня ется к области боковой

'"
В.М. СН"",,,В Про,рйммupoвtJNШ' Na ASP.NET

пан ели с кнопками

Определяет стиль кнопок боковой


SideBarButtonS t yle
пан ели

Применяется к компонентам
S t epSty l e представления, ВЮJюченным в

текущий шаг

Применяется к нижней области


Naviga ti onS t yle шагов , в которых расположены

навигационные кнопки

Применяется ТОЛЬКО к кнопкам


Naviga ti onButtonStyle
навигации в области навигации

Применяется к кнопке Next в


п ервом шаге, если ее ВИДИМОСТЬ
S t artNe x tBu t tonS t yle
задана свойством
StepType=S t art
Применяется к кнопке Next в
пр омежyrочных шагах, если ее
S t epNextBut t onStyle
ВИДИМОСТЬ зада на свойством
StepType=Step
Применяется к кнопке Previous в
пр омежyrочных и последнем
S t epPreviousBu t tonS t yle
шагах, если ее ВИДИМОСТЬ задана

свойством S t epType=Step
Применяется к кнопкам РinisЬ и
. . h. 1 Previous в последнем шаге, если их
FlnlS Prev l ousBu t tonSty е ~
ВИДИМОСТЬ зада на сваиством

StepType=Fin i sh
Применяется к кнопке Са псе! во
всех шагах, если ее видимость
CancelButtonSty l e
задана свойством
Di splayCancelBu t ton=True

Оболочка VlSua! Studio 2005 по зволяет существенно облегчить жизнь


разработчика наличием сред ств автоматизации по настройке типовых
стилей, которых в больши нс тве случаев бу,цет достаточно. Вернемся к
локальной панели задач элемента Wizard, чтобы ОДним махом
ш
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

локальной панели задач элемента Wizard. чтобы одним махом


присвоить типовой стиль н ашей тестовой стра ниц е.

• ~Откройте страни цу WizardСопtrоLаsрх в режиме Design и


выделите объект Wi zardl
• ~Откройте локальн ую панель задач объекта Wizardl , щелкнув
на пиктограмме треугольника в его правом верхнем углу

Wizard Т asks
Auto Foгmat, ,.

Step IДрузья
Add/Remove WizardSteps,
COГNert to StartNavigationT errplate
Convert to StepNa~gatiooTerrplate

Convert to FlrishNavlgationTem~te

Convert to SId=BarTemplate
Ecit т em~tes

• ~ыполните о пци ю Auto Fоппаt и в появившемся диало говом


окне выберите нужный стиль
дuto rormat

SeO"c!a >o:::heme' Previe",


====---.1 .><1
Жизненно важная анкета!

~;'::~:,~~~езиде,нтсамый

Дaneе > I

Окно Auto Fопnat можн о вызвать и через контекстное меню элемен та


Wizard. выполнив одн оимен ную опцию

'"
в м С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

,j!; Cut

i:tI Сору

I~ Paste

Paste Alternate

Х D€l€te

Stye ...

View Code

Vi€w Component Designer

I!), View il Browser

Edit Iтag€

Show Smart Tag

I Auto Format".
I
AddjRemove WizardSteps ...
COIlvert to Starb\JavigatjOllTemplate

COIlvert to StepNavigatjonTemplate

COIlvert to Finsf"Ii\JavigatiOllTemplate

COIlveгt to SideBatTemplate
-

EditTemplate ~

End Template Editing

liJ Re~esh

Ia Propeгties

• ~ы п ол н и те страни цу и убедитесь, что она приобрела


пр офесс и онал ьны й дизай н
В.М. СН"",,,В

§ Эл~менr УnPdВ~Я WlUrd ~i<rosoft Int~~ [хрlor~т


-....;..;

--1.
Про,раммupoвtJNШ' ,ю ASP.NET
..:..IgJ~

Жизненно важная анкета!

поощрения

выбрали:
Д~IУЭ'ЬЯ Похожий на Чингиэ-Хана

~~,:=,~:Ha
6
Луне
0123456769

ре ко мен дуется :

Ус ил енн ая диета + клизьма ззз пер ц ем l

[ < Назад J [ ГОТО80

• ~ роа н ал и зи р уй те дескри пт ор н ое п редставлени е страницы ,


чтоб ы выясни ть, каки е свойст ва дескр ип то р ов стилей позвол и ли
добави ть такую красоту (у ме н я бы такое ни ко гда вручную не
п олучилось!! !)

П роа н ал и зируй т е дескр ип тор н ое п редставле ни е стра н и ц ы, чтобы


в ы яс ни ть, ка ки е свойст ва дескр ип торов стилей п озволили добави ть
такую красоту (у ме н я бы такое ни ко гда вручную не п олуч и лось!! ! )

<HeaderStyle BackColor=''#FFCC66'' Fопt-Воkl='Тruе" Fопt-Size=''O.9еm'' FI


BorderColor=''#FFFBD6'' BorderStyle="Solid" BorderWidth=''2px'' Horiwnt
<SideBarStyle BackColor=''#990000'' Fопt-Size=''O.9еm'' VerticalAlign='Top" 1
<N avigatlonВuttonStyle BackColor='White" BorderColor=''#CC9966'' Border~
BorderWidth="lpx" Font- N ames=''Verdana'' Fопt-Size=''O.8еm'' ForeColor= '
<SideBarButtonStyle ForeColor='White" 1>

Листинг Дескрипторы стиля I добавившие красоту в элемент


Wizard страницы WizаrdСопtrоl.аsрх

в приведе н ном коде каждый дескри п тор настра ив ает свою область
элемен та Wi z a r d . Обрат и те в ни мание, что приведе нны й блок кода
настройки ст илей оболо ч ка доба в ляет в самый конец ко нт ей н е р а
<asp : Wiz a r d></asp : Wiz a r d> , чтобы легче было искать . Если

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

этот блок кода удалить, то мы вер н емся к почти п режнему вариан ту


стилей по умолча ни ю (почти , потому, что может потребоваться
корректировка атрибугов еще в некоторых других местах, например, в
дескрип торе <asp : Wizard> - п осмотр и те сами!).

• u;.;rн алюбовавшись сей красотой, вызови те кон текстное меню для


элемента Wiz ard и выполните кома н ду Auto FопnatlRепюvе
Formatlng, чтобы вернугься на грешную Землю к сти лям по
умолчанию

Шабло ны элемента Wizard

Если с помощью свойств-стилей н ам н е Удается доб и ться желаемого


эфректа , то можн о воспользоват ь ся свойствами-шаблонами. Ниже
п риведен полный список шабло н ов элемента управле ни я Wiz ard,
выбранный как свойства из п анели Object Browser

ObJect Browser .... ~ х

Browse : АI CompOllents •
System.Web.UI.WebCono-о •. \ • , ~ HeaderSty1e

'" ~ System.Web.uJ.WebConO-О •. Wiшd


'G!i' HeaderTemplate
i.",~ HeaderText

Шаблоны элеме н та управления Wizard


Шабло н или дескриптор О п исание

Определяет содержимое области


HeaderTemplate
верхнего колонтитула

Определяет боковую панель,


SideBarTemplate которая обыч н о включ ает ссылки
навигации для каждого шага

Определяет кно п ку навигации для


перво го ша га , если ее видимость
StartNavigationTemplate
задана свойством
StepType=Start
Определяет кно п ки навигации в

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

промеЖУГОЧНblХ и последнем
S t epNav i gationTemplate
шагах, если их видимость задана

СВОЙСТВОМ StepType=Step
Определяет кнопку навигации Firllsh
. . h .. 1 для последнего шага , если ее
FlnlS NavlgatlonTemp ate ~
ВИДИМОСТЬ задана СВОИСТВОМ

StepType=Fini sh

Формирование шаблона <HeaderTemplate>

ДеСКРИПТОРНblЙ блок первого шаблона добавляется опцией Edit


Templates через локальную панель задач , либо опцией Edit Template через
контекстное меню элемента Wizard (одна и та же команда в раЗНblХ
местах по разному наЗblвается - Большой Билл тоже человек!).

Wizard Tasks
Auto Format ...

Step I Друзья ~I
Add/Rermve Wizck-dStерs ...

Convert to Staгtt'Jav~аt:ioп Т emplate

Сопvегt to StepNavlgabonTemp~te

Сопvегt to Fil~hNalkJаtioпТеm~аtе
Сопvегt to SideВErTerrplate

Edit Те rmlates
в м СН"",,,В Про,раммupoвtJNШ' NQ ASP.NET
~, ш W"u .... JcoпIrol.m.p х.. • Х

.. "'"
~

~ Pacte
~,

повокшага:

нт самый лучший?
""
Pacte !.Jf<м:e

Х
\3
Do!I;\i'

st'y4o" ,
у~",с ш Д"'"'~O>
I
Y~"'C~tc..~

l!I Y~",,, [\'"о",,"г

r' • Ie "'7"

Sho1o' Smdlt Tag


Auto FCfma!",
Md ,~ e", o ye \\.\ZordStEp" "
CC<"Nert \0 S Ш1:J'.lavlg01КIlТ€ rrра::е

~! \0 s t<pNa"9ЖOl1Т~ tе

CC<"Ner! to F ~уqжaтrещ::t;te

Coпv ег t to Sde!!<>"Te rrph


E (]IТ ' ,"

Е'J~"гг~ч_еЫJ"
• ~T" ~
SIJ~~ te

[i] Рйс:h St.Yt!-1J"9->"'tonТ" " "to


l.iiII Рщ::..r~, s tе;:N,,1;рЖ<l1 отр ет

Fn$m"'1]aXn re", DOCe

• ~ режиме Dеsigп выполните командУ Edit TemplatelНeader


Template контекстного ме н ю для элемента управления Wi z a r d
страницы WizardControlaspx
• ~ появившемся окне введ ите текст верхнего колонтитуЛ Q "
Эт о заголовок шага: " (или л юбую другую Абру- Кадабру; лишь-бы
заготовка шаблона созд алась , все равно потом руками
редакти ровать) , после че го щелкните н а опции End Template Editing
локальной п ан ели задач, чтобы завершит ь созда ние шаблона
заголовка и вернугься в редактор Design

V\f\zaroXontrol.aspx,cs WlzardControl.aspx*
""""""""""""""""""Ш
г Wizard Tasks
izard 1 - HeaderTemplate
Template EditJng fVIode
Г\ead€rTemplate
Dsplay
Это заголовок шага:
Еnd Т enWte Ediln;i

т.
--------------------------------------------

'"
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Если ни чего в п оле т екста не ввести, то после выхода п о опции End


Template Editing дескр иптор <Heade rTe mpla t e> создан не будет.

• ~ ерейдите на страни це в режим Sошсе, найдите в конце блока


кода созданный оболочкой дескри п тор <Heade r Temp l ate> и
отредактируйте е го так

<HeaderTemplate >
<Ы >
Э то заголовок шага:
<%= Wizard1.ActiveStep.1ide %>
</h1>
< lНеаdеrТеmрlatе >

Листинг Код десхриптора шаблона заголовха элемента Wizard

Получается , что мы шаблон заголовка должны за п ол н ять вручную как


обычный НТМL -текст. Эта возможн ость оставлена в силу ее простоты
(" уж НТМL-то они должны з на ть!", опрометчиво п одумал Большой
Билл). И для тренировки мы сами вставили в этот НТМL -код
опе р аторный исполнимый блок
<%= имя переменной ИЛ И вы ра ж ение%> . Это обычный пр ием ,
п риме н яемый, например , в РНР. При исполнени и страницы вместо
это го блока в статический текст БУдет подставле н о значение указа нн ой
п еременной и ли выражения. Таких блоков в статическом НТМL -коде
страницы мы можем наставить, сколько угодн о . В нашем примере в
указа нн ом месте БУдет подставляться значение атрибуга Тi t 1е
текущего шага , которые мы деЮJa р ативно определили ра н ее пр и

формирова нии шагов элеме н та Wi z а rd .

• г;.:.=и сполните страницу и вы увидите работу шаблона заголовка в


действии

Обратите внимание , что хоть ранее мы и задали в панел и Properties


з н ач ен ие за головка в свойстве Неаdе r Те х t= " Жи зненно важная
ан ке та! " элемен та Wizard (этот атрибуг и сейчас там
п рисугствует), но как только мы добавили дескриптор шаблона
за головка, оболочка сразу же скрыла это свойство в панели Properties.
Отображаться тепер ь БУдет именно заголовок шаблона.
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Формирование остальных шаблонов

Все оставшиеся шаблоны областей элемента Wiz a r d разрешают


пользоваться Удобствами среды в силу их сложности. Чтобы создать
тр ебуемый дескр иптор шаблона, нужно выполнить соответствующую
команду Convert to ... (в контекстном меню элемента Wiz a r d или его
локальной панели). После этого можно приступать к редактированию
созданного шаблона, выполнив опцию Edit Template (опять вставлю те
же самые снимки. Физически они занима ют на дис ке одно место , а
отображаться броузером MOryr хоть в ста местах)

Wizard Tasks
Auto Format ...
Step I Друзья

Add/Remove WIZE<dSteps ..
Convert to StartNav'9аtюпТеmрзtе

Сопvегt to StepNavigationTemplate
Сопvегt to Fi1ishNavigаtioпТеmраtе

Convert to 5ЮеВагТеmplаtе

Edit Те rmlates
в м
, _". СН"",,,В

Ш W"u .... JcoпIrol.m.p х·


Про,раммupoвtJNШ' NQ ASP.NET
• Х

.. "'"
~

~ Pacte
~,

повокшага:

нт самый лучший?
""
Pacte !.Jf<м:e

Х
\3
Do!I;\i'

st'y4o" ,

У~"'С Ш
Д"'"'~O>
I
y~", Ce>rrpmmt c..~

l!I y~",,, [\'"о",,"г

r' • Ie "'7"

Sho1o' Smdlt Tag

Auto FCfma!",

Aad ,~ e"' O ye \\.\ZordStEp" "


CC<"Nert \0 S Ш1:f\lavlg01КIlТ€ rrра::е

~! \0 s t<pNa"9ЖOl1Тeщ:>ii; tе

CC<"Ner! to F ~уqжaтrещ::t;te

Coпv ег t to Sde!!<>"Te rrph


E (]IТ ' ,"

Е'J~"гг~ч_е Ы J"
• ~T" ~
SIJ~~ te

[i] Рйс:h S ty1N'J ~"t OnТoo-p:gto

l.iiII Рщ::..r~, s tе;:N,,1;рЖ<l1 отр ет

Fn$m"'1]aXn re", DOCe

Команда Edit Template вызывает окно редактора шаблонов , в рабочей


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

у Wiz"dCono-u,asрх,сs / WizardControl,a5px* I I
~jzard 1 - SideB-аrТеmрlаtе

SideBarTemplate
i
ISldeВarTemplate - Cl,ck to s!art eciting, I

Завершение редактирования осуществляется командой End Template


Editing ко н текстно го меню и ли локальн ой панели
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Wiza-dСonUоl,asрх.сS WizardControl.aspx*
~~~~~~~~~~~Ш
izardl- SideBarTemplate Wizard Т asks
ТеЩ)lаtе Eclmg Mode
SideBarTemplate

• End Т еЩ)Lзtе Edibr>;)

~ Cut

Сору

Paste

Paste Altегn.зtе

Х Delete

Style ...
View Code

VI€W Component De3igner

~ View in Browser

Edit Image

0 Show Smaгt Tag

EditTemplate ~

I End Tempate Ecimg

[i] Re~esh

~ Properoes

Обратите в ни мание , что как только какой-то И З шабло н ов создан , то в


меню соответствующая коман да ме н яется с Co nver to .. ., на Reset.. .
Выполнение команды Reset. .. начисто удаляет дескр ипторы
соответствующего шаблона. Дескр ипторы любо го шаблона можно
удалить и вруч н ую в режиме Source, но для шаблон а заголовка это
можно сделать только вручную.
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Wizard Tasks
Auto Format ...

Step I Друзья ElI


Add/Rermve Wizз-dStерs ...
COГNert to StartNav~at:ionTemplate

Сопvегt to StepNavlgabonTemp~te

Сопvегt to Fil~hNa~аtЮпТеm~аtе

Reset SЮеВаг Те roolate


Edit Те rтplates

• г;.:.='Добавьте к элемен ту Wi zard шаблон


<SideBarTemp l ate> и через п анель Properties задай те ему
свойство ItemSty l eIBorderStyle="Outset "
• ~ернитесь в режим Design и убедитесь, что кно п ки боковой
панели стали выпуклые

WI:lз- dContrd.aspx.cs WizardControi.aspx* ~ Х

о, ~
I!p Это заголовок шага:
l' Друзья
I , Тm изм Какой президент самый лучший?
I ' Встыечи
rн аш Пути н :.:J
I , .!illY!:
Дал е е> ]
I !
• ~ыполните ст р аницу, все должно работат ь

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

и все же , давайте вернемся к той красоте , которую мы получали для


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP. N ET

этой страницы применением стандартных стилей .

• ~далите шаблон <S i deBar Templa t e> , выполнив в режи ме


Dе sigп коман ду Reset SideBarTemplat контекстного меню элемен та
Wi z а r d , и выберите красивый стандартный стиль через опцию
Auto Fопnat того же меню

~ Элемент управления Wlzard MICrosoft Internet Explorer _ --"-,,,10 I~


FIe Б1t Vfew Favcrites TooIs НеР ;;;'0 - " '- - - _ _ _ _ _
.... Back ... ..... 10 ffJ ~ ' ~ Seif"ch !lJ Favcrites 'G' Мeda () ' ~ ... t.J G! ЪJ .,. О
Addess 11) htlpJ!ocahJst: lZ-З8/WеЬSitе5/W~юХооtпiaspх

кой президент самый лучший?

I Далее>

ГГГ ~ LОС3 Iltrюеt

т
(

'"
в.м. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Программирование уровня приложения ASP.NET


Файл приложения GlobaLasax. Заготовки методов масса пр иложения с
пр едо пр еделенными именами. Демонстрация собы ти й приложения.
Демо нстрация перехвата необработанного события .

Файлы к лекции Вы можете скачать здесь скачать:

httр :l/оkl.iпtШ. ruld ераrtmeпtJiпtеmеtJр rasp netJ8/08 _ We bS ке Sx.zip

Виртуальный каталог, который мы создаем в самом начале разработки


сай та, при исполнении страниц ассоциируется с отдельным
при ложением. Приложение является отдельной пр о грамм н ой
единицей , изолированной при исполнении от страниц других
виртуальных каталогов. Все, что находится в виртуальном катало ге ,
относится к при ложению .

Исполняемое средой ASP.NET приложение на зывается доменом (по


аналогии с процессом при исполнении при ложения локально го стола) .
В отличие от локальных приложений, конечный пользователь никогда
н е запускает приложение ASP.NET напрямую. Он за п ускает броузер на
своем локальном ком пьютере и за пр ашивает определенный URL . Этот
запрос получет Web-сервер и передает е го среде исполнения ASP.NET
(рабочему процессу) , которая выделяет в па мяти доме н для
виртуального каталога и загружает в него код адресуемой стр ан ицы .
Таким об р азом, домен прuложенuя создается рабочим процессом пр и
п ервом за пр осе любой ст р аницы или Web-службы виртуального
каталога.

Web-страницы и Web-службы одно го в иртуально го катало га


выполняются в одн ом и том же домене . Содержимое другого
виртуального каталога выполняется в своем домене . Выполнение
при ложений из разных виртуальны х каталогов в отдельных
изолированных доменах гарантирует, что одн о приложение не сможет

оказывать влияние на работу другого, в том числе видеть его данные ,


хранящиеся в операти вной памяти. За этим строго следит общеязыковая
среда выполнения CLR.

Все Web-ст р аницы или Web-службы совместн о используют одни и те


же ресурсы, которые недоступны другим пр иложениям .
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Конфигурационные настройки среды исполнения, п омещенные в файл


Web.config виртуального каталога приложения , действуют только в
пр еделах этого приложения. Ст р аницы, требующие еще более
индивидуальных настроек, MOryr быть помещены в подкатало ги со
своими файлами Web.config.

Приложение может состоять из следующих компонентов:

1. Web-страницы (файлы .aspx) - основные рабочие еди ницы любого


приложе ния

2. Web-службы (файлы .asmx) - выполняют полезную работу для


сторонних при ложений
з. Файлы отделенного кода (.cs) - содержат исполнимый код для
пр о гра ммно го управления объектами, определяемыми в
интерфейсной части страницы
4. Конфигурационные файлы (Web.config) - содержат настройки
среды исполнения (рабочею процесса) как для всего при ложения
в целом, так и для групп страниц, расположенных в подкаталогах
виртуального катало га

s. Файл событий приложения (G/oba/.asax) - содержит обработчики


событий , которые реагируют на глобальные события самого
приложе ния

б. ДрYJl1е компоненты: базы данных, п ользовательски е элементы


управления, отдельные сборки, каскадные таблицы стилей ,
ри сунки, ХМL-файлы и т.д.

ASP.NET периодически п ерезапускает при ложение в другом домене для


освобождения неиспользуемых ресурсов (говорят, что при ложение
п ереходи т в новый доме н ). При этом старый доме н будет работать до
тех пор , пока не будуг обработаны все запросы клиен тов, стоящие в
очереди. То же самое пр оисходит и при заме н е разработчиком
содержимого страниц и конфигурационных файлов. Среда
обнаруживает новы е изменения , создает для модифицированного
при ложения новую сборку и запускает ее в нов ом домене , выполняя его
од новрем е нно со старым немодифицированным. И з-за того, что CLR
всегда блокирует файлы сборок при выполнении при ложения, перед
созданием нового домена она автоматически создает для него копии

файлов сборок в каталоге


В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

с :\[Каталог_ Windоws]\Мk:rosоft.NЕ1\[Версия]\Теmрогагу ASP.N ЕТ Files

При создании домена приложение может создавать в нем не один


эюемпляр объектов приложения , а целый пул , содержащий от 1 до 100
эюемпляров , в зависимости от масштабируеЛ1Ости (количества)
запросов. Каждый новый запрос от одного и того же клиента может
адресоваться к разным эюемплярам п ул а домена.

Файл приложения Global.asax

Файл GlobaLasax является необязательным для приложения. Но если он


присугствует, то долже н быть единственным и находи ться в корне
виртуального каталога приложения. Э тот файл включает в себя
обработчики событий уровня приложения , которые выполняются
автоматически в ответ на происходящие с приложением события. Код
обработчиков пишется точно также , как и исполняемый С #- код
обычной страницы .aspx и не должен содержать никаких дескрипторов.

Любое приложение является экземпляром класса , на следую щего класс


HttpAppl i cation . Код файла GlobaLasax является неявным
расширением этого базового класса и будет иметь доступ ко всем его
свойствам и методам. В этом файле мы можем заполнить заготовки
методов с предопределенными именами , а также создать обработчики
на интересующие нас события уровня приложения. Все они долж ны
иметь одинаковую си гнатуру, определенную делегатом

public delegate void Sys tem.Eve ntНa nd ler(objec t sender, System.EventArgs е)

Заготовки методов класса приложения с

предопределенными именами

Объект приложения создается автоматически, поэтому мы не можем


сами регистрировать некоторые обработчики , присваивая им
прои зв ольные имена. Как и в случае с эюемпляром класса Page, мы
можем использовать только предопр еделе нны е имена обработчиков
приложения.
В.М. С""",,,в Про,раммupoвtJNШ' 110 ASP.NET

Базовый масс HttpAppl i cation имеет ряд собы тий, которые


срабаты вают при определенных условиях и в определе нн ой
последовательности. Большая часть этих событий связан а с запросом .
На