Sunteți pe pagina 1din 19

Active Server Page - ASP.

NET
Concepte de baz Dinamicitatea paginilor web paginile statice se mai numesc i pagini HTML, cci nu conin alt tip de cod dect cel scris n HTML; coninutul unei pagini nu variaz n timp sau de la un utilizator la altul ; toi vd la fel, fr informaii specifice contextului rulrii; coninutul este fixat i cunoscut nainte de lansarea cererii ctre pagina respectiv. securitate redus, cci codul este vi!i"il din "ro#ser, cu !iew " #ource. $entru a reflecta c%estiuni legate de un context & de exemplu afiarea orei exacte, sau pentru adaptarea coninutului paginii la profilul utili!atorului care solicit pagina %tml ' pagina ar tre"ui compus abia dup ce s$a naintat cererea din partea unui client. paginile dinamice sunt cele configurate a"ia la momentul execuiei, n funcie de context i de resursele disponi"ile pe calculatorul de pe care se lansea! cererea; de o"icei aceste pagini au i un nivel nalt de interactivitate. $entru a reali!a dinamicitatea, tre"uie scris cod surs care se rulea! la momentul lansrii unei cereri i care prin rulare stabile te coninutul ce va fi afi at n pagin; tre"uie avut ns n vedere n ce lim"a( este scris acest cod, cine nelege i poate prelucra acest cod.

Dinamicitate client$side) codul surs HTML este mixat cu instruciuni de compunere a paginii &ntr un lim"a( script, u!ual %ava#cript sau !&#cript'; pagina e creat dinamic de ctre browser, la momentul solicitrii ei; gradul de dinamicitate depinde de capacitile "ro#ser ului &Internet Explorer, Netscape Navigator, Opera); script ul este vi!i"il n "ro#ser &!iew " #ource' ceea ce nu e tocmai "ine. *e poate folosi acest tip de dinamicitate eventual n 'ntranet, unde tim ce se afl instalat pe maini i cunoatem gradul de securitate ce tre"uie asigurat. Dinamicitate server$side) codul surs HTML este mixat cu instruciuni de compunere a paginii, scrise n diverse limba(e de programare i interpretate de un soft din sever$ul unde se afl pagina solicitat. $agina este compus tot dinamic) dar n server , la momentul solicitrii ei de la distan, de ctre un client. $agina circul tot ca stream HTML; mai precis, n modul de prelucrare server, ctre client n reea circul doar rezultatul prelucrrii paginii, nu i instruciunile de prelucrare. +e asemenea, o parte din codul de prelucrare a paginii poate fi precompilat, iar la momentul solicitrii paginii el este doar rulat, ceea ce poate mri considera"il performana accesului. Tipologia dinamicitii, 0lient sau *erver, se deduce n funcie de cine procesea! cererea) un modul specializat din browser sau un software din server.

*eb server , este un soft#are care) gestionea! spaiul pentru site uri i paginile -e" ale acestora; ascult pe un port &u!ual ./', interceptea! cererile i asigur regsirea i disponi"ilitatea paginilor de pe un site aflat n gestiunea sa. Te+nologia C,' - Common ,atewa. 'nterface /vanta(e) acces la resursele sistemului de operare; vite! "un de execuie, dac aplicaia 012 este de(a compilat Dezavanta(e) depanare dificil; se execut n proces separat, consumnd multe resurse.
3../3.3/45

Te+nologia /#0123T Modelul disponi"ili!at su" 123T de ctre Microsoft pentru aplicaiile accesi"ile din 2nternet este denumit pe scurt /#0123T 4/ctive #erver 0age5 i are urmtoarele caracteristici principale) se "a!ea! pe formulare -e" & -e" 6orms' i separ logica prezentrii de logica de business; furni!ea! controale de server ce recunosc evenimente la nivel de server, dar sunt redate ca HTML, pentru a fi recunoscute i tratate de orice "ro#ser; asigur accesul la date prin mecanismul /D6123T; permite caching pentru date i pentru salvarea strii unui client, pe server, pe calculatorul client sau pe servere #7L specializate. /vanta(e /#0 este o te%nologie orientat o"iect pentru de!voltare rapid de aplicaii; elementele HTT$ sunt tratate tot o"iectual; lucrea! cu pagini compilate, nu interpretate pas cu pas; recompilarea se face doar c8nd este nevoie; permite accesul la toate clasele din .78T, clase care pot ndeplini sarcini complexe; asigur securitatea prin mecanisme forms-based i Passport authentication; tratea! fiiere 9ML, inclusiv pentru reconfigurri, fr a necesita restartarea server ului; ofer extensi"ilitate prin crearea i integrarea de noi componente sau nlocuirea unora existente. 'nstalarea componentelor web$server i stabilirea legturii cu /#0123T

Directorul fizic c:\inetpub\wwwroot; Director virtual , :irtual +irector;, este o legtur ctre un alt director aflat fi!ic n afara ar"orelui site ului -e".

3../3.3/45

ne introduce n fereastra 22* coninnd lista site urilor din evidena serverului -e" & +efault -e" *ite, plus altele '. Tre"uie ca 22* s fie ns instalat. +ac nu e startat 22* l putem starta < restarta de aici) selectat +efault -e" *ite < *top < *tart < =estart 22*; nu necesit restartarea calculatorului. > alt modalitate de a a(unge n fereastra de startare 22*) C9:*indows:#.stem;<:inetsrv:'netMgr1exe= se pot sta"ili drepturi i interdicii pe diverse servicii ale 22*. ?dugare director virtual) Default *eb #ite " buton dreapta mouse " 2ew !irtual Director. ; aplicaiile create cu :isual *tudio "eneficia! de propriul director virtual, creat odat cu aplicaia; cele create cu :isual *tudio pot rula i n afara 22*, su" un server #e" de de!voltare &integrat'; ele vor fi aduse la finali!are &deplo;ment' ntr un director virtual, fiind nregistrate n meta"a!a 22*, pentru ca site ul s fie vi!i"il i din afara aplicaiei.

0ontrol $anel < ?dministrative Tools < 0omputer Management < *ervices A ?pps < 22* < -e" *ites < +efault -e" *ite cu clicB mouse dreapta < $roperties se poate sc%im"a portul prin care se comunic cu serverul) T0$ 0ort > ?@ sau ?A.

3../3.3/45

+ac pe calculator se dispune de mai multe plci de reea pot exista mai multe Local ?rea 0onnection &*tart < 0ontrol $anel < 7et#orB and +ialFp 0onnection'; ele pot avea setri diferite. *e pot pune mai multe adrese 2$ c%iar pe aceeai conexiune. > adres 2$ poate avea i pseudonim) n registru +7*, pe serverul de reea; local, n c:\winnt\system32\drivers\etc\hosts ca text)
38.25.63.10 www.cev .ro

+ificultatea reali!rii unor pagini #e" coninnd date stocate n C+ pe internet const n faptul c tre"uie corelate trei componente) #erver *eb $ ''# Microsoft) pentru stocarea i regsirea paginilor; !isual #tudio 123T /#0123T) ca mediu de programare pentru crearea paginilor; #erver de &D $ #7L #erver) pentru gestiunea datelor. Creare site *eb Dn fereastra 22* cu "uton dreapta mouse pe calculatorul dorit, se alege 2ew " *eb site i se indic adresa de 2$ nregistrat mai sus, plus drepturile de acces. La ncercarea de conectare de la distan) fie se afiea! directoarele din site &opiunea Directory Browsing activ'; fie se pred controlul unui document implicit &Default Document activat'.

0ele dou opiuni se controlea! din consola 22*& ta" urile +efault documents i +irector; "ro#sing'; tre"uie creat ns una din paginile) default.%tm, default.asp, default1aspx) index1+tm etc1 Mixarea informaiilor ntr$o pagin web > pagin -e" poate conine) cod +tml, recunoscut de orice "ro#ser; cod ntr un limba( de programare recunoscut de ctre serverul care ine pagina -e"; cod script ntr un lim"a( de tip script, recunoscut de ma(oritatea "ro#serelor & Eava*cript, :C *cript fiind cele mai rspndite lim"a(e de tip script'. Modul n care se mixea! aceste trei tipuri de cod complic oarecum nelegerea lucrurilor, dar este foarte important pentru c el d ordinea n care se afiea! diferitele informaii n pagin. +in punctul nostru de vedere, reinem dou dintre tag urile care introduc cod scris ntr un alt lim"a( dect %tml) seciunea de cod
<script language="C#" runat="server"> cod C# </script>

seciunea de folosire a codului


<% // apel cod C %>

+e o"icei punem codul propriu !is n prima parte a paginii, iar apelul codului &partea de pre!entare ' n interior, acolo unde dorim s apar efectul rulrii, n pagin.

3../3.3/45

F!ual, se practic i gruparea ntregului cod n fiier separat, te%nic denumit Gcode "e%indG; la nceputul paginii se indic numele fiierului coninnd codul, iar n interiorul paginii se trece apelul codului, ce va genera ca re!ultat pre!entarea paginii.
!"# $age %anguage&'c ' !rc"#$is.cs#%> !" // apel cod C "(

0teva exemple complete vor clarifica cele discutate mai sus. 3xemplu % t &r ) sp' Dinamicitate server$side 0u un editor de text se introduce secvena de mai (os, ntr un fiier % t &r ) sp' plasat n c:\inetpub\wwwroot & tipul sp' este o"ligatoriu pentru a identifica programul care l tratea!')
!*tml( !script runat&'server' language&'c '( !/script( !" +esponse)Output),rite- .ystem)Date/ime)Now)/o.tring-))0 "( !/*tml(

i se apelea! din 2nternet 8xplorer su" forma *ttp1//local*ost/% t &r )aspx0 ea va afia data i ora exact. >"servm c avem doar cod de redare, nu i cod propriu !is; "locul script este gol n acest ca! i se pune doar pentru a preciza limba(ul n care este scris codul de redare, lucru care s ar fi putut da i n directiva de pagin. $agina #e" de mai sus exemplific i tipologia de dinamicitate server side, deoarece programul arat alt coninut n funcie de momentul solicitrii paginii; serverul este responsa"il n acest ca!, cu extragerea i afiarea orei exacte. +ac nu dispunem de serverul de #e" 22* instalat, putem starta serverul de #e" de su" :isual *tudio rulnd o aplicaie oarecare; ct timp serverul de de!voltare e activ, modificm n linia de adres din "ro#ser doar numele fiierului ce conine pagina &spre ex. default)aspx, cu % t &r ) sp') cu condiia ca fi ierul s fi fost plasat n acela i director cu aplicaia care a startat serverul, cci serverul vede directorul aplicaiei ca pe un director virtual 51 6bservaie1 #ave Target as111 din "ro#ser salvea! pagina aa cum arat ea prelucrat &tradus n %tml'; n consecin, fiierul salvat cu #ave Target as... la rularea paginii, cu extensia +tml, n wwwroot) va afia la un nou apel n "ro#ser, mereu aceea i or H $entru fiierul iniial, ce conine codul de prelucrare, extensia fiierului tre"uie s fie aspx, pentru a anuna serverul cui s o pase!e pentru prelucrare, deoarece acest tip de fiier conine nu forma prelucrat a paginii, ci instruciunile de prelucrare H 3xemplu % t &r (!.htm) Dinamicitate client$side 0u un editor de text se introduce secvena de mai (os, ntr un fiier numit % t &r (!*)htm) plasat n c:\inetpub\wwwroot & tipul htm) ne indic faptul c pagina poate fi prelucrat direct de ctre browser')
!*tml( !script language&'2ava.cript'( document)write- ' !3( %in micit te c)ient side: !/3(' )0 a4i & new Date-)0 document)write- a4i)getDate-),'/ ',a4i)get5ont*-)67, '/ ', a4i)get8ear-), ' ',a4i)get9ours-),'1', a4i)get5inutes-),'1', a4i)get.econds-) )0 !/script( !/*tml(

?ceast pagin reali!ea! aproximativ acelai lucru ca n exemplul anterior, dar responsa"il cu aceast sarcin este de data aceasta browser$ul cu care un client navig+eaz pe aceast pagin;
3../3.3/45

aadar "ro#ser ul clientului este cel care interpretea! script ul Eava i l execut, apoi afiea! re!ultatul. >ra afiat va fi cea de pe calculatorul clientului, nu cea din server; presupunnd c am"ele ceasuri arat "ine ora exact, cele dou exemple de mai sus vor afia ore diferite, dac server ul se afl pe un alt fus orar dect clientulH 3xemplu $uncti . sp' Dn acest exemplu vom avea am"ele categorii de cod) n prima parte se pre!int codul unei funcii, iar n interiorul paginii se pune codul de vi!uali!are, care apelea! aceast funcie i afiea! ptratele re!ultate prin rularea funciei.
<script run t"#server#> doub)e * tr te+doub)e nr, - return +nr,.+nr,/ 0 <1script> !*tml( !*:( $atratele primelor 7; numere naturale !/*:( !ta3le 3order&'<:<'( !tr( !t*( Numarul !/t*(!t*( $atratul !/t*( !/tr( !" $or +doub)e i " 1.0/ i<"10.0/ i22, 3esponse.&utput.4rite+ #<tr><td>-00<1td><td># 2 #-1:$0<1td><tr>#5 i5 * tr te+i,,/ 0 "( !/ta3le( !/*tml( $agina se apelea! n "ro#ser su" forma *ttp1//local*ost/functia)aspx

=eiese c funcia & n general, codul din "locul script ' nu este activat dect n momentul cnd este solicitat de un eveniment sau de ctre un alt cod executabil) pus n partea de redare <% %>) Dn exemplul nostru, apelul * tr te+i, invoc partea de cod din "locul script. =eamintim c la client a(unge pagina de(a prelucrat, astfel nct dac n "ro#ser cerem din meniu !iew " #ource, vedem ptratele de(a calculate, "ro#ser ul doar afindu le. 7epreci!nd runat&'server' se presupune c se execut implicit n "ro#ser. Bntr$o pagin se poate pune cod scris doar ntr$un singur limba() n cazul nostru CC1 *ensul codului de redare de mai sus este urmtorul) o"iectul pagin are proprietatea +esponse care este o referin la un o"iect HTML de tip +esponse, ce conine rspunsul dat de server la solicitarea unei pagini de ctre un client. >"iectul +esponse recunoate metodele 3esponse.4rite+, i 3esponse.&utput.4rite+, cu care putem aduga linii n rspunsul returnat clientului; 3esponse.&utput.4rite+, permite c%iar i scrierea de text formatat, pe care un "ro#ser tie s l interprete!e. > alt variant ar fi s punem funcia ntr un fier separat, pe care s l citm n clau!a !rc"#$is.cs#, lsnd n pagin doar partea de apel i de redare pagin . Dn am"ele variante codul surs se compilea! la momentul cererii paginii; vom vedea n continuare c o alternativ mai eficient este s precompilm codul, mrind astfel vite!a de rspuns la o cerere. ?*$.78T ofer alternativa o"iectual pentru crearea i accesul la paginile -e". +ocumentul %tml este mpac%etat ntr un o"iect de clas ,e3=orm7 sau >Default, derivat din clasa $age. 0eea ce este cuprins ntre !script runat&'server' language&'c '( i !/script( se include n aceast clas, iar ceea ce se specific ntre !" i "( poate fi imaginat ca o parte dintr$o funcie 3ender+, a clasei derivat din clasa $age. =eiese c ntre !script( i !/script( putem include funcii, pe cnd ntre !" i "( nu dm dect elemente specifice redrii paginii -e", neputnd defini alte funcii n interiorul unei funcii & adic n funcia 3ender+, 5.
3../3.3/45

Fn exemplu n care codul mixat ntr o pagin #e" nu este apelat explicit din !ona de redare, ci implicit, pe baz de eveniment semnalat la nivel de pagin & evenimentul * 6e78o d ' ar fi urmtorul) 3xemplu bd* 6e. sp'
!"# import Namespace&'.ystem)Data' "( !"# import Namespace&'.ystem)Data)OleD3' "( !script language&'c ' runat&'server'( private void * 6e78o d-o32ect sender, .ystem)Event?rgs e) @ string str.Al & '.E%EC/ codp, denum, pret =+O5 produse'0 OleD3Connection con & new OleD3Connection-#'*rovider"9icroso$t.(et.&8:%;.<.0/% t # 2 # !ource"=:\prod.mdb')0 try @con)Open-)0 B catc*-Exception ex) @mesa2e)/ext &'Eroare open conexiune'6ex)5essage0B OleD3Command myCmd & new OleD3Command-str.Al,con)0

OleD3Data+eader dr & myCmd)Execute+eader-)0 w*ile -dr)+ead-)) @ mesa2e)/ext6&'CrCn'6drD'codp'E6 ' ' 6 drD'denum'E6 ' ' 6 drD'pret'E0 mesa2e)/ext6&'CrCn'0 B dr)Close-)0 con)Close-)0 B !/script( !*tml( !3ody( !form id&'=orm7' met*od&'post' runat&'server'( !*F( Interogare BD folosind un o3iect Data+eader !/*F( !asp1/extBox id&'mesa2e' runat&'server' /ext5ode&'5ulti%ine'( !/asp1/extBox( !*F( End Interogare BD !/*F( !/form( !/3ody( !/*tml( *e rulea! dnd n linia de adres a "ro#ser ului *ttp1//local*ost/bd* 6e. sp'/ tre"uie doar s ne asigurm c exist fiierul =:\prod.mdb coninnd o "a! de date ?ccess, cu ta"ela produse i cmpurile) codp, denum i pret.

$regtirea paginii se face tot pe server; o pro"lem care apare aici este cum va cltori informaia extras de pe server & spre exemplu, dintr o "a! de date' pn la client, pentru vi!uali!are n "ro#ser. $utem defini o varia"il la nivelul paginii, string str+e4ultat0 ea este recunoscut i de funcia +ender-), dar i pierde coninutul ntre dou cereri succesive. $utem apela la un control de tip /extBox, care va transporta informaia n proprietatea sa numit /ext, folosit drept container; acesta este mecanismul pentru care s a optat n exemplul de mai sus, rolul de container avndu l TextCox ul mesa2e) La ncrcarea paginii n server, se lansea! evenimentul $age>%oad, care apelea! implicit funcia de tratare cu acelai nume, moment n care se accesea! "a!a de date i se adaug informaia, linie cu linie, n textCox; Dn rest, dup cum se poate o"serva, lucru cu o"iecte .78T este cel u!ual, c%iar cnd e vor"a de o"iecte pentru acces la "a!e de date. Web Forms controls desemnea! server controls
3../3.3/45

Crearea unei aplicaii *eb folosind !isual #tudio *u" .78T, Dile " 2ew " *eb #ites < /#0123T *eb #ite i se alege un nume de aplicaie i ca locali!are se alege Dile #.stem0 pentru a se putea lucra rapid, cel puin pentru fa!a de reali!are i depanare a aplicaiei este prefera"il aceast locali!are. Localizarea site ului pe care se lucrea! se poate face alegnd una din opiunile) Dile #.stem - dac se experimentea! pe un site creat provi!oriu ntr un director local sau de pe un alt calculator din reea expus ca parta(a"il &s%ared'. *e poate crea i un director nou, folosind icon ul Create New Folder sau pur i simplu adugnd numele noului director, n finalul unei ci de acces de(a selectat. =ularea se face ntr un server de #e" de testare, numit /#0123T Development #erver i folosete un port, ales ad%oc, nu pe cel folosit de ''#; avem avanta(ul c putem muta directorul, cci el nu e luat n evidena 22* &meta"a!a 22*' ca director virtual i nu e accesi"il din 2nternet. Local ''# , dac dorim ca site ul s se afle ntr un director virtual recunoscut de server ul de #e" local &''#'. 0u icon ul din colul dreapta sus Create New Web Application se poate crea c%iar acum un nou director virtual. DT0 #ite cnd lucrm pe un site la distan & su" alt 22*, dect cel local ' i l accesm prin 6T$, furni!nd informaiile de conectare &FTP site, port, director, user, password'. Eemote *eb #erver cnd lucrm pe un site la distan i l accesm prin protocolul HTT$, furni!nd F=L &uniform resource locator'; n acest ca! este nevoie s avem instalate extensiile 6ront$age; la conectare vom furni!a user i password.

*pre deose"ire de -indo#s 6orms, aplicaiile -e" au fereastra de vi!uali!are grafic &+esigner' cu mai multe formate de vi!uali!are, accesi"ile prin comutatorii din (osul paginii) Design !iew , vi!uali!area grafic a controalelor din pagin, care permite lucru n regim grafic; controlele din ToolCox vor fi selectate din ta" ul -e" 6orms, nu din -indo#s 6orms.

3../3.3/45

#ource !iew , vi!uali!are n format HTML a codului ce integrea! formularul -e". *e o"serv aici descrierea %tml aferent controalelor adugate vi!ual pe form. =ularea paginii de su" :isual *tudio declansea! activarea unui /#0 Development #erver, folosind cte un port specific pentru comunicare; lansarea paginii din afara mediului :isual *tudio se poate face direct din 2nternet 8xplorer sau alt "ro#ser, indicnd adresa paginii & ex. http:11)oc )host:1>6614eb!ite31my* 6e. sp'' pe care o folosea i mediul cnd rulam su" mediul integrat &extras din "ara de adres' i va funciona dac serverul de de!voltare este nc activ la acel moment. *pecificarea altor detalii de trasare pagin se poate face folosind foi de stiluri. 0onsultnd directorul n care a fost creat aplicaia & C1CInetpu3CwwwrootCprima' o"servm mai multe fiiere)

xxx1aspx , conine codul de vizualizare a paginii -e" &implicit se numete default1aspx'; xxx1aspx1cs , conine codul surs CC pentru declaraiile controalelor i funciilor de tratare a evenimentelor de la nivelul paginii. Fn utili!ator nu vede acest cod, c%iar dac n "ro#ser alege ?iew1!ource, cci codul vi!i"il n ?iew1!ource este cel de(a prelucrat de server. global1asax , &dac se adaug la proiect < clicB mouse dreapta pe *olution 8xplorer'; conine informaiile i codul de tratare a evenimentelor de la nivel de aplicaie. web1config , conine detaliile de configurare a site ului #e" i care sunt preluate cu eventuale modificri la nivel de aplicaie.

?*$.78T ncepnd cu versiunea 3./ folosete pentru de!voltarea aplicaiei un server #e" integrat; acesta lucrea! pe un port distinct de portul pe care lucrea! 22*, prevenind astfel eventualele conflicte ce pot apare. *erver ul #e" ncorporat rulea! o pagin #e" n numele utili!atorului logat n -indo#s, deci cu eventuale privilegii extinse, fa de 22* care rulea! cu privilegii stricte, din considerente de securitate sporit. Dn scopul prevenirii conflictelor de apartene a unei clase la mai multe namespace uri, va tre"ui dat calificarea complet a clasei; cum aceast ar putea fi prea lung, se poate folosi usin6 pentru a introduce un alias mai scurt)
using scurt & NumeDe.patiu%ung0 scurt)Cls ex0

2erar%iile din namespace$uri nu reflect neaprat derivri ; la derivare clasele pot aparine unor namespace uri diferite. 2amespace$ul nu se confund cu librar.; o "i"liotec dll are un corespondent fi!ic & fiier dll ce conine codul executa"il aferent unor clase i funcii ', pe cnd namespace urile sunt mai degra" grupri logice ale unor clase i funcii.

Dazele de lucru cu o pagin *eb 4. 'niializarea paginii , este re!ultatul unei cereri de la un "ro#ser; instania! controalele din pagin i le iniiali!ea! cu valori indicate prin Properties; dac suntem pe post"acB &adic pagina nu e la prima solicitare' valorile curente ale controalelor sunt extrase din ViewState i folosite la iniiali!are. Dn aceast fa! se declanea! i evenimentul PageInit, dar e puin folosit, cci se declanea! nainte de instanierea i ncrcarea controalelor cu valori utile.

3../3.3/45

3. 'niializarea pe baza codului indicat de utilizator - declanea! evenimentul PageLoad i deci va executa codul scris de programator n funcia de tratare PageLoad. +enumirea de PageLoad este aleas pentru a sugera c u!ual, pe server se ncarc i pagini care au mai fost vi!uali!ate n "ro#ser i se ntorc n server cu completri. 2n funcia de tratare PageLoad, pe ramura !Page.IsPostBack se pot pune valori de iniiali!are ale controalelor; pe cealalt ramur valorile nu tre"uie puse cci se preiau automat &ve!i fa!a anterioar' din ViewState. +ac iniiali!m controlul prin cod, atunci tre"uie pus EnableViewState pe false, altfel nu se (ustific munca pierdut prin suprascriere. @. !alidarea prin controale de validare , este o fa! asociat cu controalele de validare introduse de ?*$.78T; ea se derule! naintea oricror evenimente de utili!ator. 5. Tratarea evenimentelor de utilizator , este o fa! derulat dup ce pagina e complet ncrcat n server, iniiali!at i validat. Dn principiu, evenimentele de utili!ator ar putea fi mprite n dou categorii) evenimente cu rspuns imediat &notificate imediat serverului, pentru a fi tratate'; intr n aceast categorie evenimentul de Click pe diverse controale care l recunosc; evenimente de modificare & de exemplu, TextChanged, IndexChanged ntr un control de selecie etc.; ele vor fi tratate nu imediat, ci la urmtoarea ncrcare a paginii n server; dac dorim tratare imediat, proprietatea AutoPostBack a controlului respectiv se pune pe true, ceea ce forea! notificarea imediat a severului despre producerea evenimentului.

I. Legarea datelor , este o fa! care se derulea! n dou trepte) insert, delete i update se execut imediat dup producerea evenimentelor pe controale, dar nainte de Page.PreRender(); select se execut dup Page.PreRender(), alimentnd cu date controalele legate la surse de date; aceast succesiune are de!avanta(ul c funciile de tratare evenimente nu "eneficia! de cele mai recente date, aduse n controale. Legarea datelor se face automat la fiecare postbacF ; dac se dorete scrierea de cod ce folosete datele dintr un control cu data "inding, acest cod poate fi pus numai ntr o suprancrcare a metodei Page. nP!e"ende!Co#$lete%&, care se execut dup legare i nainte de redarea paginii ca HTML. J. 3liberarea resurselor , se face dup ce au avut loc toate transformrile paginii n server i pagina este redat ca HTML i pornete spre client. Dn acest moment se declanea! evenimentul Page.'nload i nicio modificare asupra paginii nu mai este posi"il. Garba e ! collector ul eli"erea! toate instanele de o"iecte ce nu mai sunt referite i se declanea! evenimentul Page.(is$osed, care nc%eie ciclul de via al paginii n server. $entru ae!area mai flexi"il n pagin se poate folosi un control de tip Table, care permite plasarea diverselor controale n celule, cu posi"ilitatea de mer e, resi"e, insert etc. *e recomand controlul Table simplu, din seciunea HTML, nu cel din seciunea *tandard, care ar necesita resurse ?*$.78T, la runtime. 0unctul de vedere n "a!a cruia s au denumit evenimentele este cel al server ului) desemnea! ncrcare pagina pe server, pentru prelucrri; Page.P!e"ende! pe server, nainte de a o face HTML, Page.'nload , plecare din server ctre client i eli"erare resurse pe server.
Page.Load

*imilar

stau

lucrurile

"es$onse."edi!ect%*new$age.as$x*&+

i pentru "e)uest i "es$onse; spre exemplu, preci!ea! c n rspuns, serverul cere "ro#ser ului s fac o

3../3.3/45

4/

cerere ctre o alt pagin newpa e#asp$. *pre deose"ire de aceasta, Se!,e!.T!ans-e!%*new$age.as$x*&+ nu presupune un du te vino de pagin, ci serverul n loc s prelucre!e pagina cerut de "ro#ser, prelucrea! o alta, dar de pe acelai server; n "ro#ser adresa paginii nu se sc%im".

*eb server M 2nternet 2nformation *ervices N 22* O M inetinfo1exe 'nternet #erver /pplication 0rogramming 'nterface &'#/0'' conine funcii +LL ce se ncarc dinamic, n acelai proces cu serverul. /vanta() sunt rapide, parta(a"ile. $ot fi mprite n dou categorii) filtre , ncrcate la iniiali!are server i folosite la tratarea evenimentelor la nivel de server; extensii ncrcate la prima solicitare i apoi parta(ate ntre aplicaii. Dezavanta() la euare, afectea! tot serverul, fcnd parte din acelai proces. 22* primete cererea i dup extensia de fiier vede ce +LL din 2*?$2 deservete cererea. +ac extensia este . sp', adic ?*$.78T, atunci invoc funcia adecvat din spnet7is pi.d)) pentru tratarea cererii & n consola 22*, ta" urile MIME, respectiv Handler Mapings pentru a vedea asocierile dintre extensiile de fi iere i executabilele ce le deservesc; G1aspx e asociat cu PageHandlerFactory '. $rocesul aspnet>isapi)dll transmite cererea ?*$.78T ctre worGer process & spnet7wp.e'e', care o tratea!; worGer process compilea! fiierul )aspx o"innd un assem"l;, crea! un application domain i instruiete 0L= s execute assem"l; ul n contextul application domain creat assem"l; folosete clase din C0L pentru a re!olva cererea i generea! un rspuns; #orBer process preia rspunsul generat, l mpac%etea! i l transmite procesului aspnetPisapi.dll, care l transmite la rndul lui serverului 22* pentru a fi naintat clientului, la distan.

7)

:) H)

5. I.

F!ual, structura unei pagini include trei seciuni distincte)

seciunea de directive) prin care se sta"ilesc condiiile de mediu n care pagina se va executa, instruind HTT$ runtime cum s procese!e pagina, eventuale namespace uri folosite n !ona de codificare, controale noi de utili!ator etc. seciunea de cod, introdus prin tag ul %script& i care preci!ea! codul executa"il folosit la execuia unor comen!i din pagin &u!ual precompilat, nu neaprat script, cum s ar putea nelege din delimitator'; seciunea de mac+etare, 0age la.out) repre!entnd sc%eletul paginii i preci!nd cum se mixea! elementele de cod cu elementele vi!uale din pagin & controale, texte etc.'

*intaxa directivelor este unic pentru toate directivele, iar n ca!ul atri"utelor multiple acestea sunt separate cu un spaiu; nu trebuie separat cu spaiu semnul egal &M', de asignare a valorilor unui atri"ut)
!"# Directive>Name attri3ute&'value' Dattri3ute&'value')))E "(

Dn cadrul unui formular #e", adic ntre Qform idMG6orm4G met%odMGpostG R putem pune cod 0S, declarat ca script)

!/form(

3../3.3/45

44

8ventualele erori de compilare sunt raportate doar cnd se rulea! pe aceeai main & localhost ', dar se poate cere raportarea erorilor i cnd se rulea! pe un server aflat la distan; n acest scop n fiierul de configurare we3)config, se pune n ru"rica adecvat codul urmtor)
!compilation default%anguage&<c < debu6"@true@ /(

=e!ultatul compilrii este un +LL i este pus n directorul cCwinntC5icrosoft)NetC =rameworGC )))C/emporary ?.$)NE/ =iles) & precum i n directorul aplicaiei c)Tinetpu"T###rootT))) C)3in '. +ac nu s au fcut modificri n surs, la urmtoarea rulare nu se mai compilea!. *e pot cere mesa(e detaliate & clicB pe #+ow Detailed Compiler'. 0oncret, n fiierul Default)aspx)cs se definete dinamic o clas _Default , derivat din clasa *;stem.-e".F2.0age. dintr unul din exemplele de mai sus, este o metod a acestei clase, dar clasa fiind generat dinamic dispune i de alte metode; spre exemplu. codul repetitiv din sursa de mai sus plasat ntre <%...%> este pasat unei metode numit 773ender77contro)1+, pentru redare.
doub)e * tr te+doub)e nr,

Htilizarea unor controale *eb simple 4. *e poate rula o pagina ce face adunarea a dou numere, la apsarea pe un "uton)
private void 3tn?duna>ClicG-o32ect sender, .ystem)Event?rgs e) @ dou3le s & dou3le)$arse-a)/ext)6dou3le)$arse-3)/ext)0 r)/ext&s)/o.tring-)0 B

unde a,3 i r sunt trei textCox uri. * se modifice programul astfel nct n funcie de selecia dintr un control +rop+o#nList, la apsarea pe "uton s se efectue!e ?dunare, *cdere sau nimic &7one'. * se modifice programul astfel nct s se renune la "uton, operaia declanndu se automat la sc%im"area seleciei din +rop+o#nList. 3. ?plicatie cu o mac%eta de introducere date, care la *ave face mutarea datelor ntr un textCox multiline &sau in ListCox '. H) $entru familiari!area cu mediul .78T se va ela"ora o aplicaie simpl, exemplificnd lucrul cu controale de tipul) Button, /extBox, +adioButton, DropDown%ist, ?dd+otator, Calendar. Ae't;o'/ 3 dio;utton/;utton Mai nti se vor aduce din Tool"ox controale de tip Text&ox, Label, Eadio&utton i se vor completa corespun!tor proprietile dorite, ca n figura de mai (os. *e adaug apoi trei textCox uri cu identificatorii a, 3 i r i un "uton inscriptionat cu UVW, care la apsare &evenimentul 0licB' declanea! adunarea a dou numere i afiarea re!ultatului. 6uncia pus ca tratare a mesa(ului emis la de "uton ar putea arta astfel)
private void 3tn?duna>ClicG-o32ect sender, .ystem)Event?rgs e) @ dou3le s & dou3le)$arse-a)/ext)6dou3le)$arse-3)/ext)0 r)/ext&s)/o.tring-)0 B

3../3.3/45

43

%rop%own8ist *e aduce prin dragare din ToolCox un control %rop%own8ist i se populea! adugnd cteva linii n colecia &proprietatea' Items; i se fixea! proprietatea Buto*ost; cC pe true, pentru a anuna serverul de orice sc%im"are de selectie; se tratea! evenimentul !e)ectedDnde'=h n6ed prin funcia)
private void cb9ode)>.electedIndexC*anged-o32ect sender, .ystem)Event?rgs e) @ t3/ip)/ext & c35odel).electedIalue0 B

funcia preia valoarea selectat i o pune ntr un TextCox numit tbAip.

Bdd3ot tor 6iierul reclama1xml se adaug la proiect cu meniu 0ro(ect 4*eb#ite5 " /dd 3xisting 'tem111
!Jxml version&'7);' encoding&'utfKL' J( !?dvertisements( !?d( !ImageMrl(p2>.Ep6!/ImageMrl( !NavigateMrl(*ttp1//local*ost/,e3?pplication7;/!/NavigateMrl( !?lternate/ext(Doctorat!/?lternate/ext( !Impressions(F;!/Impressions( !Neyword(Curs!/Neyword( !.peciali4ation(?cces IN/E+NE/ !/.peciali4ation( !/?d( !?d( !ImageMrl(p30.Ep6!/ImageMrl( !NavigateMrl(*ttp1//local*ost/,e3?pplication7;/ !/NavigateMrl( !?lternate/ext( Bi3lioteca ?cademiei !/?lternate/ext( !Impressions(H;!/Impressions( !Neyword(BooGs!/Neyword( !.peciali4ation(BooGs for $rofessionals !/.peciali4ation( !/?d( !?d( !ImageMrl(p31.Ep6!/ImageMrl(

3../3.3/45

4@

!NavigateMrl(*ttp1//local*ost/,e3?pplication7;/!/NavigateMrl( !?lternate/ext( %i3raria ?.E !/?lternate/ext( !Impressions(H;!/Impressions( !Neyword(BooGs!/Neyword( !.peciali4ation(?cademic BooGs!/.peciali4ation( !/?d( !/?dvertisements(

*e adaug un control Bdd3ot tor care este capa"il s afie!e aleator, la fiecare sc+imbare de pagin, cte o imagine cu text asociat ; i se pune proprietatea BdvertisementFi)e pe valoarea reclama)xml0 ne preocupm s existe fiierele imagine citate n reclama)xml)

= )end r *e drag%ea! un control = )end r i i se fixea! proprietatea !e)ection9ode pe valoarea % y4eeC9onth; i se tratea! evenimentul .electionC*ange cu funcia)
private void Calendar7>d-o32ect sender, .ystem)Event?rgs e) @ string s35esa2&''0 for- int G&;0 G ! Calendar7).electedDates)Count0 G66) s35esa2 6& Calendar7).electedDatesDGE)/o.*ortDate.tring-) 6 '!3r('0 l3l5esa2)/ext & s35esa20 B

6uncia preia datele selectate din calendar i le pune ntr un control La"el )b)9es E.

Clasa 0age 2erar%ia derivrii)


.ystem)O32ect .ystem),e3)MI)Control .ystem),e3)MI)/emplateControl .ystem),e3)MI)$age

deci clasa $age este i un control avnd o mulime de proprieti i evenimente pe care le recunoate. 8ste i container de controlale, colecia Controls furni!nd acces la controalele de pe pagin.

3../3.3/45

45

?a cum aminteam, etapele crerii paginii sunt semnalate prin evenimente ce pot fi interceptate i folosite pentru a plasa cod de utili!ator pentru executat legat de acel moment) Dnit , generat la crearea unei instane de tip $age; se poate folosi i pentru a ataa dinamic %andlere altor evenimente recunoscute de pagin i declanate ulterior. , la terminarea iniiali!rii i ncrcarea o"iectului $age n memorie; se poate folosi i pentru a ataa cod de iniiali!are controalelor de pe pagin. *re3ender , declanat nainte de redarea vi!ual a paginii pe ecran; e folosit pentru eventuale retuuri nainte de a trimite pagina n "ro#ser pentru trasare. Gn)o d , la descrcarea paginii din server & page cleanup'.
8o d

Tratarea evenimentelor permite aplicaiilor s se adapte!e dinamic la sc%im"rile contextuale din mediul de rulare
!")))"(

e un "loc de redare a interfeei i se pune n interiorul unei metode; deci nu poate conine definirea unei alte metode H

Tratarea unui eveniment se poate face ntr una din modalitile) 4. adugnd un +andler la delegatul disponi"il pentru acel eveniment; 3. sau suprancrc8nd metoda &&nH'''+, ' motenit din clasa de "a!. :arianta cu +andler este avanta(oas deoarece) nu cere ca tratarea s se fac ntr o clas derivat din clasa de "a! &suprancrcarea metodei &&nH'''+, se poate face doar n clasele derivate dintr o clas de "a! '; permite ataarea < detaarea dinamic a mai multor metode de tratare a aceluiai eveniment; aceeai funcie de tratare se poate aplica i altor evenimente fr a o rescrie n diverse clase. Dn .78T exist clasa care descrie un delegat generic, numit :ventI nd)er= instanierea clasei produce un o"iect delegat i presupune furni!area prototipului funciilor de tratare ce le va conine. +eclaraia prototipului acestui delegat este de(a facut n mediul de programare)
pub)ic de)e6 te void :ventI nd)er+obEect sender5 :ventBr6s e,/

i arat c acest tip de delegat poate ine referina oricrei funcii ce primete un o"iect generic i un "loc de parametri cu argumentele specifice unui eveniment generic i returnea! void. 0nd adugm unui eveniment o funcie de tratare, se instania! un nou delegat, care prin constructor primete i referina pe care o va transporta)
t*is)%oad 6& new :ventI nd)er-tratare%oad)0

*e o"serv aici evenimentul & 8o d ', delegatul generic &:ventI nd)er' i numele funciei de tratare & tr t re8o d '. Mecanismul Buto:vent4ireup"#true# Dn aplicaiile -e" mai exist un mecanism de ataare a unor funcii de tratarea evenimentelor unei pagini -e" numit mecanism /uto3vent*ireup. 8ste cel de al treilea mecanism de ataare cod executa"il unor evenimente, alturi de suprancrcarea funciilor motenite din clasa de "a!, respectiv mecanismul delegrii. 8l se active! numai dac pagina are atri"utul ?utoEvent,ireup & 'true' i se "a!ea! pe definirea de ctre programator a unor funcii de tratare cu nume impus, de forma * 6e_EventName(). $resupunem c se creea! o aplicaie -e" numit ?prindere?utomat. Dn fereastra de vi!uali!are se alege formatul HTML i se modific codul surs pentru a arta astfel)

3../3.3/45

4I

!"# $age %anguage&'c ' Code3e*ind&',e3=orm7)aspx)cs' ?utoEvent,ireup&'true' In*erits&'?prindere?utomata),e3=orm7'"( !OKKExemplificare mecanism ?utoEvent,ireup KK( !9/5%( !3ody( !script runat&'server'( protected void $age>%oad-O32ect o, Event?rgs e) @+esponse),rite-'5esa2 din functia de tratare eveniment %oad )!3r(')0B protected void $age>Init-O32ect o, Event?rgs e) @+esponse),rite-'?cum se produce eveniment $age>Init )!3r(')0B protected void $age>$re+ender-O32ect o, Event?rgs e) @+esponse),rite-'5esa2 pentru eveniment $re+ender )!3r(')0B !/script( !*r( !/3ody( !/9/5%(

?tenie cnd textul surs se preia cu Cop. " 0aste, g%ilimelele tre"uie s fie cele drepte, nu GsmartG H

0lau!a ?utoEvent,ireup&'true', altfel :isual *tudio o pune implicit pe false. 8xemplul funcionea! de sine stttor, fr a necesita construire de delegai de evenimente i ataare de funcii de tratare. $reul pltit este c funciile de tatare au nume impus, corelat cu evenimentul la care se refer) * 6e78o d5 * 6e7Dnit5 respectiv * 6e7*re3ender. recomand folosirea simultan a mecanismelor delegate i deoarece unele din funciile de tratare pot fi apelate de dou ori; explicaia const n faptul c n cadrul mecanismului ?utoEvent,ireup ?*$.78T leag automat la delegaii corespun!tori, metodele cu numele impus, iar cnd programatorul ataea! metodele cu VM le leag a doua oarH
?utoEvent,ireup&'true'

7u

se

8xemplul de mai sus se putea da i ca fiier text, ataa"il la un proiect vid, nemaifiind necesar trimiterea la fiierul cu cod surs Code3e*ind&',e3=orm7)aspx)cs', care oricum nu aducea n plus ceva ma(or. Mecanismul codeJbehind separ codul necesar descrierii interfeei utili!ator &user interface' de codul ce detalia! algoritmii de prelucrare &"usiness logic'. $rima categorie se pune n fiierul de tip 1aspx, cea de a doua n fiierul 1cs; astfel este posi"il i lucru n ec%ip, designerii ocupndu.se de proiectarea vi!ual a paginii, iar programatorii de prelucrri. 0ele dou fiiere sunt legate prin atri"utul Code3e*ind din directiva $age; acesta preci!ea! fiierul cu cod surs . LinBeditarea apare astfel ca fiind iniiat din pagina de utili!ator. +irectiva $age preci!ea! atri"ute necesare compilrii i vi!uali!rii paginii -e". #rc citea! numele fiierului surs ce conine clasa code "e%ind care este compilat dinamic la solicitarea unei pagini -e". 0nd folosim:isual *tudio .78T nu este nevoie de acest atri"ut doarece clasa code "e%ind este precompilat. 'n+erits , furni!ea! numele clasei code "e%ind ce conine codul paginii ?*$9 i din care clasa generat dinamic va moteni prin derivare. +esi !rc furni!ea! aceeai informaie ca atri"utul =odebehind; ntre ele exist o deose"ire ma(or) .rc e necesar cnd compilarea se face la momentul vizualizrii paginii. :isual *tudio a optat pentru precompilarea codului ce nsoete pagina -e". $entru c mediul :isual *tudio separ i el codul de vi!uali!are de cel de prelucrare, are totui nevoie la momentul proiectrii aplicaiei de numele fiierului ce ine codul surs 0S, pentru a l compila din vreme; acesta e indicat prin
3../3.3/45

4J

=odebehind.

?adar, =odebehind este un atribut neles i folosit numai de !# &nu i de ?*$.78T la execuia paginii' pentru locali!area fiierului surs ce conine definirea claselor folosite n pagin. /socierea !rc i Dnherits sugerea! o pagin fr compilare preala"il. /socierea =odebehind i Dnherits sugerea! o pagin cu precompilare $recompilarea are urmtoarele avanta(e) ne asigur c am re!ovat toate erorile de compilare; nu mai tre"uie dat "eneficiarului codul surs, ci doar dll urile; c%iar cnd pe calculatorul "eneficarului exist alt versiune de .78T, clasa folosete versiunea cu care a fost ea creat. Meniu 0ro(ect " #+ow /ll Diles permite vi!uali!area n .olution Explorer a tuturor fiierelor folosite n cadrul unui proiect, altfel implicit sunt vi!i"ile doar o parte dintre ele. 6iierul de configurare 4eb.con$i6 conine toate clau!ele de configurare a proiectului, inclusiv de3ug & <true<, necesar cnd aplicaia nu poate fi rulat n mod depanare, cci ea a fost compilat fr opiuni de depanare. $unnd o pe true, ne asigurm c recompilarea se face cu adugarea tuturor facilitilor de depanare. 'ldasm1exe &'ntermediate Language Disassembler5 poate vi!uali!a 898 i +LL ntr un format accesi"il utili!atorului. Tipologia controalelor dintr$o aplicaie /#0123T HTML Controls - preluate din HTML clasic; accesul la informaii este greoi &tre"uie anali!at pagina de rspuns'. HTML #erver Controls , identice cu cele de mai sus, dar prin run t " @server@ devin accesi"ile prin program i rulea! pe server; asigur acces uor la informaii prin intermediul proprietilor i evenimentelor. *eb #erver Controls , specifice ?*$.78T; acoper toate controalele de mai sus i ceva n plus; ofer alt model, mai consistent, de programare. !alidation Controls Hser Controls) Composite Controls i CustomControls , extensii sau adaptri, create de utili!ator

*eb #erver Controls orientate o"iect; "uilt in i recunoscute automat de "ro#ser ele de nivel nalt; unele produc post"acB imediat la clicB sau la sc%im"are de valori; unele las mesa(ele primite s a(ung i mai sus, la containerul controaleleor. ?u numele prefixat cu asp9 , ca mai (os) Iasp9Label runat>JserverJ"K Label $ IspanK Text&ox $ Iinput t.pe>JtextJK) Iinput t.pe>JpasswordJK) ItextareaK $roprietatea AutoPostBack a unui textCox preci!ea! cnd pagina va fi transmis server ului automat la orice modificare a textului sau cnd evenimentul TextC+anged va fi tratat de client. 8ste efectiv doar dac "ro#ser ul suport client-side scripting. ?*$.78T ataea! controlului un mic

3../3.3/45

4K

script ce face ca evenimentul s fie transmis serverului cu oca!ia altui eveniment, u!ual 0licB de "uton. 'mage IimgK
Dm 6eGr)

indic locaia F=L n care re!id imaginea de afiat

C+ecF&ox i Eadio&utton $ Iinput t.pe>Jc+ecFboxJK i Iinput t.pe>JradioJK $roprietatea AutoPostBack preci!ea! cnd pagina va fi transmis server ului la sc%im"area strii "utoanelor. &utton $ Iinput t.pe>JsubmitJK LinF&utton $ +.perlinF ) IaK tratat doar de "ro#sere ce suport client side scripting 'mage&utton $ Iinput t.pe>JimageJK ImageClicGEvents?rgs ncapsulea! informatii despre coordonatele punctului din imagine unde s a dat clicB. =epeater, +ataList, +ata1rid suport bubbling de evenimente, adic posi"ilitatea ridicrii automate a evenimentelor ctre controlul printe. +up modul n care sunt sesi!a"ile la nivelul serverului, evenimentele din pagina #e" se mpart n dou categorii) 0ostbacF) care sunt anunate imediat serverului; 2on$postbacF) care nu sunt anunate imediat serverului, pentru a nu mri excesiv traficul n reea. 8venimentele non$postbacF sunt evenimente mrunte, cu rol mai ales local, la nivelul paginii & spre exemplu, completarea unor ru"rici ntr un formular /extC*anged', urmnd ca dup mai multe astfel de evenimente s se genere!e un eveniment de tip postbacF 4 ClicG pe un "uton .u3mit5 care s permit transferul spre server al tuturor modificrilor produse n pagin. 0ontroalele care generea! evenimente dein o proprietate "oolean /uto0ost&acF, cu valori implicite, prin care se specific dac evenimentele generate de acestea sunt postbacF sau non$ postbacF1 +up valoarea implicit a acestei proprieti putem distinge) controale postbacF 9 Cutton, 0alendar, +ata1rid, +ataList, 2mageCutton, LinBCutton, =epeater. controale non$postbacF9 0%ecBCox, 0%ecBCoxList, +rop+o#nList, ListCox, =adioCuttonList, =adioCutton, TextCox.

Modificnd valoarea proprietii /uto0ost&acF putem sc%im"a dinamic Gvi!i"ilitateaG acestor evenimente la nivelul serverului. $utem o"serva ns, c la un moment dat, toate evenimentele generate de un control sunt fie post"acB, fie non post"acB.

0ategorii de controale tag HTML


!input(

Categoria 2nput

2ume HTML Html2nputCutton Html2nput0%ecBCox Html2nput6ile Html2nputHidden Html2nput2mage Html2nput=adioCutton

Descriere Qinput t;peM"utton X su"mit X resetR Qinput t;peMc%ecB"oxR Qinput t;peMfileR Qinput t;peM%iddenR Qinput t;peMimageR Qinput t;peMradioR Qinput t;peMtext X pass#ordR
3../3.3/45

4.

0ategorii de controale tag HTML Categoria 2ume HTML Html2nputText


!img(

Descriere

2nput 2nput 0ontainer

Html2mage HtmlText?rea Html?nc%or

2mage Text multilinie ?ncor 0ustomi!a"le output format, usa"le #it% 28 5./ and a"ove "ro#sers Maximum of one Html6orm control per page; default met%od is $>*T Ta"el, format din linii, ce conin celule 0elul de ta"el sau celul antet de ta"el Linie de ta"el Meniu pull do#n 0ontrol HTML generic

!textarea(

!a(

!3utton(

0ontainer

HtmlCutton

!form(

0ontainer

Html6orm

!ta3le(

0ontainer 0ontainer 0ontainer 0ontainer 0ontainer

HtmlTa"le HtmlTa"le0ell HtmlTa"le=o# Html*elect Html1eneric0ontrol

!td( !t*(

!tr(

!select(

3../3.3/45

4L

S-ar putea să vă placă și