Programarea Web Cu
Programarea Web Cu
Programarea
WEB cu
Microsoft ®
.NET ASP.NET
I. PRINCIPII GENERALE ALE PROIECTĂRII INTERFEŢELOR WEB ............................ 5
I.1. INTRODUCERE ........................................................................................................................................ 5
I.2. REALIZAREA INTERFEŢELOR WEB UTILIZÂND LIMBAJUL DE MARCARE HTML ..................................... 6
I.2.1. Ce este HTML ? ................................................................................................................... 6
I.2.2. Structura unui document HTML .......................................................................................... 7
I.2.3. Elemente HTML avansate .................................................................................................... 8
I.2.3.1 Tabele............................................................................................................................................. 8
I.2.3.2 Cadre .............................................................................................................................................. 9
I.2.3.2.1 Cadre interne .......................................................................................................................... 10
I.2.3.2.2 Deschiderea documentelor în alte cadre ................................................................................. 11
I.2.3.3 Layere........................................................................................................................................... 12
I.2.3.4 Formulare..................................................................................................................................... 12
I.2.4. Evaluare............................................................................................................................. 16
I.3. UTILIZAREA TEHNICII CSS PENTRU FORMATAREA DOCUMENTELOR WEB ........................................... 19
I.3.1. Ce este un stil? ................................................................................................................... 19
I.3.2. Definiţii de stil.................................................................................................................... 20
I.3.2.1 Definiţii de stil inline .................................................................................................................... 21
I.3.2.2 Definiţii de stil încapsulate (interne) ......................................................................................... 21
I.3.2.3 Definiţii de stil extern .................................................................................................................. 23
I.3.3. Stiluri în cascadă ............................................................................................................... 24
I.3.4. Clase de stiluri ................................................................................................................... 24
I.3.5. Stiluri identificator............................................................................................................. 25
I.3.6. Pseudoclase şi pseudoelemente.......................................................................................... 26
I.3.7. Stiluri pentru liste............................................................................................................... 28
I.3.8. Casete în CSS ..................................................................................................................... 30
I.3.9. Poziţionare în CSS ............................................................................................................. 31
I.3.10. Notaţii şi unităţi de măsură................................................................................................ 32
I.3.11. Evaluare............................................................................................................................. 34
II. MEDIUL DE LUCRU VISUAL WEB DEVELOPER EXPRESS 2008 ........................... 36
II.1. MEDIUL DE LUCRU ............................................................................................................................... 36
II.2. CUM MANEVRĂM PANOURILE .............................................................................................................. 37
II.3. MENIUL VIEW ...................................................................................................................................... 38
II.4. PAGINA DE START ................................................................................................................................ 38
II.5. PUBLICAREA UNUI SITE WEB ................................................................................................................ 38
II.6. COMPILAREA DINAMICĂ A SITE-ULUI ................................................................................................... 39
II.7. WEB SITE/WEB PROJECT ...................................................................................................................... 39
II.8. CREAREA UNUI SITE WEB ..................................................................................................................... 40
II.9. DESPRE OPŢIUNEA LOCATION( FILE SYSTEM, HTTP, FTP).................................................................. 41
II.10. CREAREA ŞI UTILIZAREA DIRECTOARELOR........................................................................................... 42
II.11. EDITAREA PAGINILOR .......................................................................................................................... 42
II.12. SCHIMBAREA PROPRIETĂŢILOR ............................................................................................................ 43
II.13. SALVAREA MODIFICĂRILOR ................................................................................................................. 43
II.14. DESPRE FIŞIERELE COD ........................................................................................................................ 43
II.15. VIZUALIZAREA PAGINILOR ÎNTR-UN BROWSER WEB ........................................................................... 44
II.16. MASTER PAGES .................................................................................................................................... 44
II.17. SERVERE WEB ÎN VISUAL WEB DEVELOPER ........................................................................................ 45
II.18. ASP.NET DEVELOPMENT SERVER ...................................................................................................... 45
II.19. RULAREA SERVERULUI INTEGRAT ....................................................................................................... 46
II.20. SECURITATE ÎN ASP.NET DEVELOPMENT SERVER ............................................................................. 46
III. LIMBAJUL DE SCRIPTING SERVER-SIDE ASP.NET............................................... 47
III.1. STRUCTURA UNEI PAGINI ASP.NET .................................................................................................... 47
III.1.1. Controale ASP.NET........................................................................................................... 49
III.1.2. Ciclul de viaţă al unei pagini web. .................................................................................... 50
III.1.3. Aplicaţii rezolvate.............................................................................................................. 51
III.2. LIMBAJUL C#....................................................................................................................................... 53
III.2.1. Vocabularul limbajului ...................................................................................................... 54
III.2.2. Tipuri de date..................................................................................................................... 55
III.2.3. Operatori ........................................................................................................................... 56
Principii generale ale proiectării interfeţelor Web 3
I.1. Introducere
ASP.NET este un set de tehnologii care ne permit crearea de aplicaţii web. Este evoluţia
de la Microsoft Active Server Pages (ASP), dar beneficiază de suportul platformei de
dezvoltare Microsoft .NET.
Una dintre cele mai importante calităţi ale ASP.NET este timpul redus necesar dezvoltării
aplicaţiilor web. Atât tehnologia în sine, cât şi uneltele de dezvoltare de aplicaţii web de la
Microsoft (cum ar fi Visual Web Developer Express - VWD) – reduc considerabil timpul de
dezvoltare al aplicaţiilor web faţă de alte tehnologii – prin simplitatea unui limbaj de
programare ”managed” de genul C# sau Visual Basic .NET, prin colecţia bogată de biblioteci
de clase şi controale .NET care oferă foarte multă funcţionalitate ”out of the box”, prin
orientarea pe construirea de aplicaţii web a mediului de dezvoltare VWD.
Chiar dacă ASP.NET este gândit pentru a dezvolta aplicaţii web foarte complexe – prin
faptul că se bazează pe .NET, prin faptul că se insistă pe un model de dezvoltare OOP,
respectiv pe separarea interfeţei de logica aplicaţiei – totuşi, este extrem de simplu ca
folosind ASP.NET să dezvoltăm aplicaţii mici, de genul magazinelor online, al aplicaţiilor care
sunt pur şi simplu un ”front-end” pentru o bază de date, sau al site-urilor personale.
ASP.NET cuprinde toate tehnologiile necesare pentru a dezvolta o aplicaţie web, scriind
cantitatea minimă de cod. Limbajele de programare care pot fi utilizate pentru a crea aplicaţii
ASP.NET sunt cele suportate de platforma .NET – cum sunt Visual Basic .NET şi C#, iar o
altă caracteristica importanta a acestor limbaje (înafara faptului că sunt ”managed”) este ca
au fost create având în vedere paradigma programării orientată pe obiecte. Totul din .NET, şi
evident din ASP.NET, este un obiect.
Evident, orice site / aplicaţie web trebuie să fie găzduită pe un server pentru a putea fi
utilizată. Chiar dacă în capitolele viitoare vom discuta mai mult despre instalarea aplicaţiilor
ASP.NET, aici aş dori să prezint pe scurt variantele de găzduire.
Există două variante de a găzdui aplicaţiile ASP.NET: (1) intern, pe serverele proprii sau
(2) extern, la o firmă care oferă servicii de găzduire (hosting). Decizia trebuie luată ţinănd
cont de câţiva parametri:
6
Pentru programatorii care doresc să aibă un site dezvoltat din pasiune sau pentru a
învăţa, dar vor totuşi să îl aibă instalat undeva, variantele de mai sus devin: (1) acasă, pe
Windows XP / Vista cu IIS; (2) la o firmă care oferă servicii de hosting gratuit. Da, există
variante de acest gen, unde vă puteţi instala propriul site ASP.NET fără să vă coste nimic
(căutaţi pe www.live.com ”asp.net free hosting”).
Pe perioada dezvoltării unei aplicaţii web, nu este nevoie ca aceasta să fie găzduită pe
un server IIS, ci poate fi rulată din Visual Web Developer folosind serverul web integrat (vezi
mai multe în capitolul II).
De ce HTML?
1
Hypertext Markup Language în engleză
2
tags în engleză
Principii generale ale proiectării interfeţelor Web 7
<html>
<head><title>Exemplu</title></head>
<body bgcolor=gray leftmargin="100" topmargin="50">
<body >
<p>Linie orizontala de culoare albastra si grosime 2
<hr color=blue size=3>
<p><font face="Arial" color="red" size="4">
Textul este scris cu fontul "Arial", culoare rosie si marime 7.
<p><i>Am inserat o imagine</i><img src="i7.gif" border=5>
</body>
</body>
</html>
3
container tags în engleză
4
empty tags în engleză
5
aceste elemente au fost studiate la Tehnologia informaţiei şi comunicaţiilor, în clasa a IX-a
8
<table>
<caption>...</caption>
<TR><TH><TH> ... </TR>
<TR><TD><TD> ... </TR>
...
<TR><TD><TD> ... </TR>
</table>
unde etichetele:
<table></table> delimitează tabelul
<tr></tr> delimitează o linie a tabelului
<td></td> delimitează o celulă de date a tabelului
<th></th> delimitează o celulă a primei linii din tabel (a capului de tabel)
<caption></caption> delimitează titlul tabelului
Exemplu: pagina următoare conţine un tabel cu bordură, având culoare stabilită de fundal,
cu celule unite.
<body>
<h3 align=left >tabel</h3>
<table border=2 bgcolor=gray>
<tr><td rowspan=3>HTML</td><td>TABELE</td></tr>
<tr><td>FORMULARE</td><td bgcolor=red>ASP</td></tr>
<tr><td>CADRE</td><td bgcolor=red>Visual Web DevExpress
2008</td>
</tr>
</table></body></html>
I.2.3.2 Cadre 6
Observaţii:
Există browsere care nu suportă cadre. Pentru acestea se utilizează în interiorul
blocului <frameset> eticheta <noframes> </noframes>. Dacă browserul poate să
interpreteze cadre, va ignora ce se găseşte în această porţiune, iar dacă nu, materialul
cuprins în zona <noframes> </noframes> va fi singurul care va fi recunoscut şi afişat.
Atribut Semnificaţie
cols împarte pagina în coloane şi are valori exprimate în procente din
dimensiunea ferestrei sau număr de pixeli sau * 7 (spaţiul rămas)
rows împarte pagina în rânduri cu aceleaşi valori ca la cols
bordercolor stabileşte culoarea tuturor chenarelor conform modelului #rrggbb 8
frameborder permite/inhibă afişărea chenarelor cu valorile yes sau no
6
în engleză frames
7
dacă mai multe elemente din listă sunt configurate cu *, atunci spaţiu disponibil rămas se va împărţi în
mod egal între ele
8
culorile pot fi precizate prin nume sau prin construcţia #rrggbb, unde r(red), g(green) şi b(blue) sunt cifre
hexazecimale
10
Cadrele sunt introduse prin perechea de etichete <frame> </frame>, şi suportă atributele:
Atribut Semnificaţie
name stabileşte numele asociat cadrului
src stabileşte fişierul sau adresa fişierului introdus
bordercolor stabileşte culoarea chenarului cadrului curent conform
noresize dezactivează posibilitatea vizitatorului de a redimensiona cadrul
scrolling permite/inhibă adaugarea barelor de defilare cu valorile yes no si auto
frameborder stabileşte dacă se afişează chenarul cadrului (1-implicit) sau nu (0)
marginheight permite stabilirea distanţei în pixeli dintre conţinutul unui cadru şi
marginile verticale ale cadrului
marginwidth permite stabilirea distanţei în pixeli dintre conţinutul unui cadru şi
marginile orizontale ale cadrului
Exemplu: pagină cu două cadre verticale în proporţia 30% şi 70% din lăţimea totală.
Cadrul din dreapta este împărţit la rândul său în două cadre orizontale.
<frameset cols="30%,*">
<frame src="f1.html" name="f1">
<frameset rows="40%,*">
<frame src="f2.html" name="f2">
<frame src="f3.html" name="f3">
</frameset >
</frameset>
Un cadru intern este specificat prin intermediul marcajului <iframe> </iframe>. Acesta
defineşte o arie rectangulară în interiorul documentului, arie în care browserul va afişa un alt
document HTML complet, inclusiv marginile şi barele de derulare. Un cadru intern se
inserează într-o pagină Web în mod asemănător cu o imagine, în interiorul blocului <body>.
Exemplu: pagină cu trei link-uri; acestea deschid paginile referite de ele în cadrul intern din
centrul paginii.
<html>
<head><title>Cadre interne</title></head>
<body>
<a href="t1.html" target="mijloc">link 1</a>
<a href="t2.html" target="mijloc">link 2</a>
<a href="c1.html" target="mijloc">link 3</a>
<center>
<iframe width="60%" height="50%" name="mijloc" src="c2.html">
</iframe>
</center>
</body>
</html >
Principii generale ale proiectării interfeţelor Web 11
Dacă într-unul dintre documentele deschise în cadru există link-uri, acestea vor
deschide paginile referite de ele în cadrul curent. Acest comportament se poate schimba prin
plasarea în eticheta <a> a atributului target, care precizează numele ferestrei (cadrului)
în care se va încărca pagina nouă referită de legătură, conform sintaxei:
<a href="URL" target="nume_cadru"> </a>
Exemplu: pagină cu două cadre de tip coloană. În cel din stânga se va deschide
documentul c5.html, iar în cel din dreapta, documentul c7.html. Cel de-al doilea cadru a fost
numit "cadru_dreapta".
c5.html: acest document conţine patru link-uri. Prin intermediul atributului target am
specificat faptul că toate legăturile încarcă paginile referite în cadrul din dreapta.
c5.html
<body>
<a href="t2.html" target="cadru_dreapta">Tabele</a><br>
<a href="t1.html" target="cadru_dreapta">Cadre</a><br>
<a href="t3.html" target="cadru_dreapta">Formulare</a><br>
<a href="c7.html" target="cadru_dreapta">Home</a><br>
</body>
Atribut Semnificaţie
_self încărcarea noii pagini are loc în cadrul curent
_blank încărcarea noii pagini are loc într-o fereastră nouă, anonimă
_parent încărcarea noii pagini are loc în cadrul părinte al cadrului curent dacă acesta
există, altfel are loc în fereastra curentă a browserului
_top încărcarea noii pagini are loc în fereastra browserului ce conţine cadrul curent
I.2.3.3 Layere 9
Layer-ele sunt elemente HTML asemănătoare frame-urilor, adică sunt nişte containere
pentru orice altceva ar putea intra într-o pagina HTML, dar spre deosebire de acestea, se pot
suprapune (ca şi regiunile unei hărţi). Etichetele <layer></layer> definesc un layer.
Observaţii:
Putem avea un layer în alt layer. În acest caz valorile atributelor left şi top ale
layer-ului din interior vor indica poziţia acestuia faţă la marginea de sus şi marginea din
stânga a layer-ului care îl cuprinde.
Layer-ele sunt acceptate doar de versiunile de la Netscape 4.0 în sus.
I.2.3.4 Formulare
Un formular este un ansamblu de zone active alcătuit din casete combinate, câmpuri de
editare, butoane radio, butoane de comandă etc. Formularele asigură construirea unor pagini
Web care permit utilizatorilor să introducă informaţii şi să le transmită serverului. O sesiune
cu o pagină Web ce conţine un formular cuprinde două etape:
9
straturi
Principii generale ale proiectării interfeţelor Web 13
Un formular este definit într-un bloc delimitat de etichetele <form> </form>. În interiorul
blocului sunt incluse:
elementele formularului, în care vizitatorul urmează să introducă informaţii,
un buton de expediere, la apăsarea căruia, datele sunt transmise către server,
opţional, un buton de anulare, prin care utilizatorul poate anula datele înscrise în
formular.
Calea prin care informaţiile introduse într-un formular pot parveni creatorului paginii
este folosirea comenzii mailto:
<a href="mailto:[email protected]">
acestuia
submit buton de este butonul a cărui activare declanşează
transmitere operaţiunea de trimitere a datelor catre server
reset buton de este butonul a cărui activare readuce
resetare controalele din formular la valorile lor iniţiale
image imagine permite înlocuirea unui buton submit cu o imagine
specificată
password casetă de este similară controlului text, diferenţele
text specială constând în faptul că datele introduse de utilizator
vor fi afişate printr-un caracter "mască" (ex: "*")
pentru a oferi un anumit grad de confidenţialitate.
Este folosit de obicei la introducerea unor parole.
hidden câmp ascuns permite introducerea în formular a unui câmp
ascuns
file permite expedierea conţinutului unui fişier a cărui adresă URL este
transmisă prin intermediul atributului value sau poate fi tastată într-
un câmp de editare ce apare odată cu formularul sau poate fi
selectată prin intermediul unei casete de tip File Upload sau
Choose File care apare la apăsarea butonului Browse din formular.
<input type="file" name="file">
name permite ataşarea unui nume fiecărui element al formularului
value permite atribuirea unei valori iniţiale unui element al formularului
checked are rolul de a preseta o anumită opţiune, pe care însă utilizatorul o poate
schimba, dacă doreşte
size setează numărul de caractere al căsuţei de text afişate
maxlength setează numărul maxim de caractere al căsuţei de text afişate
Exemplu: pagina următoare conţine elemente de mai multe tipuri încadrate într-un
formular unic. Pentru alinierea elementelor utilizate pentru informaţiile personale am utilizat
un tabel.
Principii generale ale proiectării interfeţelor Web 15
Atribut Semnificaţie
name ataşează listei un nume (utilizat în perechile “name=value”) expediat serverului
size precizează câte elemente din listă sunt vizibile la un moment dat pe ecran,
valoarea implicită fiind 1
multiple permite selectarea mai multor valori din cadrul unei liste de selecţie
Atribut Semnificaţie
value primeşte ca valoare un text care va fi expediat serverului în perechea
“name=value”; dacă acest atribut lipseşte, atunci către server va fi expediat
textul ce urmează după <option>:
<option value=”1”>Exemplu</option>
<option value=”2” selected>Exemplu</option>
I.2.4. Evaluare
1. Care dintre următoarele expresii HTML pentru introducerea unui hyperlink, este corectă
din punct de vedere sintactic?
a) <a url="http://www.microsoft.com/express/download/default.aspx">Visual
Studio 2008 Express Editions</a>
b) <a name="http://www.microsoft.com/express/download/default.aspx">Visual
Studio 2008 Express Editions</a>
c) <a href="http://www.microsoft.com/express/download/default.aspx">Visual
Studio 2008 Express Editions </a>
d) <a>http://www.microsoft.com/express/download/default.aspx </a>
5. Secvenţa :
<frameset cols=20%,*>
<frame src="A.html">
<frameset rows=40%,*>
<frame src="B.html">
<frame src="C.html"> a b c d
</frameset>
</frameset>
are ca rezultat :
6. Câte cadre sunt create prin secvenţa de cod HTML de mai jos?
<frameset rows="60%,*">
<frame src="Despre.html" name="titlu" id="titlu" scrolling="No" noresize>
<frameset cols="150,*">
<frame src="Frame.html" name="continut" id="continut" scrolling="Auto">
<frame name="main">
</frameset>
</frameset>
a) 2 b) 5 c) 3 d) 4
a) "opt=Informatica" c) "inf=Informatica"
b) "opt=inf" d) "radio=inf"
<option>optiunea3
<option selected>optiunea4
</select>
9. Pentru a grupa un număr de butoane radio, acestea trebuie să aibă aceeaşi valoare
pentru atributul:
a) type b) value c) id d) name
a) o listă cu 4 elemente
b) 2 liste imbricate cu câte 2 elemente fiecare
c) 2 liste neimbricate cu câte 2 elemente fiecare
d) 4 liste
12. Scrieţi codul HTML care să afişeze cadrele de mai jos. Imaginile afişate sunt distincte şi
nu sunt neapărat identice cu cele din exemplu.
Formulare
I.3. Utilizarea tehnicii CSS 10 pentru formatarea documentelor Web
De ce CSS?
Următorul segment de cod defineşte proprietăţile font, font-size, color şi text-align pentru
nivelele de titlu H1, H2 şi H3:
H1,H2,H3 {font-family:Arial,Garamond;text-align:center} 11
H1 {font-size:18px;color:red;background-color:gray}
H2 {font-size:16px;color:blue}
10
Cascading Style Sheets în engleză
11
în scrierea definiţiei unui stil este posibil să grupăm selectorii în liste, separaţi prin virgulă
20
H3 {font-size:14px;color:blue}
La nivel de element 12: stilurile sunt incluse ca atribute în cadrul etichetelor HTML din
document. Aceasta înseamnă că ele vor afecta doar elementul asupra căruia sunt aplicate.
Este o modalitate mai puţin utilizată, deoarece contrazice principiul general al stilurilor, acela
de a simplifica şi de a face mai lizibil codul documentului HTML.
Încapsulate 13: stilurile sunt incluse în documentul asupra căruia se aplică, şi anume în
secţiunea <head> a documentului, prin utilizarea marcajului <style>.
Legate 14: stilurile sunt definite în fişiere separate de documentul HTML. Documentul
face apel la foaia de stiluri prin intermediul etichetei <link>. Avantajul folosirii foilor de stiluri
externe este dublu. Pe de-o parte, ele se pot aplica la nivelul mai multor documente HTML,
realizând astfel o legătură de stil între ele, lucru deosebit de util la construirea unui site. Pe
de altă parte, acelaşi document poate folosi foi de stiluri diferite, oferind vizitatorului
posibilitatea de a opta la un moment dat, pentru unul sau altul dintre ele, în funcţie de
propriile preferinţe.
<html>
<head>
V <style>
H1 {color: #008000; font-weight: bold}
P {font-family: Arial; color: #800080; font-size: 14px} încapsulate
</style>
</head>
<body>
</body>
12
inline în engleză
13
embedded în engleză
14
linked în engleză
Principii generale ale proiectării interfeţelor Web 21
</html>
Spre deosebire de stilurile încapsulate şi de foile de stiluri externe, stilurile inline fac
parte chiar din corpul documentului HTML. Ele se aplică prin folosirea atributului style în
asociere cu etichetele HTML standard.
Definiţiile de stil inline se aplică numai asupra elementelor incluse între etichetele care
au asociat atributul style. Din acest motiv, dacă dorim să repetăm în alt loc din cuprinsul
documentului aceleaşi definiţii de stil, ele vor trebui scrise din nou, încărcând astfel
documentul HTML. Totuşi, utilitatea stilurilor inline este aceea că fiind definite chiar în
cuprinsul documentului, definiţiile lor sunt prioritare faţă de cele din stilurile încapsulate sau
externe.
Exemplu: pagina următoare conţine o definiţie de stil pentru al II-lea titlu de nivel 3 15
care nu se aplică şi celorlalte titluri de acelaşi nivel.
Crearea unui astfel de stil se realizează folosind eticheta <style> </style>. Eticheta de
stil este plasată în antetul documentului adică în secţiunea <head>.
15
textele cuprinse între etichetele <H3> </H3>
22
Exemplu: pagina conţine o definiţie de stil care realizează afişarea tuturor titlurilor de
nivel 1 cu caractere bold şi culoare gri. Textele incluse între etichetele <p> </p> vor fi afişate
cu fontul arial, de mărime 12 şi culoare violet. De asemenea, este creat un stil "stil_text"
care poate fi aplicat oricărui text. Prin intermediul său, textul este afişat cu caractere de
dimensiuni mai mari şi culoare roşie.
Atunci când lucraţi cu documente HTML deja existente, cărora doriţi să le aplicaţi stiluri
inline, este recomandat să folosiţi etichetele <div> şi <span>. Acestea vă permit să aplicaţi
stilurile fără a afecta codul HTML deja existent sau aspectul paginii în browserele care nu
suportă stiluri.
Eticheta <div> funcţionează asemănător cu eticheta <p>, marcând un întreg bloc de
conţinut, dar fără a genera linii albe între paragrafe.
Principii generale ale proiectării interfeţelor Web 23
O foaie de stiluri este un fişier text care conţine reguli de stil definite în aceeaşi manieră ca la
stilurile incluse în pagină. Odată creată o foaie de stiluri, ea trebuie salvată cu extensia .css.
Apelul foilor de stiluri se poate realiza în două moduri:
folosind eticheta <link>
folosind funcţia @import
Metoda importului (@import) este puţin mai lentă, fiind posibil să dureze o secundă,
două, până se încarcă foaia de stil, timp în care conţinutul este afişat fără formatarea
designer-ului.
Cel mai folosit mod de apelare a unei foi de stiluri este cu ajutorul etichetei <LINK>
conform următoarei sintaxe:
stil.css
body{background-image:url(i4.gif);
background-repeat:repeat-x;background-color:gray;}
h2{color:yellow}
.semafor{color:red;Font-Family:Arial Black;background-color:yellow}
<head>
<link rel="stylesheet" href="stil.css"></head>
<body topmargin=50>
<h2>Referirea unei foi de stil externe</h2>
<P>Pentru acest document am folosit un fisier de tip <span class=semafor>
foaie de stil</span> in interiorul caruia am definit 3 stiluri:
<ul>
<li>pentru corpul documentului
<li>pentru titlurile de nivel 2
<li>un stil pentru punerea in evidenta a unor pasaje de text, stil numit <span
class=semafor>semafor</span></li></ul>
</body>
16
şi adresa relativă, dacă este necesar
24
O regulă de stil poate să-şi mărească prioritatea dacă este însoţită de declaraţia
"!important":
P {font-size:12pt!important; font-style:italic }
Dacă ne referim la "care dintre cele 3 definiţii de stil este mai bună", standarde WEB indică:
utilizarea foilor .css pentru definirea caracteristicilor care se aplică la formatarea părţii
comune a tuturor paginilor unui document
utilizarea stilurilor încapsulate pentru definirea caracteristicilor care se aplică la formatarea
unei anumite pagini;
utilizarea stilurilor inline pentru definirea caracteristicilor care se aplică la formatarea unui
anumit element.
<style>
all.ftext{text-align:left; color:red;}
</style>
Cuvântul standard "all" aflat în faţa clasei de stiluri "ftext" indică faptul că această
clasă este aplicabilă tuturor blocurilor de text, atunci când este necesar. Practic clasa de
stiluri "ftext" poate fi asociată tuturor tagurilor HTML care operează cu text (ca de exemplu:
H2, H3, P, DIV, etc...) utilizând în interiorul fiecărui tag vizat o referire explicită la această
clasă:
Principii generale ale proiectării interfeţelor Web 25
<tag class=ftext>
Dacă dorim să aplicăm această clasă de stiluri unui titlu de nivel 2, atunci scriem:
<H2 class="ftext"> Acest header este aliniat la stanga si are culoarea rosie </H2>
După cum s-a văzut, pentru apelarea unei clase de stiluri în vederea aplicării sale
elementului tag curent se foloseşte atributul "class", având ca valoare numele clasei de stil.
Împreună cu specificaţia "all" din definirea clasei de stiluri, atributul "class" devine un atribut
universal, adică va putea fi asociat tuturor tagurilor HTML cărora li se poate aplica.
Dacă dorim ca o clasă de stiluri să fie aplicabilă numai pentru anumite elemente ale
documentului (spre exemplu pentru paragrafele de text desemnate prin marcajul de
paragraf "p"), atunci în construcţia clasei va apărea acest element (de exemplu "p.ftext").
Atribut Semnificaţie
:link descrie starea normală a unei legături
:visited descrie o legătură vizitată
:hover descrierea aspectul legăturii când aceasta primeşte focusul
:active descrie starea activă a unei legături
:focus descrie o legătură selectată
17
italice
Principii generale ale proiectării interfeţelor Web 27
Exemplu: pagina următoare conţine o listă ordonată care utilizează ca marcatori literele mari
ale alfabetului englez
Principii generale ale proiectării interfeţelor Web 29
list-style-image
În afara simbolurilor de marcaj prestabilite cunoscute de browser pot fi folosite şi
imagini prin comanda CSS list-style-image. Imaginile sunt introduse prin adresa url().
Exemplu: pagina următoare conţine o listă ordonată folosind ca marcaj imaginea i4.gif.
Exemplu: pagina următoare conţine un meniu structurat ca o listă şi stilizat folosind CSS.
Pentru a crea un sistem de navigare bazat pe o listă neordonată 18, mai intâi se creează lista,
plasând fiecare legatură într-un element <li>. Apoi, se încadrează textul cu <div> şi i se
asociază un id corespunzător.
18
marcată cu ajutorul tagului <ul>
30
19
margin în engleză
20
border în engleză
21
padding în engleză
Principii generale ale proiectării interfeţelor Web 31
Atât poziţionarea absolută cât şi cea relativă folosesc proprietăţile left şi top exprimate în px
(pixeli), in (inci), pt (puncte), cm (centimetri).
Poziţionarea absolută plasează obiectul în pagină exact în locaţia data de left şi top.
Astfel poate fi creat un element liber faţă de celelalte din pagina. Obiectul poate fi orice, de
exemplu text sau imagine.
Exemplu: în pagina următoare cuvintele sunt poziţionate relativ unul faţă de celălalt.
Poziţionarea tridimensională
Culori
Atributul culoare pentru un obiect poate fi specificat printr-un cuvânt cheie (aqua, black, blue,
fuchsia, gray, green, lime, maroon, navy, olive, purple, red, silver, teal, white si yellow ) sau
prin intermediul unei specificaţii numerice RGB. Acestea sunt luate din paleta VGA
Windows. Specificarea unei culori în forma hexazecimalã RGB se prefixează cu caracterul #
şi conţine şase cifre hexazecimale.
URL 23 este soluţia aleasă de World Wide Web Consortium, pentru specificarea unei resurse
(unui site sau a unei pagini) în Internet. Sintaxa generală este:
<protocol>://<nume_DNS>/<nume_local>
unde
protocol este protocolul folosit (de cele mai multe ori HTTP),
nume_DNS este numele domeniului pe care se află resursa,
nume_local este format din calea şi numele resursei de pe discul local.
22
Mărimea celorlalte caractere este ajustată în funcţie de acesta
23
Uniform Resource Locator
34
I.3.11. Evaluare
3. Cum definim o bordură dimensionată astfel: top border = 10 px; bottom border = 5 px; left
border = 20 px; right border = 1px?
a) border-width:10px 1px 5px 20px
b) border-width:10px 5px 20px 1px
c) border-width:5px 20px 10px 1px
d) border-width:10px 20px 5px 1px
4. Care din următoarele variante defineşte un model de stil aplicabil tuturor elementelor h3
dintr-un document?
a) <h3 style="...">
b) <style> h3{..} </style>
c) <style> .h3{..} </style>
d) <style> #h3{..} </style>
9. Completaţi sursa HTML de mai jos astfel încât listele definite să apară cu mai multe tipuri
de marcaje, ca în figură.
10. Adăugaţi tabelului de mai jos încă o celulă (celula12) formatată ca în figură.
36
Solution Explorer/
Database Explorer
Properties window
24
debug în engleză
25
.NET FRAMEWORK 3.5
26
un Master Page este un formular WEB standard care acţionează ca un tipar pentru paginile unui site
Mediul de lucru Visual Web Developer Express 2008 37
Toolbox: când deschideţi o pagină sau alt item pentru editare, Toolbox vă oferă
instrumentele ce vă permit adăugarea de noi componente 27 paginii.
Design Surface: este panoul de editare a paginilor .
Solution Explorer/Database Explorer: Fiecare site Web pe care îl creaţi este organizat
ca un grup de foldere care apare în Solution Explorer. Orice bază de date pe care o
creaţi pentru site-ul dumneavoastră apare în Database Explorer. Pentru comutarea între
cele două programe Explorer se foloseşte tabul din josul panoului.
Properties: afişează proprietăţile asociate obiectului sau paginii cu care se lucrează.
Aşa cum arată figura de mai sus, bara de titlu a unui panou conţine trei butoane
intitulate Window Position, Auto Hide şi Close. Selectând Window Position puteţi accesa
următoarele opţiuni ale meniului în cascadă :
Floating: tranformă panoul într-o fereastră flotantă care se poate muta şi redimensiona.
Dockable: ancorează panoul.
Tabbed Document: mută panoul în zona de editare, identificată printr-un tab în partea
sa superioară. Accesarea tab-ului face panoul vizibil. Pentru a reancora panoul în
fereastra programului se dă click dreapta pe tab şi se alege Dockable.
Auto Hide: converteşte panourile deschise în panouri ascunse de-a lungul marginii
programului.
Hide: ascunde panoul.
27
controale
38
Pagina de start apare de fiecare dată când deschideţi Visual Web Developer. Sub
Recent Projects veţi observa o listă cu site-urile Web la care aţi lucrat recent. Pentru a
deschide unul dintre site-uri selectaţii numele.
Pagina de start nu conţine nimic din ce este
necesar pentru a construi un site, ci doar link-
uri către cărţi electronice online gratuite şi
MSDN Library for Visual Studio Express
Editions. După ce aţi creat sau aţi deschis un
site Web, pagina de start dispare. Dacă vă
răzgândiţi şi vreţi să aduceţi pagina de start
înapoi pe ecran trebuie să alegeţi, View→Other
Windows→ Start Page din meniul View.
Construcţia unui site pe propriul calculator e doar primul pas. Dacă doriţi ca acesta să
poată fi accesat de public trebuie să obţineţi un domeniu şi apoi să publicaţi site-ul pe un
server aflat la adresa domeniul. Compania care vă asigură spaţiu pentru publicarea site-ului
este de obicei numită hosting service sau hosting provider. Serviciile de hosting care suportă
tehnologiile specifice pe care le foloseşte Visual Web Developer se numesc ASP.NET 29 2.0
Hosters. Dacă site-ul are şi o bază de date în spate, atunci veţi avea nevoie de un serviciu
de hosting care suportă ASP.NET 2.0 şi SQL Server 2005.
28
numite şi ferestre pentru că pot fi flotante
29
ASP.NET este o tehnologie Microsoft pentru crearea de aplicaţii web şi servicii web.
Mediul de lucru Visual Web Developer Express 2008 39
Observaţii:
Există variante de hosting gratuit, unde vă puteţi instala propriul site ASP.NET fără
să vă coste nimic (căutaţi pe www.live.com ”asp.net free hosting”).
Visual Web Developer Express dispune de două variante diferite de a crea un site web:
Web Site (File -> New Web Site)
Web Application Project.
30
un .dll
31
timp de creare.
40
unui build.
Observaţii:
Dacă ne referim la "care dintre cele 2 variante este mai bună (Web Site sau Web
Application Project)" recomandăm ca pentru aplicațiile cu mult cod și o durată de
implementare mare să se folosească Web Application Project, iar pentru cele mici Web
Site.
32
Protocol de Transfer al Hypertext-ului
33
Protocol de Transfer al Fişierelor
34
Internet Information Services, în engleză
35
în mod grafic
42
Pentru a edita o pagină existentă în Visual Web Developer, este nevoie mai întâi să
deschideţi pagina pentru a fi afişată pe suprafaţa de Design. Pentru a deschide o pagină, se
face dublu-click pe pictograma ei din Solution Explorer.
Să încercăm să edităm pagina în mod Design. Vom tasta Prima mea pagină WEB.
36
foldere-lor, în engleză
Mediul de lucru Visual Web Developer Express 2008 43
Lista de proprietăţi a unui obiect oferă câteva opţiuni pentru modificarea obiectului, dar
nu pe toate. Orice opţiune care se leagă de felul în care arată obiectul pe în pagină, poate fi
schimbată şi cu ajutorul Style Builder sau CSS.
Observaţii:
Apăsând butonul Save All, poţi salva toate paginile deschise.
Numele paginii de cod este acelaşi cu numele paginii .aspx, dar cu o extensie .cs 37
adaugată, cum poate fi văzut în figură.
Mergem în zona de cod (click dreapta pe numele fişierului .aspx şi alegem View Code), în
care se implementează codul care dă caracterul dinamic al paginii şi modificăm metoda
Page_Load() ca mai jos:
Ce se vede în browser?
Observaţii:
Fişierul cod este locul unde se află partea de programare din spatele paginii Web.
Pentru a vizualiza, într-un browser, pagina la care lucraţi în modurile de vizualizare Design
sau Source în Visual Web Developer, puteţi folosi oricare dintre metodele următoare:
Click dreapta pe orice spaţiu gol din pagina şi alegeţi View in Browser.
Este foarte indicat pentru un site ca paginile sale să aibă același aspect vizual, adică
să urmărească acelaşi tipar 38. ASP.NET, încă de la versiunea 2.0, ne pune la dispoziție
paginile numite “Master Pages”, care pot fi utilizate ca un template de către paginile propriu
zise ale aplicației. ”Master pages” nu sunt pagini care au conținut, în sensul că ele nu pot fi
37
în cazul în care aţi ales limbajul C#
38
template, în engleză
Mediul de lucru Visual Web Developer Express 2008 45
vizualizate direct, ci doar ”moștenite” din punct de vedere al interfeței de către paginile cu
conținut.
Observaţii:
Puteţi avea probleme cu IIS din următoarele motive:
Lucraţi cu pagini ASP.NET pe un sistem de operare Windows XP Home Edition, care
nu suporta IIS
Nu vreţi să aveţi un server Web pe computerul dumneavoastră din motive de securitate.
Rularea unui server Web precum IIS presupune câţiva paşi în plus pentru a securiza
serverul şi a fi la zi cu ultimele update-uri de securitate.
Dacă nu puteţi folosi IIS ca server web, puteţi testa paginile dumneavoastră ASP.NET
folosind ASP.NET Development Server. ASP.NET Development Server este integrat în
Visual Web Developer şi este un server Web care rulează local pe sistemele de operare
Windows, incluzând Windows XP Home Edition. Este construit special pentru a rula pagini
ASP.NET doar pentru calculatorul pe care lucraţi. ASP.NET Development Server vă pune la
dispoziţie o foarte bună şi simplă metodă de a vă testa paginile local înainte de a le publica şi
a le pune pe un server IIS.
39
Un calculator conectat la Internet care furnizează clienţilor, la cerere, diverse resurse web
40
Simple Mail Transfer Protocol
46
ASP.NET Development Server este instalat automat odată cu Visual Web Developer.
Dacă lucraţi la un site Web bazat pe un sistem de fisiere, Visual Web Developer foloseşte
automat Visual Web Developer pentru a rula paginile. Implicit, serverul Web utilizează un
port aleatoriu. De exemplu, dacă testaţi o pagină numită ex1.aspx, când o rulaţi pe ASP.NET
Development Server, URL-ul poate arăta aşa:
Dacă vreţi să rulaţi ASP.NET Development Server pe un port specific, puteţi configura
serverul pentru a face asta.
Observaţii:
Visual Web Developer nu poate garanta că portul pe care îl specificaţi va putea fi
folosit atunci cand veţi rula site-ul dumneavoastră Web.
Observaţii:
Chiar dacă utilizaţi ASP.NET Development Server pentru a testa paginile care sunt
funcţionale, ar trebui sa le testaţi din nou după ce le-aţi publicat pe un server Web care
rulează IIS.
Limbajul de scripting server-side ASP.NET 47
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
output.InnerText = "Hello World!";
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>First page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<p id = "output" runat="server"/>
</div>
</form>
</body>
</html>
48
În exemplul de mai sus, la încărcarea paginii web, va fi afişat mesajul Hello world.
Codul C# asociat, este scris în cadrul paginii .aspx.
Observaţii:
În Visual Web Developer, pentru a separa codul într-un fişier separat, la
adăugarea unei pagini noi în proiectul curent, se bifează opţiunea „Place code in
separate file”:
Aceeaşi aplicaţie poate fi realizată scriind codul C# într-un fişier separat având
extensia .aspx.cs:
first.aspx
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>First Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<p id = "output" runat="server"/>
</div>
</form>
</body>
</html>
Limbajul de scripting server-side ASP.NET 49
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
Observaţii:
Cu excepţia liniei output.InnerText = "Hello World !"; , codul de mai sus este
generat automat de Visual Web Developer.
Orice pagină web .aspx conţine o secţiune de directive, care descrie modul în care
pagina este procesată de către server. Această secţiune este cuprinsă între tag-urile <%@ şi
%> şi precizează limbajul utilizat pentru scrierea codului şi numele fişierului în care este
reţinut codul (atunci când este cazul):
<%@ Page Language="C#" CodeFile="first.aspx.cs" Inherits="_first"%>
Când scrieţi cod server-side pentru controalele server HTML de tip input (text, button,
checkbox, radioButton) puteţi folosi proprietatea value pentru a accesa valoarea introdusă de
utilizator. Proprietatea InnerText reprezintă textul cuprins între tag-urile de deschidere
respectiv închidere ale unui control Html, iar proprietatea InnerHtml reprezintă marcajele
Html cuprinse între tag-urile de deschidere respectiv închidere ale controlului Html.
Observaţii:
În Visual Web Developer, puteţi adăuga controale standard HTML din modul
design, folosind fereastra ToolBox secţiunea HTML.
Controalele server Web oferă mai multe funcţionalităţi programabile decât cele
HTML. Aceste controale pot corespunde mai multor tag-uri HTML, şi pot include cod
javascript. Sunt cuprinse între tag-urile <asp> </asp>. De exemplu un control Web pentru
introducerea datelor de către utilizator este textbox: <asp:TextBox ID="TextBox1"
runat="server"></asp:TextBox>
Procesul de prelucrare a paginii web de către server este împărţit în mai multe etape.
Fiecare etapă corespunde unui eveniment asociat paginii. Printre cele mai importante
evenimente asociate paginii sunt:
Limbajul de scripting server-side ASP.NET 51
Observaţii:
În codul de mai jos „+” este operator de concatenare a două şiruri de caractere.
Fişierul .aspx.cs:
a, input, iar în codul C# vom modifica atributele bgcolor, align respectiv href, prin intermediul
proprietăţii Attributes.
Fişierul .aspx.cs
III.2. Limbajul C#
Analog, accesul la datele şi funcţiile membre ale unei clase se realizează prin obiect .
proprietate sau obiect . metodă.
Un spaţiu de nume reprezintă o schemă logică pentru denumirea tipurilor de date
înrudite. Vă puteţi imagina spaţiile de nume ca fiind asemănătoare cu structura de directoare
şi fişiere din Windows. La fel cum într-un folder salvaţi fişiere înrudite, într-un spaţiu de nume
se găsesc obiecte de tipuri asemănătoare. De exemplu clasele HTMLInputTextBox şi
HTMLAnchor se vor găsi în acelaşi spaţiu de nume, deoarece ambele reprezintă controale
html de interfaţă.
Rădăcina acestei ierarhii de spaţii de nume este System. Spaţiile de nume pot
conţine la rândul lor alte spaţii de nume. De exemplu, System conţine spaţiile de nume
System.Data (unde se găsesc clase pentru conectarea la diverse surse de date) şi
System.Web (unde se găsesc toate clasele pentru dezvoltarea unei aplicaţii web).
Controalele server Html sunt incluse în spaţiul de nume System.Web.UI.HtmlControls, iar
controalele server Web în spaţiul System.Web.UI.WebControls. Pentru a avea acces la
clasele dintr-un anumit spaţiu de nume, acesta trebuie inclus în aplicaţie folosind
instrucţiunea using:
using System
using System.Web
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
Tipurile întregi
Tip Descriere Domeniul de valori
byte Întreg pe 8 biţi fără semn 0 .. 255
sbyte Întreg pe 8 biţi cu semn -128 .. 127
short Întreg pe 16 biţi cu semn -32 768 .. 32 767
ushort Întreg pe 16 biţi fără semn 0 .. 65 535
int Întreg pe 32 biţi cu semn -2 147 483 648 .. 2 147 483 647
uint Întreg pe 32 biţi fără semn 0 .. 4 294 967 295
long Întreg pe 64 biţi cu semn - 263 .. 263 - 1
ulong Întreg pe 64 biţi fără semn 0 .. 264 - 1
Exemplul 3.3
Observaţii:
În fişierul .aspx am presupus definit un tag <div> cu atributele id = „mainDiv” şi
runat = “server”.
56
Tipul caracter
În C# caracterele nu sunt reprezentate pe 8 biţi ca în C++, ci pe 16 biţi, datorită
folosirii modelului Unicode. Modelul Unicode defineşte un set de caractere care poate
reprezenta caractere din mai multe limbi. Setul standard de caractere ASCII este un subset
al modelului Unicode. Domeniul de valori al tipului char este [0..65535].
Exemplu:
char c = 'ş';
mainDiv.InnerHtml += c;
Tipul bool
Acest tip reprezintă valorile de adevăr şi fals. În C# acestea sunt definite prin
cuvintele rezervate true şi false. Nu este definită nici o regulă de conversie între tipul bool şi
valori întregi (1 nu este convertit în true şi nici 0 în false).
În următorul exemplu, în pagina web va fi afişată valoarea true:
bool c = true;
mainDiv.InnerText += c;
III.2.3. Operatori
Operatorii C# sunt cuprinşi în următoarele categorii:
Operatori aritmetici
Operatori de incrementare/decrementare
Operatori relaţionali
Operatori logici
Operatori de atribuire
Operatorul condiţional
Rezultatul evaluării unei expresii ce conţine operatorii relaţionali, este de tip bool.
Operatorii logici sunt:
! (negaţia logică)
&& (şi logic)
| | (sau logic)
Tabelul operatorilor logici este:
p q p && q p||q !p
true true true true false
true false false true false
false true false true true
false false false false true
În cadrul unei expresii logice ce conţine operatorul &&, dacă primul operand are
valoarea false rezultatul va fi false, indiferent de valoarea celui de al doilea operand. În mod
58
asemănător, într-o expresie logică cu operatorul | |, dacă primul operand are valoarea true
rezultatul va fi true, indiferent de valoarea celui de al doilea operand. În ambele cazuri, al
doilea operand nu mai este evaluat, codul fiind mai eficient.
Operatorul de atribuire este = , şi se foloseşte într-o construcţie de forma variabilă
= expresie. Se evaluează expresia, iar rezultatul evaluării este atribuit variabilei. Dacă este
cazul se realizează şi o conversie a valorii către tipul variabilei.
Pentru atribuiri se pot folosi şi operatorii +=, -=, *=, /=, %=. De exemplu atribuirea x =
x + 1;, poate fi rescrisă x += 1;
Precedenţa operatorilor în C#
Prioritate maximă
() [] new sizeof
! ~ (cast) +(unar) ++ --
* / %
+ -
<< >>
< > <= >=
== !=
&&
||
?:
= op=
Prioritate minimă
III.2.4. Conversii
În C# există două tipuri de conversii numerice:
Limbajul de scripting server-side ASP.NET 59
• implicite
• explicite.
Conversia implicită se efectuează doar dacă nu este afectată valoarea convertită.
Conversiile implicite sunt prezentate în tabelul următor:
Conversie în
din
sbyte short, int, long, float, double, decimal
byte short, ushort, int, uint, long, ulong, float, double, decimal
short int, long, float, double, decimal
ushort int, uint, long, ulong, float, double, decimal
int long, float, double, decimal
uint long, ulong, float, double, decimal
long float, double, decimal
char ushort, int, uint, long, ulong, float, double, decimal
float double
ulong float, double, decimal
Funcţia Descriere
Abs (x) Returnează modulul unei valori numerice
Ceiling (x) Returnează cel mai apropiat întreg mai mare sau egal decât
valoarea trimisă ca parametru.
Exp (x) Returnează ex
Floor (x) Returnează cel mai apropiat întreg mai mic sau egal decât
valoarea trimisă ca parametru.
Log (x) Returnează logaritmul natural.
Log10(x) Returnează logaritmul în baza 10.
Max (x, y) Returnează maximul dintre 2 numere.
Min (x, y) Returnează minimul dintre 2 numere.
Pow (x, y) Returnează xy
Round (x, n) Returnează cel mai apropiat întreg sau un număr rotunjit cu
un anumit număr de zecimale.
Sqrt (x) Returnează radicalul numărului trimis ca parametru.
Truncate(x) Returnează partea întreagă a numărului trimis ca parametru.
Exemplul 3.5
Dacă funcţia Round este apelată fără cel de al doilea parametru, va returna cel mai
apropiat întreg faţă de valoarea trimisă ca parametru. Dacă se precizează şi al doilea
parametru, atunci primul parametru va fi rotunjit la o valoare cu un număr de zecimale
specificat de al doilea parametru.
III.2.6. Instrucţiuni C#
Instrucţiuni decizionale.
În limbajul C# există două instrucţiuni decizionale: simplă (if) şi multiplă (switch).
Limbajul de scripting server-side ASP.NET 61
Figura 3.2
Exemplul 3.7 În următorul exemplu sunt calculate rădăcinile ecuaţiei de gradul II:
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><title>Ecuatie gradul II</title></head>
<body>
<form id="form1" runat="server">
<div> a = <input id="nr1" type="text" runat = "server"/><br />
b = <input id="nr2" type="text" runat = "server"/><br />
c = <input id="nr3" type="text" runat = "server"/><br />
<span id = "rezultat" runat = "server" /><br /><br />
<input id="Button1" type="button" value="Calculeaza" runat =
"server" onserverclick = "ecuatie"/>
</div>
</form></body></html>
Fişierul .aspx
Fişierul .aspx.cs
2. Instrucţiunea decizională multiplă switch are următoarea sintaxă:
switch (expresie)
{
case val1: instrucţiuni1; break;
case val2: instrucţiuni2; break;
case val3: instrucţiuni3; break;
………………………………..
case valN: instrucţiuniN; break;
Fişierul .aspx
64
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><title>Switch</title></head>
<body>
<form id="form1" runat="server">
<div>
<input id="nr1" type="text" runat = "server"/>
<select id="operatie" name="operator" runat = "server">
<option value = "1">+</option>
<option value = "2">-</option>
<option value = "3">*</option>
<option value = "4">/</option>
</select>
<input id="nr2" type="text" runat = "server"/> =
<input id="rezultat" readonly="readonly" type="text" runat =
"server"/><br />
<input id="Button1" type="button" value="Calculeaza" runat = "server"
onserverclick="calcul"/><br />
<div id = "tst" runat = "server" />
</div>
</form></body></html>
Fişierul .aspx.cs
Figura 3.3
Instrucţiuni repetitive
Instrucţiunile repetitive în C# sunt:
Cu test iniţial (while)
Cu test final (do while)
Cu număr cunoscut de paşi (for)
Modul de execuţie este următorul: cât timp este adevărată condiţia, se execută
instrucţiunile.
Exemplul 3.8 Aplicaţia următoare calculează cmmdc a două numere introduse de
utilizator.
Limbajul de scripting server-side ASP.NET 65
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>cmmdc</title>
</head>
<body>
<form id="form1" runat="server">
<div>
Primul numar: <input id="nr1"
type="text" runat = "server"/><br />
Al doilea numar:<input id="nr2" type="text" runat = "server"/><br />
<input id="Button1" type="button" value="Calculeaza" runat = "server"
onserverclick="cmmdc"/><br />
<p id = "rezultat" runat = "server" />
</div>
</form>
</body>
</html>
Fişierul .aspx
a = Convert.ToInt32(nr1.Value);
b = Convert.ToInt32(nr2.Value);
r = a % b;
while (r > 0)
{
a = b;
b = r;
r = a % b;
}
rezultat.InnerText = "cmmdc este: " + b.ToString();
}
}
Fişierul .aspx.cs
Exemplul 3.9
Exemplul următor calculează suma cifrelor unui număr, folosind instrucţiunea
repetitivă do while.
public partial class _Default : System.Web.UI.Page
{
protected void suma(object sender, EventArgs e)
{
int n = Convert.ToInt32(nr1.Value), s=0;
do
{
s += n % 10;
n = n / 10;
} while (n > 0);
rezultat.InnerText = "Suma cifrelor este: " + s.ToString();
}
}
Fişierul .aspx
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Suma cifrelor</title>
</head>
<body>
<form id="form1" runat="server">
<div>
Introduceti numarul:
<input id="nr1" type="text" runat = "server"/>
<input id="Button1" type="button" value="Calculeaza" runat = "server"
onserverclick="suma"/><br />
<p id="rezultat" runat = "server" />
</div>
</form>
</body>
</html>
Fişierul .aspx.cs:
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Expresie</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<input id="nr1" type="text" runat = "server"/>
<input id="Button1" type="button" value="Calculeaza" runat = "server"
onserverclick = "calcul"/><br />
<p id = "rezultat" runat = "server" />
</div>
</form>
</body>
</html>
Fişierul .aspx
Fişierul .aspx.cs
III.2.7. Tablouri în C#
Aceeaşi declarare poate fi scrisă printr-o singură instrucţiune: int[] v = new int[10];
La declararea tabloului se poate realiza şi iniţializarea elementelor sale: int[] v= {1,2,3,4 };
68
Pentru a afişa elementele tabloului, se pot folosi atât instrucţiunile repetitive clasice,
cât şi o instrucţiune pentru parcurgerea colecţiilor de date, numită foreach.
Exemplul 3.10. Afişarea unui tablou folosind instrucţiunea for.
int[] v = { 1, 2, 3, 4 };
for (int i = 0; i < v.Length; i++)
mainDiv.InnerHtml += v[i] + " ";
Observaţii:
Proprietatea Length returnează numărul de elemente din tablou.
Clasa Array pune la dispoziţia programatorului alte câteva metode pentru prelucrarea
vectorilor:
Sort(tablou) – sortează crescător elementele din vectorul trimis ca parametru
Exemplu: Array.Sort(w);
Reverse(tablou) – inversează elementele vectorului trimis ca parametru
Exemplu: Array.Reverse(w);
IndexOf(tablou, valoare) – caută o valoare în vector, şi returnează -1 dacă nu se
găseşte, respectiv poziţia pe care se găseşte valoarea în vector.
Exemplul 3.15
if ((poz = Array.IndexOf(v, 3)) != -1)
mainDiv.InnerHtml+= "Elementul cautat se gaseste in vector pe pozitia "+poz;
else
mainDiv.InnerHtml += "Elementul cautat nu se gaseste in vector";
Exemplul 3.16 Exemplul următor este o pagină web, care prezintă modul de utilizare a
vectorilor.
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Tablouri</title>
</head>
<body>
<form id="form1" runat="server">
<div id = "mainDiv" runat = "server">
</div>
</form>
</body>
</html>
Fişierul .aspx
Fişierul .aspx.cs
mainDiv.InnerHtml += "<br/>";
//Suma si media aritmetica a elementelor
mainDiv.InnerHtml += "Suma elementelor din vector este: " + v.Sum() + "<br/>";
mainDiv.InnerHtml += "Media elementelor din vector este: " + v.Average() + "<br/>";
//Copierea elementelor unui vector intr-un alt vector
v.CopyTo(w, 0);
mainDiv.InnerHtml += "Elementele vectorului sunt: ";
for (int i = 0; i < w.Length; i++)mainDiv.InnerHtml += w[i] + " ";
mainDiv.InnerHtml += "<br/>";
//Compararea a doi vectori
if (v.Equals(w) == true)
{
mainDiv.InnerHtml += "Cei doi vectori au aceleasi elemente <br/>";
}
else
{
mainDiv.InnerHtml += "Cei doi vectori nu au aceleasi elemente <br/>";
}
//Sortarea elementelor vectorului
w[3] = 5;
Array.Sort(w);
mainDiv.InnerHtml += "Vectorul sortat: ";
foreach (int i in w) mainDiv.InnerHtml += i + " ";
mainDiv.InnerHtml += "<br/>";
//Inversarea elementelor
Array.Reverse(w);
mainDiv.InnerHtml += "Vectorul inversat: ";
for (int i = 0; i < w.Length; i++) mainDiv.InnerHtml += w[i] + " ";
mainDiv.InnerHtml += "<br/>";
Figura 3.4
Exemplul 3.19
mainDiv.InnerHtml += s.Trim() + "<br/>";
mainDiv.InnerHtml += s.TrimEnd() + "<br/>";
mainDiv.InnerHtml += s.TrimStart() + "<br/>";
72
CompareTo() - returnează valoarea 0 dacă şirurile sunt egale, o valoare mai mică decât 0
dacă şirul 1 mai mic decât şirul2, şi o valoare mai mare ca 0 dacă şirul 1 este mai mare
decât şirul 2.
Exemplul 3.22
int value = s1.CompareTo(s2);
if ( value == 0)
{mainDiv.InnerHtml += "Sirurile sunt egale <br/>";}
else
if (value < 0)
{mainDiv.InnerHtml += s1 + " mai mic decat " + s2 + "<br/>";}
else
{mainDiv.InnerHtml += s1 + " mai mare decat " + s2 + "<br/>";}
5. Operaţii cu subşiruri.
Extragerea unui subşir dintr-un şir este realizată de metoda substring(poziţie, lungime)
string s = "Hello World";
mainDiv.InnerHtml += s.Substring(6) + "<br/>";
Va afişa pe ecran şirul „World”.
mainDiv.InnerHtml += s.Substring(6,3) + "<br/>";
Va afişa pe ecran şirul „Wor”.
Limbajul de scripting server-side ASP.NET 73
Căutarea unui subşir într-un şir este realizată de metoda Contains(subşir). Returnează
valoarea true dacă subşirul este găsit, şi false în caz contrar.
Exemplul 3.23
string s = "Hello World", s1 = "He";
if (s.Contains(s1) == true)
{mainDiv.InnerHtml += "Subsirul " + s1 + " se gaseste in sirul " + s + "<br/>";}
else
{mainDiv.InnerHtml += "Subsirul " + s1 + " nu se gaseste in sirul " + s + "<br/>";}
Căutarea primei apariţii a unui subşir într-un şir se realizează cu ajutorul metodei
IndexOf(subşir, poziţie, lungime, mod_comparare). Dacă subşirul nu se găseşte în şir, se
returnează valoarea -1, altfel se returnează poziţia pe care se găseşte subşirul în şir.
Rezultatul va fi următorul:
13.10.2008 22:30:00
14.10.2008 00:00:00
14.10.2008 10:50:23
74
Metodele şi proprietăţile care se aplică unei variabile de tip dată calendaristică sunt:
ToShortDateString() – returnează o dată calendaristică în forma scurtă
mainDiv.InnerHtml += d1.ToShortDateString() + "</br>";Afişează: 14.10.2008
ToLongDateString() – returnează o dată calendaristică în forma desfăşurată
mainDiv.InnerHtml += d1.ToLongDateString() + "</br>";Afişează: 14 octombrie 2008
ToShortTimeString() – returnează ora, minutele dintr-o variabilă de tip dată calendaristică
mainDiv.InnerHtml += d1.ToShortTimeString() + "</br>"; Afişează: 22:30
ToLongTimeString() – returnează ora, minutele şi secundele dintr-o variabilă de tip dată
calendaristică
mainDiv.InnerHtml += d1.ToLongTimeString() + "</br>"; Afişează: 22:30:00
Day – proprietate care returnează ziua dintr-o dată calendaristică
mainDiv.InnerHtml += d1.Day + "</br>"; Afişează: 14
Month – proprietate care returnează luna dintr-o dată calendaristică
mainDiv.InnerHtml += d1.Month + "</br>"; Afişează: 10
Year – proprietate care returnează ziua dintr-o dată calendaristică
mainDiv.InnerHtml += d1.Year + "</br>"; Afişează: 2008
DayOfYear – proprietate care returnează numărul zilei din cadrul anului
mainDiv.InnerHtml += d1.DayOfYear + "</br>"; Afişează: 288
DayOfMonth – proprietate care returnează ziua din cadrul săptămânii
mainDiv.InnerHtml += d1.DayOfWeek + "</br>"; Afişează: Tuesday
Rezultatul va fi următorul:
04.09.2008
24.08.2009
Ziua de 24 octombrie 2008 va fi peste 1 an in ziua de Saturday
2. Timpul scurs între două date calendaristice poate fi aflat prin aplicarea următoarelor
proprietăţi diferenţei dintre două date calendaristice: TotalSeconds, TotalMinutes,
TotalHours, TotalDays:
R
Modelul client-server 75
ezultatul va fi: 4
Controalele server web oferă facilităţi superioare controalelor server Html. Astfel,
controalele web sunt puternic orientate obiect, permit legarea la diferite surse de date,
detectează automat tipul browserului şi afişarea pe client va fi optimizată în funcţie de
capabilităţile acestuia.
Un control web poate fi creat fie în modul design (din fereastra Toolbox), fie în pagina
.aspx folosind tag-urile <asp> </asp>.
<asp:Label ID="Label1" runat="server" Text="Hello world!"></asp:Label>
Controalele web pot răspunde la diferite evenimente. De exemplu, un obiect de tip
button generează evenimentul Click atunci când utilizatorul apasă butonul. În momentul
apariţiei unui eveniment, se realizează o cerere către server, iar datele din pagina web sunt
trimise serverului. Aici se execută codul C# asociat evenimentului, iar rezultatul este trimis
către client.
Valorile proprietăţilor controalelor web pot fi setate prin trei moduri:
în modul design din fereastra Properties
în sursă paginii (fişierul .aspx)
prin intermediul codului C# executat pe server
În continuare sunt prezentate câteva dintre cele mai folosite controale web pentru
realizarea interfeţei.
76
IV.1.1. Label
Permite afişarea unui şir de caractere în pagina web. Textul este reţinut în
proprietatea Text:
<asp:Label ID="Label1" runat="server" Font-Bold="True" Font-Size="Large"
ForeColor="#0066FF" Text="Evenimente butoane">
</asp:Label>
Modificarea valorii proprietăţii ImageUrl se poate realiza fie în modul design, fie direct
în codul aspx:
<asp:ImageButton ID="ImageButton1" runat="server" Height="27px"
ImageUrl="~/images/button.jpg" onclick="ImageButton1_Click" Width="85px" />
Exemplul 4.1 La apăsarea unui dublu click pe controlul de tip button se generează
antetul metodei care va conţine codul C# care va fi executat la apariţia evenimentului Click:
IV.1.3. TextBox
Afişează o casetă de dialog în care utilizatorul poate introduce date. Şirul de
caractere introdus, este reţinut de proprietatea Text. Proprietatea TextMode defineşte modul
în care utilizatorul poate introduce datele: SingleLine, MultiLine, Password.
Exemplul 4.2 Aplicaţia următoare permite introducerea unui text, care la apăsarea
butonului va fi afişat pe ecran de către controlul Label2.
Verificarea dacă s-a bifat sau nu caseta, se realizează prin intermediul proprietăţii Checked:
protected void Button1_Click(object sender, EventArgs e)
{
if (CheckBox1.Checked == true)
{
Label1.Text = "Ati selectat checkbox-ul";
}
else
{
Label1.Text = "Nu ati selectat checkbox-ul";
}
}
1. Prin cod:
<asp:CheckBoxList ID="CheckBoxList1" runat="server"
BorderColor="#0066CC"
BorderStyle="Solid" RepeatDirection="Horizontal"
RepeatLayout="Flow">
<asp:ListItem>Buzau</asp:ListItem>
<asp:ListItem>Bucuresti</asp:ListItem>
<asp:ListItem>Craiova</asp:ListItem>
</asp:CheckBoxList>
2. În modul design:
Controlul CheckBoxList are asociat o proprietate numită Items. Items este un vector
care conţine valorile din controlul CheckBoxList. La rândul său are proprietatea Count ce
returnează numărul de valori din listă. Fiecare element poate fi accesat prin intermediul unui
indice. În exemplul de mai sus, CheckBoxList.Items[1].Text este şirul de caractere
„Bucureşti”. Pentru a verifica dacă a fost
bifată o anumită casetă, se foloseşte
proprietatea Selected, care poate avea
valorile True sau False.
Efectul execuţiei este următorul:
IV.1.5. RadioButton
Afişează un buton radio. Dintr-un grup de butoane radio, doar unul poate fi selectat la
un moment dat.
Proprietatea Text a acestui control, defineşte şirul de caractere ce apare în dreptul
controlului. Pentru a grupa mai multe butoane radio, se foloseşte proprietatea GroupName.
Exemplu:
<asp:RadioButton ID="RadioButton1" runat="server" GroupName="stareCivila"
Text="Casatorit" /><br />
<asp:RadioButton ID="RadioButton2" runat="server" GroupName="stareCivila"
Text="Necasatorit" />
Exemplul 4.5 Ca şi în cazul controlului CheckBox, verificarea dacă s-a bifat sau nu
butonul radio se realizează prin intermediul proprietăţii Checked.
IV.1.6. RadioButtonList
Afişează un grup de butoane radio. Ca şi CheckBoxList, acest control are proprietăţile
RepeatDirection, RepeatLayout şi Items. Pentru fiecare opţiune din listă se poate asocia o
valoare de tip şir de caractere, prin intermediul atributului value.
Exemplul 4.6 Adăugarea de valori în listă poate fi realizată în modul design sau prin
intermediul codului din fişierul .aspx.
1. Prin cod:
<asp:RadioButtonList ID="RadioButtonList1"
runat="server"
RepeatDirection="Horizontal" RepeatLayout="Flow">
<asp:ListItem Value="1">Bucuresti</asp:ListItem>
<asp:ListItem Value="2">Buzau</asp:ListItem>
<asp:ListItem Value="3">Craiova</asp:ListItem>
</asp:RadioButtonList>
2. În design mode:
IV.1.7. BulletList
Afişează o listă numerotată. Proprietatea BulletStyle defineşte tipul de marcator, şi
poate avea valorile: NotSet, Numbered, LowerAlpha, UpperAlpha, LowerRoman,
UpperRoman, Disc, Circle, Square.
Proprietatea DisplayMode defineşte modul în care sunt afişate valorile din listă: Text,
HyperLink, LinkButton. În cazul selectării tipului de afişare ca HyperLink, atributul value
reţine adresa http:
IV.1.8. Image
Afişează o imagine în pagina web. Proprietatea ImageUrl defineşte calea către fişierul
care conţine imaginea. Textul afişat de browser atunci când user-ul poziţionează mouse-ul
peste imagine, este reţinut de proprietatea AlternateText.
<asp:Image ID="Image1" runat="server" ImageUrl="~/images/movie1.jpeg"
Height="406px" Width="265px" AlternateText="Jaws" />
IV.1.9. DropDownList
Permite selectarea unei opţiuni dintr-o listă derulantă. Ca şi celelalte controale
de tip list, DropDownList are proprietăţile Item şi SelectedValue. De asemenea, proprietatea
SelectedItem returnează obiectul selectat din lista derulantă.
Exemplul 4.7 Pagina web următoare permite selectarea unui film dintr-o listă
derulantă, iar la apăsarea butonului Submit, în controlul de tip Image este afişat posterul
filmului selectat. Posterele sunt fişiere cu extensia .jpg, care au fost salvate în directorul
images din cadrul proiectului.
Figura 4.10 Fişierele cu imagini adăugate în directorul images din cadrul proiectului
Atributul value pentru controlul DropDownList reţine numele fişierului care conţine
imaginea, iar atributul text reţine numele filmului, care va fi folosit pentru proprietatea
AlternateText:
IV.1.10. HyperLink
Este un control folosit pentru afişarea unui hyperlink în pagina web. Are
proprietăţile Text pentru şirul de caractere ce va fi afişat în pagină, respectiv NavigateUrl
pentru adresa http. Modul de deschidere a link-ului în browser, poate fi specificat prin
intermediul proprietăţii Target, care are valorile: _blank, _parent, _search, _self, _top.
Controlul BulletList are asociat evenimentul Click. Funcţia care se execută la apariţia
acestui eveniment, are ca parametru un obiect de tipul BulletedListEventArgs cu proprietatea
Index. Valoarea acestei proprietăţi este indexul opţiunii din lista de marcatori care a generat
evenimentul click.
IV.1.13. FileUpload
Permite upload-ul unui fişier pe server-ul web. Afişează o casetă de text împreună cu
un buton Browse, prin intermediul căruia se poate selecta fişierul dorit. Pentru a realiza
88
efectiv upload-ul, trebuie utilizat un buton (sau alt control) care să conţină codul C# pentru
upload.
Controlul FileUpload are următoarele metode şi proprietăţi:
Nume Descriere
HasFile Metodă care returnează true sau false dacă utilizatorul a
selectat un fişier pentru upload
SaveAs Metodă care salvează fişierul selectat pe server. Are ca
parametru calea destinaţie
FileName Proprietate care reţine numele fişierului
PostedFile Proprietate care conţine informaţii despre fişierul upload-at
ContentType Proprietate care returnează tipul fişierului upload-at
ContentLength Proprietate care returnează dimensiunea fişierului upload-at.
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><title>Untitled Page</title></head>
<body>
<form id="form1" runat="server">
<div>
<asp:FileUpload ID="FileUpload1" runat="server" Width="265px" />
<asp:Button ID="Button1" runat="server" onclick="Button1_Click"
PostBackUrl="~/Default.aspx" Text="Upload" /><br
/><br />
<asp:Label ID="Label1" runat="server" Font-Bold="True"></asp:Label>
</div></form></body></html>
Modelul client-server 89
Codul C# care se execută la apăsarea butonului Upload este cel care realizează
efectiv upload-ul fişierului selectat:
IV.1.14. Evaluare
1. Realizaţi o pagină web care să conţină un test grilă cu 5 întrebări. Întrebările pot fi cu
un singur răspuns sau cu răspunsuri multiple. La apăsarea unui buton numit Punctaj, va fi
afişat în pagină rezultatul testului (la câte întrebări s-a răspuns corect). La apăsarea unui
buton numit Reset, se vor reiniţializa variantele de răspuns, şi se va şterge rezultatul testului
precedent.
Indicaţie: Pentru variantele de răspuns corecte se poate folosi proprietatea value a unui
element din CheckBoxList sau RadioButtonList.
2. Modificaţi pagina web de mai sus, astfel încât după selectarea unei variante, aceasta
să devină inactivă.
Indicaţie: Se va modifica proprietatea enabled.
3. Realizaţi o pagină web care conţine un test grilă cu 3 întrebări şi care îndeplineşte
următoarele condiţii:
Întrebările sunt afişate prin intermediul unui control BulletList , de tip LinkButton.
Variantele de răspuns pentru fiecare întrebare sunt poziţionate într-un control de
tip view al unui control multiview.
Răspunsurile sunt cu o singură variantă corectă, aceasta având valoarea 1.
La selectarea unei întrebări, se afişează variantele de răspuns corespunzătoare.
La apăsarea unui buton Punctaj se calculează punctajul final, care va fi afişat
prin intermediul unui control Label.
90
4. Realizaţi un site web care conţine 5 pagini web, fiecare având câte o întrebare a unui
test grilă. Testul grilă va avea întrebări cu o singură variantă de răspuns corectă. În fiecare
pagină va exista un hyperlink către pagina următoare (cu excepţia ultimei).
5. Realizaţi o pagină web care să afişeze un formular de introducere a informaţiilor
despre un produs: denumire, preţ, unitatea de măsură, data expirării, dacă i se aplică adaos
comercial sau nu. Pentru data expirării se va folosi câte un control de tip DropDownList
pentru zi, lună an. Data curentă va fi selectată implicit. Valorile pentru DropDownList-ul ce
conţine anul, vor fi în intervalul [an_curent, an_curent + 10].
6. Realizaţi o pagină web care permite utilizatorului să facă upload pentru un fişier de tip
imagine. Fişierul upload-at va fi afişat printr-un control de tip Image.
7. Realizaţi o pagină web care va afişa un calculator capabil să efectueze adunări,
scăderi, împărţiri, înmulţiri, operaţia de ridicare la putere, calculul n!. Fiecare tastă a
calculatorului va fi un control de tip Button.
Post Back este fenomenul prin care la generarea unui eveniment de către utilizator
(client), pagina web este transmisă server-ului, unde se poate executa o secvenţă de cod
care să trateze evenimentul respectiv.
Unele controale generează automat un post back către server. De exemplu controlul
Button generează un post back la apăsarea butonului. Alte controale nu generează un post
back automat. De exemplu, controlul TextBox are un eveniment numit TextChanged. Acesta
este generat de fiecare dată când valoarea din caseta de text este modificată. Implicit acest
eveniment nu generează un post back. Însă, în cazul în care un alt control generează un
post back (de exemplu un buton), în momentul executării codului pe server, este tratat prima
dată evenimentul TextChanged şi apoi evenimentul Click al butonului.
Dacă proprietatea AutoPostBack are valoarea true, atunci controlul respectiv va
genera automat un post back.
Când vom rula pagina, vom constata totuşi că nu este afişat controlul TextBox.
Pentru a se executa metoda CheckBox1_CheckedCanged, pagina trebuie retrimisă
serverului în momentul bifării checkbox-ului. Serverul trebuie sa execute codul şi apoi să
retrimită către browser pagina în care textbox-ul este vizibil. De aceea controlul CheckBox
trebuie să genereze acţiunea de post back. Pentru aceasta trebuie setată proprietatea
AutoPostBack cu valoarea true.
Figura 4.16 Afişarea imaginii se face la selectarea unei opţiuni din controlul DropDownList
Pentru aceasta, vom stabili valoarea true proprietăţii AutoPostback pentru controlul
DropDownList. Apoi, codul care se executa la apăsarea butonului va fi executat la
generarea evenimentului SelectedIndexChanged pentru controlul DropDownList.
Obiectul Page asociat fiecărei pagini web poate fi folosit pentru a verifica dacă a
avut loc o acţiune de post back, sau este prima încărcare a paginii. Astfel, proprietatea
IsPostBack are valoarea true dacă un control a generat o acţiune de post back, şi false în
caz contrar.
92
Exemplul 4.14 Pentru a şti când să realizăm iniţializarea valorii din TextBox cu 0, folosim
proprietatea IsPostBack:
IV.2.1. Evaluare
1. Să se realizeze o pagină web care conţine un test grilă, în care întrebările sunt replici
celebre din filme, iar variantele de răspuns reprezintă un nume de film. La selectarea
răspunsului corect, va fi afişata o imagine care conţine poster-ul filmului respectiv. (Iniţial
controlul Image are proprietatea visible = false).
2. Să se realizeze o pagină web care conţine un test grilă în care întrebările au o
singură variantă de răspuns corectă. Rezultatul testului va fi afişat prin intermediul unui
control TextBox, pentru care utilizatorul nu poate modifica valoarea. La prima încărcare a
paginii, rezultatul va avea valoarea 0. La fiecare selectare a unei variante de răspuns, se va
reactualiza valoarea rezultatului.
Modelul client-server 93
IV.3.1. RequiredFieldValidator
Verifică dacă în caseta de text asociată s-au introdus date de către utilizator. Se
foloseşte pentru formularele de date în care câmpurile sunt obligatorii.
IV.3.2. RangeValidator
Verifică dacă datele introduse în caseta de text asociată fac parte dintr-un anumit
interval. Proprietăţile MinimumValue şi MaximumValue permit introducerea limitelor
intervalului. Tipul valorilor din interval poate fi specificat prin intermediul proprietăţii Type.
IV.3.3. RegularExpressionValidator
Se foloseşte pentru validarea datelor care trebuie să respecte un anumit format, cum
ar fi numere de telefon, adrese de email, etc. Proprietatea ValidationExpression permite
alegerea unei expresii predefinite.
IV.3.4. CompareValidator
Compară valoarea introdusă în controlul asociat, cu o valoare predefinită.
Proprietatea ValueToCompare reţine această valoare. Tipul de comparare este definit de
proprietatea Operator, valorile sale posibile fiind: Equal, NotEqual, GreaterThan,
GreaterThanEqual, LessThan, LessThanEqual, DataTypeCheck. Tipul valorilor comparate
este specificat de proprietatea Type.
94
IV.3.5. CustomValidator
Pe lângă aceste controale predefinite, programatorul poate defini reguli proprii de
validare, prin intermediul controlului CustomValidator. Validarea se poate realiza prin
intermediul unei funcţii client-side (folosind javaScript), sau la nivel de server.
Exemplul 4.15 Următoarea aplicaţie foloseşte controalele prezentate mai sus pentru
validarea datelor introduse de utilizator:
Pentru selectarea oraşului s-a folosit un control de tip DropDownList, pentru care
proprietatea AutoPostBack are valoarea true. Astfel, la selectarea unui element din listă se
va realiza automat validarea opţiunii (fără să se aştepte apăsarea butonului de submit).
Fiecare element are o valoare asociată prin intermediul proprietăţii value. (prima opţiune are
valoarea 0). Validarea se realizează prin intermediul unui control CompareValidator:
La prima încărcare a paginii, controlul TextBox care permite introducerea unei adrese
web este inactiv. Pentru aceasta, proprietatea Enabled va avea valoarea false. De
asemenea, controlul de tip hyperlink nu va fi vizibil iniţial pe ecran, proprietatea sa Visible
având valoarea false.
Exemplul 4.16 Controlul de tip CheckBox are proprietatea AutoPostBack = true. Astfel,
la bifarea sau debifarea sa, se va realiza o acţiune de post back către server, unde se va
executa codul C# corespunzător evenimentului CheckedChanged:
96
Exemplul 4.17 Pentru a verifica dacă valoarea introdusă pentru URL poate fi o adresă
validă, se foloseşte controlul RegularExpressionValidator.
IV.3.6. Evaluare
Este un control care permite afişarea unei imagini care conţine zone speciale numite
hot spots. Când utilizatorul apasă un click cu mouse-ul într-o astfel de regiune se poate
realiza una din următoarele acţiuni:
controlul trimite pagina înapoi către server unde se poate executa un anumit
cod (se generează un postBack)
utilizatorul este redirectat către o altă pagină (hyperlink).
Proprietatea ImageUrl definieşte calea către fişierul care conţine imaginea.
Proprietatea HotSpots este o colecţie de obiecte de tip HotSpot. Un obiect HotSpot poate fi
de formă circulară, rectangulară sau poligonală. Orice HotSpot are proprietăţile:
Nume Descriere
AlternateText Textul care apare când user-ul poziţionează mous-ul peste hot spot
HotSpotMode Poate avea una din valorile: NotSet, None, PostBack, Navigate. Dacă
se alege PostBack, la apăsarea hotSpot-ului se realizează un post
back către server. În cazul opţiunii Navigate, utilizatorul este
redirectat către o altă pagină.
NavigateUrl Reţine URL-ul paginii către care se realizează redirectarea
PostBackValue Defineşte o valoare care va returnată server-ului în momentul când
se realizează un post back
Target Defineşte modul în care este deschisă pagina web către care se
realizează redirectarea
Exemplul 4.18 Judeţul Buzău de pe harta din fişierul romania.gif, va avea asociat un
hotSpot de tip circle, judeţul Dolj un hotSpot de tip rectangle, iar judeţul Timiş un hotSpot de
tip polygon.
<asp:ImageMap ID="ImageMap1" runat="server" HotSpotMode="PostBack"
ImageUrl="~/Images/romania.gif" onclick="ImageMap1_Click1">
<asp:CircleHotSpot HotSpotMode="PostBack" AlternateText="Buzau"
PostBackValue="1" Radius="30" Target="_blank" X="545" Y="370" />
<asp:RectangleHotSpot AlternateText="Dolj" Bottom="535"
HotSpotMode="PostBack" Left="236" PostBackValue="2" Right="314"
Target="_blank" Top="480" />
<asp:PolygonHotSpot Coordinates="14,261, 65,339, 100,336, 112,319, 173,315,
165,293" HotSpotMode="PostBack" PostBackValue="3" Target="_blank"
AlternateText="Timis" />
</asp:ImageMap>
Modelul client-server 99
În acest exemplu, fiecare HotSpot generează un post back către server cu o anumită
valoare. La un click pe hotSpot, se generează evenimentul Click pentru controlul ImageMap.
Metoda care se va executa pe server, are un parametru de tip ImageMapEventArgs. Acest
obiect are proprietatea PostBackValue care reţine valoarea returnată de hotSpot.
Figura 4.20 Modificarea proprietăţilor unui obiect HotSpot pentru controlul ImageMap
<html xmlns="http://www.w3.org/1999/xhtml">
<head
runat="server"><title>Buzau</title></head>
<body>
<form id="form1" runat="server">
<div>
<asp:ImageButton ID="ImageButton1"
runat="server" ImageUrl="~/Images/buzau.jpg"/>
</div>
</form>
</body>
</html>
IV.4.2. Ad Rotator
Este un control care afişează în pagina web o imagine (de obicei un banner de
reclamă), pe care user-ul poate da click, fiind redirectat către o altă pagină web. La fiecare
încărcare a paginii web se va fişa o altă imagine aleasă aleator. Fişierele cu imagini
împreună cu link-urile de redirect se găsesc într-o sursă de date, de exemplu un fişier XML.
XML este un standard pentru descrierea de marcaje. Un fişier XML are extensia .xml,
şi conţine elemente definite de utilizator, într-o structură ierarhică. Pentru a adăuga un fişier
XML în cadrul proiectului, în fereastra Solution Explorer, se alege opţiunea Add New Item,
şi apoi XML File.
Pentru a putea fi utilizat ca sursă de date pentru controlul adRotator, fişierul XML
trebuie să conţină valori pentru următoarele proprietăţi:
Nume Descriere
ImageUrl Calea către fişierul care conţine imaginea
NavigateUrl URL-ul către care se realizează redirectarea la un click pe imagine
AlternateText Textul care apare la poziţionarea mouse-ului peste imagine
Keyword O categorie pentru reclama, după care se pot realiza filtrări
Impressions Un număr care reprezintă „importanţa” reclamei respective. Cu cât
este mai mare, cu atât imaginea va fi afişată mai des.
Singura proprietate obligatorie este ImageUrl.
Exemplul 4.20 În următorul exemplu, va fi folosit un fişier ads.xml care conţine trei
reclame. Proprietăţile pentru fiecare reclamă trebuie cuprinse între tag-urile <Ad> şi </Ad>.
Tag-ul rădăcină pentru fişierul XML este <Advertisements>.
102
Exemplul 4.21 După adăugarea controlului în pagina web, trebuie aleasă sursa de date:
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><title>Ad rotator</title></head>
<body>
<form id="form1" runat="server">
<div>
<asp:AdRotator ID="AdRotator1" runat="server" DataSourceID="ads"
Target="_blank" />
<asp:XmlDataSource ID="ads" runat="server"
DataFile="~/App_Data/ads.xml"></asp:XmlDataSource>
</div>
</form></body></html>
În urma execuţiei paginii web, va fi afişată random la reîncărcarea paginii, una din
imaginile:
IV.4.3. Calendar
Este un control care afişează în pagina web un calendar, din care utilizatorul poate
alege o dată oarecare. Modul în care utilizatorul poate selecta o dată calendaristică este
definit de proprietatea SelectionMode, care poate avea valorile:
104
Valoare Descriere
Day Utilizatorul poate selecta doar o zi
DayWeek Utilizatorul poate selecta o săptămână
DayWeekMonth Utilizatorul poate selecta o lună
None Selecţia unei date este dezactivată
Popularea celor două DropDown-uri este realizată prin intermediul codului C#.
Metodele monthInit(), respectiv yearInit() folosesc metoda Add aplicată vectorului Items
pentru adăugarea de valori în listă.
După popularea DorpDown-urilor, selectarea lunii şi anului ce corespund datei
curente se realizează prin modificarea proprietăţii selected a unui element din listă. Pentru a
determina elementul curent, se apelează metoda FindByValue pentru vectorul de itemi din
DropDown:
yearCmb.Items.FindByValue(DateTime.Now.Year.ToString()).Selected = true;
monthCmb.Items[DateTime.Now.Month - 1].Selected = true;
Exemplul 4.23
Cele două controale DropDownList au setată valoarea true pentru proprietatea
AutoPostBack. Astfel la selecţia unui element din listă, se generează un post back către
106
IV.4.4. Evaluare
1. Realizaţi un site web care să conţină informaţii despre statele uniunii Europene.
Pagina de index va conţine o imagine cu harta Europei, iar la un click pe o anumită ţară se
va deschide o pagină nouă, în care sunt afişate informaţiile despre ţara selectată. De
asemenea, în pagina principală trebuie să existe o zonă de header unde va fi afişat un
banner cu steagul unei ţări la fiecare încărcare a paginii. La un click pe banner se va
deschide pagina de internet oficială a ţării respective.
2. Realizaţi o pagină web care conţine un formular de introducere a datelor unui angajat.
Data naşterii şi data angajării trebuie să fie alese prin intermediul unui control calendar.
Unele controale prezentate până acum, permit ca datele care le populează să poată
fi preluate din diverse surse de date : tablouri, fişiere XML, baze de date. De exemplu
controalele de tip „list”: CheckBoxList, RadioButtonList, DropDownList, ListBox, etc.
Proprietăţile şi metodele care permit conectarea unui control la o sursă de date sunt:
Nume Descriere
DataSource Numele sursei de date
DataTextField Câmpul din sursa de date care va popula proprietatea text a
controlului
DataValueField Câmpul din sursa de date care va popula proprietatea value a
controlului
DataBind Metodă care populează controlul cu datele din sursa de date
Exemplul 4.25
Aplicaţia următoare foloseşte un control ListBox pentru care se poate modifica sursa
de date prin intermediul unor butoane radio.
Figura 4.30 Interfaţa aplicaţiei pentru popularea datelor din controlul ListBox
108
Numele este folosit pentru popularea proprietăţii Text, iar media pentru popularea
proprietăţii Value pentru controlul ListBox.
Iniţial butonul Selectează nu este activ (proprietatea Enabled are valoarea false)
deoarece nu este nici un element în listă. De fiecare dată când se apasă butonul Adaugă,
vechile elemente sunt şterse din listă, şi butonul Selectează devine activ. La apăsarea
acestui buton, pentru elementul selectat din listă se afişează perechea text / value.
ListBox1.DataSource = elevi;
ListBox1.DataBind();
ListBox1.Items[0].Value = "9";
ListBox1.Items[1].Value = "8";
}
switch (RadioButtonList1.SelectedValue)
{
case "1": add(); break;
case "2": listItem(); break;
case "3": vector(); break;
case "4": xml(); break;
}
}
}
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><title>Hidden</title></head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server"></asp:Label>
<asp:Button ID="Button1" runat="server" Text="+" />
<asp:HiddenField ID="nr" runat="server" />
</div>
</form></body></html>
Modelul client-server 111
Fişierul .aspx.cs
IV.6.2. ViewState
În ASP.Net, toate controalele server web îşi păstrează starea între două acţiuni de
post back. Acest lucru se realizează prin intermediul proprietăţii EnableViewState, care are
implicit valoarea true.
Exemplul 4.27 De exemplu, dacă într-o pagină web există un control TextBox şi un
Buton, iar utilizatorul introduce date în caseta de text şi apasă butonul, se generează o
acţiune de post back către server. În momentul în care server-ul întoarce rezultatul prelucrării
către browser, controlul TextBox îşi păstrează valoarea.
În momentul generării codului Html de către server, se generează un control html de
tip <input type=”hidden”...> , a cărui valoare este un şir de caractere ce codifică starea
controalelor din pagină:
<input type=”hidden” name=”__VIEWSTATE” id=”__VIEWSTATE”
value=”/wEPDwULLTE1OTg1NDYyNDZkZFCFstl/DwSGv81TuCB397Tk5+CJ” />
Datele sunt codificate Base64, ceea ce asigură securitatea, dar creşte timpul de
încărcare al paginii.
Programatorul poate adăuga valori în obiectul ViewState folosind metoda Add(cheie,
valoare):
112
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server"><title>View State</title></head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="__"></asp:Label>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="+" />
</div>
</form></body></html>
Fişierul .aspx.cs
if (ViewState["n"].ToString().Length == 1)
{//dacă valoarea este o cifră, se mai adauga un „0”
Label1.Text = "0" + ViewState["n"].ToString();
}
else
{
Label1.Text = ViewState["n"].ToString();
}
}
Modelul client-server 113
IV.6.3. Cookies
Un cookies este o secvenţă de text care este salvată pe calculatorul user-ului.
Valorile din cookie sunt perechi de forma cheie/valoare. De obicei, cookie-urile sunt folosite
pentru a reţine informaţii despre un user, la vizitarea unei pagini web. Când user-ul revine pe
un site, informaţiile din cookie sunt citite, ajutând la identificarea rapidă a utilizatorului. Pe
lângă valori, pentru un cookie se poate stabili durata de viaţă în calculatorul clientului.
Pentru a adăuga un cookie, se foloseşte proprietatea Cookies a obiectului Response.
Această proprietate este un vector asociativ, de tip cheie/valoare:
Response.Cookies["cheie"].Value = valoare
Timpul de viaţă al cookie-ului se stabileşte prin intermediul proprietăţii Expires.
Avantajul folosirii cookie-urilor este acela că informaţia este disponibilă în orice
pagină la revenirea userului în site, după o anumită perioadă. Printre dezavantaje amintim:
nu sunt potrivite pentru a reţine date importante
cookie-urile pot fi dezactivate din browser
sunt încărcate pentru fiecare cerere, ducând la creşterea traficului
Exemplul 4.29
În exemplul următor, datele introduse de utilizator într-o casetă text, sunt salvate într-
un cookie. Într-o a doua pagină web, datele sunt extrase din cookie şi afişate prin intermediul
unui control Label.
Pagina Default.aspx
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Cookie</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click"
Text="Submit" />
</div>
</form>
</body>
</html>
public partial class _Default : System.Web.UI.Page
{
protected void Button1_Click(object sender, EventArgs e) L
{
a
if (TextBox1.Text.Trim().Length > 0)
{ apăsare
Response.Cookies["userName"].Value = TextBox1.Text;
Response.Cookies["userName"].Expires.AddMinutes(10); a
//timpul de viata al cookie-ului este de 10 minute
}
Response.Redirect("Default2.aspx");
}
}
114
Exemplul 4.30
În următorul exemplu, datele introduse într-o pagină web sunt folosite pentru
construirea unui query string. Acest şir de caractere este de fapt o adresă a unei pagini web,
către care se va face o redirectare. Datele sunt introduse prin intermediul a două controale
de tip TextBox, iar la apăsarea unui buton se va realiza acţiunea de redirect.
În cea de a doua pagină, valorile sunt extrase din query string şi afişate prin
intermediul unui control Label.
Codul C# asociat butonului este:
Exem
plul 4.32
if (Request.QueryString["media"].Trim() != null)
{
Label2.Text = "Media:" + Request.Params["media"].ToString();
}
}
}
Exemplul 4.33
Metoda Transfer are un al doilea parametru numit preserveForm, care poate avea
valorile true sau false. În cazul în care parametrul are valoarea true, query string-ul şi valorile
controalelor din formularul paginii iniţiale, vor putea fi accesate în pagina către care se
realizează redirect-ul.
Exemplul de mai sus poate fi rescris folosind metoda Server.Transfer astfel:
la apăsarea butonului din prima pagină, se apelează Server.Transfer pentru a
realiza redirect-ul către a doua pagină.
Exemplul 4.34
Exemplul 4.35
Form este un vector asociativ, în care id-ul unui control este cheia, iar valoarea este
reprezentată de datele introduse în controlul respectiv. TextBox1 şi TextBox2, reprezintă id-
urile controalelor de tip TextBox din prima pagină.
IV.6.5. Session
Obiectul Session este creat pe serverul web la prima accesare a sitului de către un
utilizator şi rămâne în memorie atât timp cât utilizatorul rămâne conectat la site. Pentru a
adăuga un obiect în sesiune, trebuie doar să scriem un cod de genul următor:
protected void Button1_Click(object sender, EventArgs e)
{
Session["nume"] = "Hello World!";
}
Modelul client-server 117
Exemplul 4.36
Session este de fapt un dicţionar (listă de perechi cheie – valoare), în care valorile
sunt de tip object. Ceea ce înseamnă că la citirea unor valori din sesiune va trebui să
realizăm o conversie de tip.
protected void Button2_Click(object sender, EventArgs e)
{
Label1.Text = Session["nume"].ToString();
}
Exemplul 4.37
Odată introdus un obiect în Session, el poate fi accesat din toate paginile aplicaţiei,
atât timp cât el există acolo. Programatorul poate elimina obiectul din sesiune, folosind
metoda Remove:
Session.Remove("nume");
În exemplul următor, sunt create două pagini web. Datele introduse în prima pagină,
sunt salvate în sesiune la apăsarea unui buton, după care se realizează un redirect către
pagina a doua.
Exemplul 4.38
În a doua pagină, datele sunt extrase din sesiune, şi afişate prin intermediul unor
controale de tip Label.
if (Session["media"].ToString().Trim() != null)
{ Label2.Text = "Media " + Session["media"].ToString().Trim();
}
}
}
118
Exemplul 4.39
Exemplul 4.40
La accesarea paginii doi prin intermediul meniului, dacă utilizatorul nu este logat (în
sesiune nu există cheia „username”), se va afişa un mesaj de eroare.
Modelul client-server 119
IV.6.6. Application
Obiectul Application se comportă în mod identic cu Session, diferenţa fiind că el este
specific întregii aplicaţii (tuturor utilizatorilor care accesează un site web la un moment dat),
şi nu unei anumite sesiuni. Cu alte cuvinte odată introdus un obiect în Application,va putea fi
accesat din orice loc al site-ului şi de către toţi utilizatorii acestuia.
Pentru a reţine o valoare în obiectul Application, se foloseşte metoda Set(cheie,
valoare), iar pentru extragerea unei valori metoda Get(cheie):
Application.Set("counter", 4);
int x = Convert.ToInt32(Application.Get("counter").ToString());
În exemplul următor, ne propunem să realizăm o aplicaţie care numără câţi utilizatori
accesează site-ul web la un moment dat, şi să afişăm această valoare în fiecare pagină.
Pentru aceasta vom adăuga în proiect un fişier numit Global.asax.
120
Aici se poate scrie cod C# care se va executa la crearea sau distrugerea obiectelor
Application, respectiv Session.
În cazul aplicaţiei noastre, la crearea obiectului Application se va reţine valoarea 0
într-un element numit „counter”:
Exemplul 4.43
Obiectul Session este creat de fiecare dată când un utilizator accesează prima dată
site-ul. De aceea, vom incrementa valoarea elementului „counter” la crearea obiectului
Session. Decrementarea valorii „counter” se va realiza la distrugerea obiectului Session
(când user-ul va închide pagina).
Exemplul 4.44
La încărcarea unei noi pagini, valoarea din elementul „counter” va fi incrementată, iar
la închiderea unei pagini, decrementată.
IV.6.7. Evaluare
1. Să se realizeze un site web care conţine un test grilă cu 5 întrebări. Fiecare
întrebare va fi afişată într-o pagină separată. Fiecare pagină va avea un hyperlink către
pagina precedentă (cu excepţia primei pagini) respectiv către pagina următoare. La
navigarea între pagini se va păstra răspunsul ales de utilizator la afişarea precedentă.
Ultima pagină va avea un link către o pagină de rezultat, în care se va afişa rezultatul
testului.
2. Să se modifice aplicaţia anterioară astfel încât să se folosească o singură
pagină. Enunţul întrebărilor şi variantele de răspuns vor fi reţinute prin intermediul vectorilor.
Navigarea între pagini se va realiza în două moduri:
Cu ajutorul controalelor de tip Button. Indicele paginii curente va fi reţinut în
sesiune
Cu ajutorul controalelor de tip hyperlink. Indicele paginii următoare, respectiv
precedente va trimis printr-un query string. De exemplu pentru pagina 2 link-
urile vor fi de forma: Default.aspx?pagina=1, respectiv Default.aspx?pagina=3
122
3. Realizaţi o pagină web care pentru fiecare user afişează prin intermediul unui
cookie următoarele informaţii:
data ultimei accesări a paginii.
tipul de browser folosit la ultima accesare.
ip-ul calculatorului de la care s-a accesat ultima dată pagina.
Indicaţie. Pentru a afla ip-ul respectiv tipul de browser, se foloseşte obiectul Request :
Request.ServerVariables("REMOTE_ADDR") – pentru ip
Request.ServerVariables("HTTP_USER_AGENT") – pentru tipul de
browser
Astăzi, cele mai multe dintre activităţile noastre zilnice necesită accesarea şi
actualizarea informaţiei dintr-o bază de date: consultarea unui catalog de produse, lansarea
unei comenzi, cumpărarea unui bilet de avion sau verificarea evidenţei plăţilor.
De cele mai multe ori, informaţiile pe care le dorim sunt obţinute prin prelucrarea unor
seturi de date relaţionate. De exemplu, o bază de date tipică pentru un magazin on-line
conţine o listă de clienţi, o listă de produse şi o listă de vânzări bazată pe informaţiile din
primele două liste.
Aceste informaţii sunt descrise cel mai bine utilizând un model relaţional, model ce
presupune divizarea informaţiilor în seturi consistente şi definirea relaţiilor dintre aceste
seturi. Modelul relaţional stă la baza tuturor produselor moderne axate pe baze de date,
incluzând aici SQL Server, Oracle,MySQL şi chiar Microsoft Access.
INTERACŢIUNEA CU BAZE DE DATE WEB 123
Din punct de vedere tehnic este posibil să organizăm datele în tabele şi să păstrăm
aceste tabele pe harddisc în unul sau mai multe fişiere (eventual folosind un standard XML).
Această abordare nu este însă foarte flexibilă.
O aplicaţie web are nevoie de un sistem complet de gestionare a bazelor de date
(RDBMS 41) cum ar SQL Server, care să asigure gestionarea infrastructurii, performanţă şi
fiabilitate. De exemplu, un astfel de sistem poate furniza date pentru mai mulţi utilizatori
simultan, elimină datele incorecte şi poate executa la un moment dat un grup de comenzi
care sunt văzute ca o singură unitate 42.
Aplicaţiile ASP.NET care utilizează baze de date pot fi grupate după tipul operaţiilor
efectuate. De exemplu:
site-uri comerciale - păstrează cataloagele cu produse, gestionează comenzile,
clienţii şi trazacţiile şi inventariază informaţiile aflate într-un aranjament imens de
tabele relaţionate;
Accesarea unei baze de date într-o aplicaţie web are un scenariu complet diferit faţă
de accesarea unei baze de date prin intermediul unei aplicaţii desktop client-server.
In aplicaţiile tradiţionale cu baze de date, clienţii stabilesc o conexiune cu baza de
date şi menţin această conexiune deschisă până la încheierea executării aplicaţiei.
Conexiunile deschise necesită alocarea de resurse sistem. Atunci când menţinem
mai multe conexiuni deschise server-ul de baze de date va răspunde mai lent la comenzile
clienţilor întrucât cele mai multe baze de date permit un număr foarte mic de conexiuni
concurente.
O aplicaţie Web trebuie să asigure în principal furnizarea rezultatelor către mai mulţi
utilizatori simultan, operaţie influenţată de resursele de memorie şi de conexiunile la baza de
date. Dacă aplicaţia este proiectată astfel încât să menţină conexiunea deschisă chiar şi
41
în limba engleză Relational Database Management System
42
Această operaţie se numeşte tranzacţie.
43
(în limba engleză Uniform Resource Locator) - adresă pentru localizarea resurselor
124
pentru câteva secunde în plus pentru un utilizator, atunci ceilalţi utilizatori vor observa cu
siguranţă întârzierea. Concurenţa este una dintre problemele pe care aplicaţia trebuie să le
gestioneze pentru că modificările făcute de utilizatorii conectaţi simultan pot conduce la
inconsistenţa datelor.
O altă problemă pe care trebuie să o rezolve o aplicaţie Web care lucrează cu baze
de date este cea a modului de deconectare de la Internet. După cum ştim HTTP 44 este un
protocol static. Atunci când un utilizator emite o cerere printr-o aplicaţie ASP.NET, serverul
Web procesează codul, returnează paginile HTML şi închide conexiunea, astfel încât
utilizatorul are senzaţia că lucrează cu o aplicaţie care rulează continuu deşi el beneficiază
doar de pagini statice. Aplicaţia ASP.NET trebuie să efectueze operaţia solicitată de utilizator
printr-o singură cerere.
ADO.NET permite şi lucrul în stil conectat dar şi lucrul în stil deconectat, aplicaţiile
conectându-se la server-ul de baze de date numai pentru extragerea şi actualizarea datelor.
Acest lucru permite reducerea numărului de conexiuni deschise simultan la sursele de
date.
ADO.NET oferă instrumentele de utilizare şi reprezentare XML pentru transferul
datelor între aplicaţii şi surse de date, furnizând o reprezentare comună a datelor, ceea ce
permite accesarea datelor din diferite surse de diferite tipuri şi prelucrarea lor ca entităţi, fără
să fie necesar să convertim explicit datele în format XML sau invers.
Aceste caracteristici sunt determinante în stabilirea beneficiilor furnizate de
ADO.NET:
Interoperabilitate. ADO.NET poate interacţiona uşor cu orice componentă care
suportă XML.
Durabilitate. ADO.NET permite dezvoltarea arhitecturii unei aplicaţii datorită modului
de transfer a datelor între nivelele arhitecturale.
Programabilitate.ADO.NET simplifică programarea pentru diferite task-uri cum ar fi
comenzile SQL, ceea ce duce la o creştere a productivităţii şi la o scădere a
numărului de erori.
Performanţă. Nu mai este necesară conversia explicită a datelor la transferul între
aplicaţii, fapt care duce la creşterea performanţelor acestora.
Accesibilitate. Utilizarea arhitecturii deconectate permite accesul simultan la acelaşi
set de date. Reducerea numărului de conexiuni deschise simultan determină
utilizarea optimă a resurselor.
44
(în limba engleză Hypertext Transfer Protocol) este metoda cea mai des utilizată pentru
accesarea informaţiilor păstrate pe servere World Wide Web
INTERACŢIUNEA CU BAZE DE DATE WEB 125
Prima etapă în realizarea unei aplicaţii ce utilizează baze de date este analiza datelor
şi realizarea unui model conceptual corespunzător.
Această etapă este foarte importantă pentru că pe baza ei se realizează baza de
date. Este mult mai simplu să modificăm un model conceptual decât să modificăm o bază de
date în care au fost adăugate deja date.
Crearea unui model conceptual presupune o reprezentare grafică a datelor şi a
relaţiilor dintre acestea şi este independentă de implementare. Reprezentarea datelor şi
relaţiilor într-o formă convenţională se numeşte diagramă entităţi-relaţii sau ERD (Entity
Relationship Diagram).
figura V-1
O entitate poate fi privită ca o clasă de obiecte pentru care există mai multe instanţe.
O instanţă a unei entităţi reprezintă un obiect, un eveniment particular, din clasa de
obiecte care formează entitatea. De exemplu clasa 9C, profil real, specializare matematică-
informatică reprezintă o instanţă a entităţii CLASA.
Atunci când se precizează o instanţă a unei entităţi se specifică descrierea acelui
obiect. Un atribut este o caracteristică a unei entităţi. În cadrul diagramei entităţi-relaţii,
atributele unei entităţi se scriu în dreptunghiul corespunzător entităţii pe care o
caracterizează, imediat sub numele acesteia şi sunt substantive la singular.
De exemplu, atributele entităţii CLASA din figura 5-1 sunt idc, profil şi specializare.
126
Un atribut poate fi obligatoriu sau opţional. Dacă un atribut este obligatoriu, atunci
fiecare instanţă a acelei entităţi trebuie să fie caracterizată printr-o valoare a acelui atribut.
De exemplu, atributul nume din entitatea PROFESOR este un atribut obligatoriu pentru că
trebuie să cunoaştem numele fiecărui profesor memorat în baza de date.
În cazul unui atribut opţional pot exista instanţe pentru care să nu se cunoască
valoarea atributului respectiv. De exemplu, putem adăuga entităţii PROFESOR un atribut
opţional numit email. Această caracteristică (opţionalitatea) rezultă din faptul că pot exista
profesori care nu au un cont de email.
Instanţele pot fi identificate prin valorile pe care le au atributele ce le caracterizează.
Un atribut sau un set de atribute care identifică în mod unic o instanţă a unei entităţi se
numeşte identificator unic. Pentru exemplul din figura 5.1 identificatorul unic al entităţii
CLASA este idc (indicativ al clasei). Nu există două clase cu acelaşi indicativ deci orice
clasă este unic determinată de valoarea acestui atribut. Atributul profil nu poate fi ales drept
identificator unic pentru că pot exista mai multe clase cu acelaşi profil (de exemplu, într-un
liceu există mai multe clase cu profil real).
figura V-2
V.3.3. Evaluare
1) Daţi exemple de activităţi din lumea reală care presupun acceasarea unei
baze de date Web.
2) Care dintre următoarele activităţi pot implica accesarea unei baze de date Web ?
a. căutarea unui cod poştal c. micşorarea dobânzii bancare
b. achiziţionarea unui produs d. achitarea facturii telefonice
3) Pentru a mări viteza de accesare a unei baze de date Web trebuie să lucrăm în stil
a. conectat b. deconectat
4) Problema accesului concurent la o bază de date este rezolvată de către
a. utilizator c. server
b. administratorul bazei de date d. proiectantul bazei de date
5) Care dintre următoarele nu reprezintă un beneficiu furnizat de ADO.NET?
a. performanţă c. interoperabilitate
b. durabilitate d. concurenţă
6) Care dintre următoarele nu poate fi considerat atribut pentru entitatea HOTEL?
a. NumărCamere c. PreţCameră
b. PersonalDeIngrijire d. Vedere
7) Enumeraţi cinci entităţile care apar în gestionarea activităţii unui centru comercial.
Pentru fiecare dintre aceste entităţi menţionaţi atributele ce le caracterizează.
128
Pentru a putea exectua o comandă care accesează baza de date aveţi nevoie de un
server de baze de date care să preia şi să execute această comandă. Majoritatea aplicaţiilor
ASP.NET utilizează Microsoft SQL Server.
Responsabilitatea creării unei baze de date accesată de către o aplicaţie Web revine,
de cele mai multe ori, dezvoltatorului ASP.NET. Este însă posibil ca aceasta să existe deja
sau să fie în responsabilitatea unui administrator dedicat.
Dacă utilizaţi o versiune de SQL Server, aveţi posibilitatea de a utiliza interfaţa grafică
oferită de SQL Server Management Studio pentru a crea şi gestiona baze de date.
Pentru conectarea la bazele de date existente sau pentru a crea altele noi din
Microsoft Visual Web Developer , alegeţi opţiunea Database Explorer din meniul View
şi urmaţi în continuare paşii:
46
În limba engleză Select or Enter a Database Name
47
Constrângerile permit stabilirea regulilor de integritate care să garanteze că datele introduse
în baza de date sunt corecte şi valide. Constângerea Allow Nulls ataşată unei coloane
permite/inhibă prezenţa valorilor NULL pe acea coloană.
48
Formulele se scriu în zona Formula din secţiunea Computed Column Specification.
INTERACŢIUNEA CU BAZE DE DATE WEB 131
Pentru a preciza cheia primară 49 a tabelei, selectaţi rândul unde doriţi să stabiliţi cheia
primară şi apoi executaţi un click pe butonul din dreapta al mouse-ului şi alegeţi opţiunea:
figura V-6
Selectarea uneia dintre opţiunile Save... ale meniului File duce la salvarea structurii
tabelei curente.
După salvarea definiţiei, tabela este afişată în zona Tables a bazei de date selectate
(ca în figura 5-8).
49
Identificator unic
132
figura V-8
Pentru a introduce sau vizualiza datele din tabelă, executaţi click dreapta pe numele
figura V-9
Transformarea modelului conceptual într-un model relaţional 50 implică transformarea
entităţilor şi relaţiilor astfel:
entităţile devin tabele;
atributele devin coloane în tabela provenită din entitatea corespunzătoare;
identificatorul unic devine cheie primară;
instanţele devin linii în tabelă;
relaţiile 1-1 devin chei străine 51, cheia străină fiind plasată în tabela cu mai puţine
înregistrări;
relaţiile 1-n devin chei străine plasate în tabela în care se află partea many(n) a
relaţiei;
relaţiile n-n sunt rezolvate prin intermediul entităţii de intersecţie care are două
chei străine pentru cele două tabele asociate.
50
Această operaţie se numeşte mapare.
51
Cheia străină este un câmp ce corespunde unei chei primare din tabela de referinţă.
INTERACŢIUNEA CU BAZE DE DATE WEB 133
Vom defini, ca bază pentru noţiunile ce urmează să fie prezentate în acest capitol, un
model conceptual simplificat corespunzător bazei de date MASTER ce conţine trei tabele
(clienti, produse şi comenzi). Fiecare client poate lansa una sau mai multe comenzi şi
fiecare produs poate fi comandat de una sau mai multe ori.
figura V-16
Pentru baza de date aleasă ca model avem două relaţii de tipul 1-n între tabele:
figura V-17
Relaţia FK_Comenzi_Clienti din figura 5-17 marchează faptul că un client poate lansa
mai multe comenzi (CodClient este cheie primară în tabela Clienti şi cheie străină în
tabela Comenzi), iar relaţia FK_Comenzi_Clienti indică faptul că un produs poate să fie
comandat de mai multe ori ( CodProdus este cheie primară în tabela Produse şi cheie
străină în tabela Comenzi)
Opţiunea
asociată grupului Database Diagrams
permite realizarea diagramelor
corespunzătoare modelului conceptual ales,
pe baza tabelelor selectate.
136
V.4.1. Evaluare
Atunci
a. cheia primară din tabela PERSOANE devine cheie primară în tabela INVESTIŢII;
b. cheia primară din tabela PERSOANE devine cheie străină în tabela INVESTIŢII;
c. cheia primară din tabela INVESTIŢII devine cheie primară în tabela PERSOANE;
d. cheia primară din tabela INVESTIŢII devine cheie străină în tabela PERSOANE;
3) Atunci când iniţiem o conexiune sursa de date la care ne conectăm trebuie să existe.
a. adevărat b. fals
4) Un fişier cu extensia .mdf este o bază de date.
a. adevărat b. fals
5) Pentru diagrama din figura următoare
Accesul direct reprezintă cea mai uşoară cale de a interacţiona cu o bază de date,
ce presupune construirea şi executarea unor comenzi SQL.
52
în limba engleză Data Definition Language
53
în limba engleză Data Manipulation Language
54
O vizualizare (în limba engleză view) este o tabelă virtuală, cu rol de filtrare a datelor, care nu
memorează date propriu-zise.
INTERACŢIUNEA CU BAZE DE DATE WEB 139
d) executăm interogarea .
În fereastra de proiectare a unei interogări se pot identifica patru zone. În prima
zonă sunt evidenţiate tabelele, pe baza cărora se construieşte interogarea, relaţiile dintre ele,
şi sunt marcate câmpurile prelucrate de interogare. În cea de-a doua zonă se precizează
modul în care câmpurile selectate intervin în interogare şi sunt marcate cele ce urmează să
fie afişate. Fereastra a treia conţine codul SQL, cod în care se poate interveni direct iar în
cea de-a patra fereastră se afişează rezultatul interogării.
55
în limba engleză Data Control Language
56
este instalat în folder-ul c:\Program Files\Microsoft SQL Server\90\Tools\Binn
140
join – permite prelucrarea datelor din două sau mai multe tabele pe baza unor
criterii bine definite.
În clauza FROM se specifică obiectele (tabelele şi vizualizările) din care se extrag
date. Aceste obiecte pot fi însoţite de un alias. Dacă un obiect se află într-o bază de date
situată la distanţă atunci se va specifica numele legăturii către aceasta (database link).
Cea mai simplă formă a instrucţiunii SELECT este SELECT * FROM tabela;
Caracterul ’ *’ indică afişarea tuturor coloanelor tabelei. Dacă dorim să afişăm doar informaţii
din câteva coloane ale tabelei vom preciza numele acestor coloane în clauza SELECT.
În exemplul următor se afişează, pentru fiecare client: numele, prenumele şi
localitatea.
Dacă lista de coloane din clauza SELECT este precedată de cuvântul DISTINCT
atunci se afişează doar liniile din tabelă ce corespund combinaţiilor distincte de valori din
aceste coloane.
În exemplul următor se utilizează specificatorul DISTINCT pentru a afişa categoriile
de produse.
Aliasul unei coloane permite afişarea unei alte expresii în locul numelui unei coloane.
Această expresie poate fi încadrată de paranteze şi este precedată de cuvântul AS.
Exemplul anterior poate fi rescris:
Dacă dorim să afişăm în aceeaşi coloană informaţii din mai multe coloane atunci
putem să construim un şir de caractere obţinut prin alipirea acestor informaţii cu ajutorul
operatorului „+” . În exemplul următor se afişează în aceeaşi coloană numele şi prenumele
clienţilor.
Operatorul LIKE este utilizat în interogări pentru a verifica dacă un şir de caractere
respectă un anumit „şablon” . Dacă valoarea se potriveşte şablonului, atunci operatorul va
returna valoarea adevărat, în caz contrar, va returna valoarea fals. În şablon se pot utiliza
două caractere speciale:
- caracterul ”_” ţine locul unui singur caracter, oricare ar fi acesta;
- caracterul ”%” ţine locul oricărui subşir de caractere.
În exemplul următor se afişează toate produsele a căror denumire începe cu litera b.
INTERACŢIUNEA CU BAZE DE DATE WEB 143
Funcţiile de grup sunt funcţii care returnează o singură valoare pentru fiecare grup
de linii dintr-un tabel. Principalele funcţii de grup sunt :
MIN (x) – calculează cea mai mică valoare din câmpul numeric x.
Cel mai mic preţ al unui produs se obţine cu interogarea:
144
Dacă dorim să afişăm produsele care au cel mai mic preţ atunci trebuie să includem
în clauza WHERE o subinterogare 57:
MAX (x) – calculează cea mai mare valoare din câmpul numeric x.
Interogarea din figura următoare afişează stocul maxim (numărul maxim de produse
de acelaşi tip)
Dacă dorim să selectăm numai o parte dintre grupurile obţinute prin folosirea clauzei
GROUP BY trebuie să utilizăm clauza HAVING.
În exemplul următor se utilizează clauza HAVING pentru a afişa localităţile pentru
care avem cel puţin 2 clienţi.
Clauza ORDER BY se utilizează atunci când se doreşte afişarea datelor din tabelă
ordonate după anumite criterii. În această clauză se precizează coloanele sau expresiile
după care se vor ordona liniile unui tabel înainte de afişare.
Opţiunea ASC precizează că ordonarea se face crescător. Această opţiune poate fi
omisă întrucât, implicit, datele sunt ordonate crescător. Opţiunea DESC precizează că
sortarea se face descrescător.
Exemplul următor afişează produsele pornind de la cel mai scump şi terminând cu cel
mai ieftin.
146
În cazul ordonării descrescătoare valorile NULL se trec la sfârşit, în timp ce, în cazul
ordonării crescătoare valorile NULL apar la început.
De exemplu, dacă se adaugă în tabela PRODUSE un nou produs, creta, fără
descriere atunci acest produs va fi, într-o ordonare crescătoare după coloana Descriere,
primul produs afişat.
Outer Join – se utilizează atunci când dorim să afişăm datele dintr-o tabelă
indiferent dacă au sau nu corespondent în tabela de legătură. Dacă datele fără corespondent
se află în tabela din stânga clauzei JOIN atunci se utilizează opţiunea LEFT OUTER JOIN
iar altfel opţiunea RIGHT OUTER JOIN.
O astfel de legătură se realizează atunci când vrem să afişăm toţi clienţii indiferent
dacă au comandat sau nu produse.
INTERACŢIUNEA CU BAZE DE DATE WEB 149
Comanda CREATE poate fi utilizată pentru a crea o tabelă, o vizualizare, un index sau
un sinonim.
Pentru crearea unei tabele se foloseşte comanda CREATE TABLE.
În cadrul comenzii CREATE TABLE putem utiliza clauza DEFAULT pentru a defini
valori implicite pentru coloanele tabelei. Această clauză precizează ce valoare va avea un
atribut atunci când, la inserare, nu se specifică în mod explicit valoarea acestuia. Valoarea
implicită este dată de expresia ce urmează clauzei DEFAULT. Aceasta poate fi o constantă,
o expresie SQL sau chiar o funcţie SQL.
Utilizarea clauzei DEFAULT previne introducerea valorilor NULL în tabelă şi permite
utilizatorului să controleze unde şi când au fost introduse valorile implicite.
O formă simplificată a comenzii CREATE TABLE este următoarea:
Dacă dorim ca anul apariţiei să fie implicit 2008 atunci putem folosi clauza DEFAULT
pentru această coloană.
152
Coloana adăugată va fi ultima din tabelă. Dacă tabela conţine deja date, atunci, pentru
liniile existente vom avea, în coloana adăugata, valoarea NULL. Rezultă de aici că nu putem
adăuga coloane cu restricţia NOT NULL la o tabelă ce conţine date.
În exemplul următor, se adaugă tabelei CARTE două coloane.
Ştergerea unei coloane duce automat la ştergerea restricţiilor definite pentru aceasta şi
care nu implică alte obiecte.
În exemplul următor se şterge coloana categorie din tabela CARTE.
INTERACŢIUNEA CU BAZE DE DATE WEB 153
Dacă o tabelă este referită printr-o cheie străină atunci ea nu poate fi ştearsă până
când nu este ştearsă tabela care o referă ( se şterge mai întâi tabela copil şi numai după
aceea tabela părinte).
Pentru a şterge toate liniile tabelei şi a elibera spaţiul utilizat pentru stocarea datelor,
fără a şterge definiţia tabelei, se utilizează comanda
Opţiunea WITH GRANT OPTION permite unui utilizator să aloce altor utilizatori
drepturile primite cu această opţiune.
În exemplul următor se acordă drepturi de selecţie şi inserare în tabela Carti tuturor
utilizatorilor.
Comanda
V.5.4. Evaluare
I.
1) Atunci când vrem să construim o aplicaţie Web legată la o bază de date:
a) realizăm mai întâi modelul conceptual şi după aceea modelul fizic
b) construiţi modelul fizic şi apoi modelul conceptual
c) modelul fizic se contruieşte în paralel cu modelul conceptual
2) Care dintre următoarele afirmaţii despre relaţiile stabilite între tabele sunt adevărate:
a) Sunt implementate cu ajutorul cheilor străine
b) Se stabilesc între două tabele diferite
c) Se pot defini numai între tabele aflate în aceeaşi bază de date
3) Dacă se generează automat numele unei relaţii, atunci acesta are prefixul:
a) PK_ b) FK_ c) PFK_ d) FPK_
4) O tabelă poate avea o singură cheie primară
a) Adevărat b) Fals
5) Care dintre următoarele afirmaţii referitoare la o cheie primară sunt adevărate:
a) Fiecare tabelă trebuie să aibă o cheie primară
b) Cheia primară realizează o indexare automată a înregistrărilor din tabelă
c) O tabelă poate avea mai multe chei primare
6) Care dintre următoarele reprezintă tipuri de relaţii
a) 1-n b) 0-n c) n-n
7) Se consideră două tabele T1 şi T2 între care există o relaţie de tip 1-n (cheia primară din
T1 este cheie străină în T2). Atunci:
a) Putem şterge oricând o înregistrare din T1
b) Putem şterge oricând o înregistrare din T2
c) O înregistrare din T1 poate fi ştearsă numai dacă în tabela T2 nu există înregistrări
care să-i corespundă
8) Într-o tabelă
a) orice câmp poate avea valoare NULL
b) un câmp care reprezintă o cheie primară poate conţine valori NULL
c) un câmp care reprezintă o cheie străină poate conţine valori NULL
9) Ştergerea unei tabele părinte
a) Conduce la ştergerea tuturor tabelelor copii
b) duce la invalidarea accesului la toate tabelele copii
c) Se poate face numai după ce au fost şterse toate tabelele copii
d) Nu se poate face în orice condiţii
INTERACŢIUNEA CU BAZE DE DATE WEB 157
10) În Visual Studio, o relaţie între două tabele se poate defini automat, din
a) Tabela părinte
b) Tabela copil
c) Oricare dintre cele două tabele
II. Se consideră modelul conceptual din Figura.5-20.
figura V-20
În acest capitol vom vedea cum putem să combinăm comenzile SQL cu obiecte
ADO.NET pentru a extrage şi manipula bazele de date din aplicaţiile Web.
Componentele principale ale ADO.NET sunt DataSet şi Data Provider. Ele au fost
proiectate pentru accesarea şi manipularea datelor.
Din cauza existenţei mai multor tipuri de surse de date este necesar ca pentru fiecare
tip de protocol de comunicare să se folosească o bibliotecă specializată de clase.
.NET Framework include SQL Server.NET Data Provider
pentru interacţiune cu Microsoft SQL Server, Oracle Data
Provider pentru bazele de date Oracle şi OLE DB Data Provider
pentru accesarea bazelor de date ce utilitează tehnologia OLE DB
pentru expunerea datelor (de exemplu Access, Excel sau SQL
Server versiune mai veche decât 7.0)
Furnizorul de date permite unei aplicaţii să se conecteze la
sursa de date, execută comenzi şi salvează rezultate. Fiecare
furnizor de date cuprinde componentele Connection, Command,
DataReader şi DataAdapter :
SQL Server OLE DB Oracle
Data Provider Data Provider Data Provider
Connection SqlConnection OleDbConnection OracleConnection
Command SqlCommand OleDbCommand OracleCommand
DataReader SqlDataReader OleDbDataReader OracleDataReader
DataAdapter SqlDataAdapter OleDbDataAdapter OracleDataAdapter
INTERACŢIUNEA CU BAZE DE DATE WEB 159
Aşa cum am precizat în capitolul anterior accesul direct la date presupune construcţia
unei comenzi SQL, conectarea la baza de date, executarea comenzii şi deconectarea de la
baza de date fără memorarea directă a rezultatelor.
Dacă se lucrează în mod deconectat atunci se păstrează o copie a datelor într-un
obiect de tip DataSet şi acestea pot fi prelucrate şi după deconectarea de la baza de date.
Modelul accesului direct la date corespunde paginilor ASP.NET unde nu este necesară
memorarea datelor pentru perioade mai lungi de timp. O pagină ASP.NET este încărcată la
cerere şi accesul se încheie atunci când rezultatul cererii este furnizat user-ului, ceea ce
înseamnă o pagină care are de obicei o viaţă de numai câteva secunde.
Rezultă aşadar că o interogare directă a datelor presupune executarea paşilor
următori:
a) crearea obiectelor de tip Connection, Command şi DataReader ;
b) obţinerea informaţiilor din baza de date cu ajutorul obiectelor de tip DataReader şi
afişarea acestora într-un controler de pe un formular web;
c) închiderea conexiunii;
d) trimiterea paginii către utilizator; în acest moment nu mai avem o legătură directă
între ceea ce vede utilizatorul şi datele din baza de date, obiectele de tip ADO.NET
fiind distruse.
Adăugarea, ştergerea sau modificarea datelor se realizează în doi paşi:
a) crearea obiectelor de tip Connection, Command;
b) executarea comenzii directe.
figura V-21
160
Exemple de conectare
a) conectare la o sursă de date SQL
using System.Data.SqlClient;
SqlConnection con = new SqlConnection();
con.ConnectionString = "Data Source=localhost; User ID=profesor;pwd=info;
Initial Catalog=Orar”;
con.Open();
using System.Data.SqlClient;
SqlConnection con = new SqlConnection(@"Data Source=serverBD;
Database=scoala; User ID=elev;
Password=secret");
con.Open();
using System.Data.OleDb;
OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=C:\Date\scoala.mdb");
con.Open();
SqlConnection conn;
conn = new SqlConnection("Data Source='.\\SQLEXPRESS';
Initial Catalog=master;
Integrated Security=SSPI");
Proprietăţi
Parametru Descriere
Specifică furnizorul de date pentru conectarea la sursa de date. Acest
Provider furnizor trebuie precizat doar dacă se foloseşte OLE DB .NET Data
Provider, şi nu se specifică pentru conectare la SQL Server.
Data Source Identifică serverul, care poate fi local, un domeniu sau o adresă IP 58.
Specifică numele bazei de date accesate. Baza de date trebuie să se
Initial Catalog
găsească pe serverul dat în Data Source. 59
Integrated Logarea se face cu user-ul configurat pentru Windows.
Security 60
User ID Numele unui user care are acces de logare pe server.
using System.Data.SqlClient;
SqlConnection con = new SqlConnection("Data Source=serverBD;
Database=scoala;
User ID=elev;Password=secret;
Connect Timeout=30");
58
Dacă este instalat SQL Server Express Edition sursa de date este localhost\SQLEXPRESS
sau .\SQLEXPRESS, pentru că numele instanţei este SQLEXPRESS.
59
Connection.ChangeDatabase() permite schimbarea numelui bazei de date.
60
User Id şi Password pot înlocui parametrul Integrated Security.
162
c) Database (string, read-only): returnează numele bazei de date la care s–a făcut
conectarea. Este necesară pentru a arăta unui utilizator care este baza de date pe
care se face operarea
d) Provider (de tip string, read-only): returnează furnizorul de date
e) ServerVersion (string, read-only): returnează versiunea de server la care s–a făcut
conectarea.
f) State (enumerare de componente ConnectionState, read-only): returnează starea
curentă a conexiunii. Valorile posibile: Broken, Closed, Connecting, Executing,
Fetching, Open.
Metode
Evenimente
În mod obişnuit, toate bazele de date dintr-o aplicaţie vor utiliza acelaşi şir de caractere
pentru precizarea modului de conectare.
Din acest motiv se păstrează şirul de caractere ce precizează modul de conectare ca
variabilă membru într-o clasă sau, chiar mai bine, într-un fişier de configurare.
Putem astfel să construim un obiect de tip Connection şi să-i furnizăm, utilizând un
constructor dedicat, şirul de caractere ce indică modul de conectare:
<configuration>
...
<connectionStrings>
<add name="sir"
connectionString="DataSource=.\SQLEXPRESS;
Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
...
</configuration>
conn = WebConfigurationManager.ConnectionStrings["sir"].ConnectionString;
Înainte de efectuarea unor operaţii pe baza de date este bine să verificăm dacă am
reuşit să ne conectăm la sursa de date.
În exemplul următor apăsarea butonului Open determină conectarea la sursă, afişarea
informaţiilor legate de conectare şi a stării acesteia (ca în imaginea umătoare)
164
Exemplul 3. Am adăugat pe pagină o listă de tip DropDownList pentru care sursa de date
este reprezentată de numele, denumirea şi preţul produselor.
V.6.5. Command
Proprietăţi
a) CommandText (String): conţine comanda SQL sau numele procedurii stocate care
se execută pe sursa de date.
b) CommandTimeout (int): reprezintă numărul de secunde care trebuie să fie aşteptat
pentru executarea comenzii. Dacă se depăşeste acest timp, atunci se generează o
excepţie.
c) CommandType (enumerare de componente de tip CommandType): reprezintă tipul
de comandă care se execută pe sursa de date. Valorile pot fi: StoredProcedure (apel
de procedură stocată), Text (comandă SQL obişnuită), TableDirect (numai pentru
OleDb)
d) Connection (System. Data. [Provider].PrefixConnection): conţine obiectul de tip
conexiune folosit pentru legarea la sursa de date.
e) Parameters (System.Data.[Provider].PrefixParameterCollection): returnează o
colecţie de parametri care s-au transmis comenzii.
f) Transaction (System.Data.[Provider].PrefixTransaction): permite accesul la obiectul
de tip tranzacţie care se cere a fi executat pe sursa de date.
Metode
a) Constructori:
SqlCommand()
SqlCommand(string CommandText)
SqlCommand CMD=
new SqlCommand("SELECT * FROM elevi FOR XML MATE,EXAMEN", con);
System.Xml.XmlReader myXR = CMD.ExecuteXmlReader();
170
using System.Data.SqlClient;
SqlConnection conn = newSqlConnection(@"DataSource=serverBD;Database=MAGAZIN;
User ID=adm;Password=eu");
conn.Open();
Câteodată avem nevoie să obţinem din baza de date o singură valoare, care poate fi o
sumă, o medie sau alt rezultat al unei funcţii agregat. O alegere ineficientă ar fi utilizarea
metodei ExecuteReader şi apoi calculul valorii. În acest caz, cea mai bună alegere este să
lucrăm direct asupra bazei de date şi să obţinem această valoare. 62
61
În acest exemplu am ales să apelăm constructorul SqlCommand fără parametri pentru a
exemplifica cum putem stabili explicit conexiunea şi comanda.
62
În exemplul prezentat este necesară conversia întrucât rezultatul returnat de ExecuteScalar este de
tip object
172
V.6.6. DataReader
Datele pot fi explorate în mod conectat (cu ajutorul unor obiecte din categoria
DataReader), sau pot fi preluate de la sursă (dintr-un obiect din categoria DataAdapter) şi
înglobate în aplicaţia curentă (sub forma unui obiect din categoria DataSet).
Clasele DataReader permit parcurgerea într-un singur sens a sursei de date, fără
posibilitate de modificare a datelor la sursă. Dacă se doreşte modificarea datelor la sursă, se
va utiliza ansamblul DataAdapter + DataSet.
Datorită faptului că citeşte doar înainte (forward-only) acest tip de date este foarte
rapid în citire. Overhead-ul asociat este foarte mic (overhead generat cu inspectarea
rezultatului şi a scrierii în baza de date). Dacă într-o aplicaţie este nevoie doar de informaţii
care vor fi citite o singură dată, sau rezultatul unei interogări este prea mare ca sa fie reţinut
în memorie (caching) DataReader este soluţia cea mai bună.
Un obiect DataReader nu are constructor 63, ci se obţine cu ajutorul unui obiect de tip
Command şi prin apelul metodei ExecuteReader() (vezi exerciţiile de la capitolul anterior).
Evident, pe toată durata lucrului cu un obiect de tip DataReader, conexiunea trebuie să fie
activă. Toate clasele DataReader (SqlDataReader, OleDbDataReader etc.) implementează
interfaţa IDataReader.
Proprietăţi:
a) IsClosed (boolean, read-only)- returneză true dacă obiectul este deschis şi fals altfel
b) HasRows (boolean,read-only)- verifică dacă reader-ul conţine cel puţin o înregistrare
c) Item (indexator de câmpuri)
d) FieldCount-returnează numărul de câmpuri din înregistrarea curentă
Metode:
63
Dacă pentru instantiere este folosit operatorul new veţi obţine un obiect cu care nu puteţi
face nimic pentru că nu are o conexiune şi o comandă ataşate.
INTERACŢIUNEA CU BAZE DE DATE WEB 173
Atunci când lucraţi cu bazele de date aveţi nevoie, de cele mai multe ori, să filtraţi
rezultatul după diverse criterii. De obicei acest lucru se face în funcţie de condiţiile
specificate de către utilizator (ex: se afişează doar păpuşile Barbie).
Cea mai simplă metodă de filtrare a rezultatelor este să construim dinamic string-ul
SqlCommand dar această metodă nu este recomandată deoarece poate afecta baza de
date ( ex. Accesarea informaţiilor confidenţiale).
Dacă folosim interogări cu parametri atunci orice valoare pusă într-un parametru nu va
fi tratată drept cod SQL, ci ca valoare a unui câmp, făcând aplicaţia mai sigură.
64
a) construiţi string-ul pentru SqlCommand folosind parametri;
SqlCommand cmd =
new SqlCommand("SELECT * FROM PRODUSE WHERE DENUMIRE = @den", conn);
Exemplu
cmd.Parameters.Add(param);
Astfel, comanda
devine
64
Atunci când comanda va fi executată @den va fi inlocuit cu valoarea aflată în obiectul SqlParameter ataşat.
Dacă nu asociem o instanţă de tipul SqlParameter pentru un parametru din string-ul de interogare sau avem mai
multe instanţe SqlParameter pentru un parametru vom obţine o eroare la rulare
INTERACŢIUNEA CU BAZE DE DATE WEB 175
figura V-22
Fiecare item al listei este un şir de caractere format prin alipirea informaţiilor din
câmpurile DenumireProdus, PretUnitar şi Stoc. Lista de produse va fi afişată la fiecare
încărcare a paginii.
În cazul în care operaţia de conectare la baza de date sau operaţia de citire din baza
de date eşuează se afişează un mesaj de eroare.
176
try
{
conn.Open();
reader = cmd.ExecuteReader();
while (reader.Read())
{
ListItem newItem = new ListItem();
newItem.Text =
reader["DenumireProdus"] + "pret:" +reader["PretUnitar"]+" stoc:"+reader["Stoc"];
newItem.Value = reader["CodProdus"].ToString();
DropDownList2.Items.Add(newItem);
}
reader.Close();
}
catch (Exception err)
{
text1.Text = "Eroare la citire :" + err.Message;
}
finally
{
conn.Close();
}
}
Selectarea unui item din lista de produse determină afişarea unor informaţii
suplimentare despre acest produs, într-o etichetă, cu ajutorul unui obiect de tip
StringBuilder:
DropDownList2_SelectedIndexChanged
eveniment ce determină preluarea informaţiilor ce corespund itemului curent din tabela
produse şi afişarea acestor informaţii în formatul din imaginea alăturată.
try
{
conn.Open();
reader = cmd.ExecuteReader();
reader.Read();
icp.Text = reader["CodProdus"].ToString();
ipu.Text = reader["PretUnitar"].ToString();
il.Text = reader["Descriere"].ToString();
idp.Text = reader["DenumireProdus"].ToString();
ic.Text = reader["Categorie"].ToString();
ist.Text = reader["Stoc"].ToString();
reader.Close();
text1.Text = "";
}
catch (Exception err)
{
text1.Text = "Eroare: " + err.Message;
}
finally
{
conn.Close();
}
}
stoc”.
Dacă au fost completate toate casetele text corespunzătoare câmpurilor obligatorii atunci
inserarea se face cu succes şi se afişează, într-o casetă text, care ne asigură de acest fapt.
if (icp.Text == "" || ipu.Text == "" || idp.Text == "" || ic.Text == "" || ist.Text == "")
{ text1.Text = "Atributele Cod,Denumire,Stoc,Pret,Categorie sunt OBLIGATORII";
text1.Visible = true;
return;
}
string insertSQL =
"INSERT INTO produse(CodProdus,DenumireProdus,PretUnitar,Categorie,Stoc,Descriere)
VALUES ('";
insertSQL += icp.Text + "', '"+ idp.Text + "', '"+ipu.Text + "', '"+
ic.Text + "', '" + ist.Text + "', '" + il.Text + "')";
Secvenţa de inserare a unui nou produs poate fi rescrisă , utilizând comenzile parametrizate.
INTERACŢIUNEA CU BAZE DE DATE WEB 181
...
string insertSQL;
insertSQL = "INSERT INTO produse
(CodProdus,DenumireProdus,PretUnitar,Categorie,Stoc,Descriere) VALUES (";
insertSQL +=
"@CodProdus,@DenumireProdus,@PretUnitar,@Categorie,@Stoc,@Descriere)";
cmd.Parameters.AddWithValue("@CodProdus", icp.Text);
cmd.Parameters.AddWithValue("@DenumireProdus", idp.Text);
cmd.Parameters.AddWithValue("@PretUnitar", ipu.Text);
cmd.Parameters.AddWithValue("@Categorie", ic.Text);
cmd.Parameters.AddWithValue("@Stoc", ist.Text);
cmd.Parameters.AddWithValue("@Descriere", il.Text);
...
Modificarea unui produs presupune mai întâi selectarea acestuia din lista produselor,
modificarea valorilor din casetele text şi după aceea efectuarea operaţiei propriuzise. Valoarea
câmpului CodProdus nu se poate modica întrucât regăsirea produsului ce urmează a fi
modificat se face pe baza acestei chei.
182
cmd.Parameters.AddWithValue("@DenumireProdus", idp.Text);
cmd.Parameters.AddWithValue("@PretUnitar", ipu.Text);
cmd.Parameters.AddWithValue("@Categorie", ic.Text);
cmd.Parameters.AddWithValue("@Stoc", ist.Text);
cmd.Parameters.AddWithValue("@Descriere", il.Text);
cmd.Parameters.AddWithValue("@CodProdus",DropDownList2.SelectedItem.Value);
int NrProduseModificate = 0;
try
{
conn.Open();
NrProduseModificate = cmd.ExecuteNonQuery();
text1.Text = "Produse modificate:"+NrProduseModificate.ToString();
}
catch (Exception err){text1.Text = "Eroare la modif" +err.Message;}
finally {conn.Close();}
După modificare, lista de produse este actualizată, şi sunt afişate noile valori pentru
produsul modificat.
INTERACŢIUNEA CU BAZE DE DATE WEB 183
Ştergerea unui produs din tabelă se face numai dacă nu sunt încălcate condiţiile de
integritate date de relaţiile dintre tabele. De exemplu, nu putem şterge un produs care a fost
deja comandat .
În exemplul din imaginea următoare se încercă ştergerea produsului pix. Întrucât acesta
apare în cel puţin o comandă, operaţia de ştergere se încheie fără succes.
Dacă produsul ales nu este comandat atunci el poate fi şters. În exemplul din imaginea
următoare produsul creion poate fi şters întrucât niciun client nu a comandat acest produs.
184
V.7.1. DataAdapter
Clasele DataAdapter generează obiecte care
funcţionează ca o interfaţă între sursa de date şi obiectele
DataSet interne aplicaţiei, permiţând prelucrări pe baza de
date. Ele gestionează automat conexiunea cu baza de date
astfel încât conexiunea să se facă numai atunci când este
necesar.
Un obiect DataSet este de fapt un set de tabele
relaţionate. Foloseşte serviciile unui obiect DataAdapter
pentru a-şi procura datele şi trimite modificările înapoi către
baza de date. Datele sunt stocate de un DataSet în format
XML, folosit şi pentru transferul datelor.
În exemplul următor se preiau datele din tabelele elevi şi profesori:
//transferă datele în datasetul ds sub forma unei tabele locale numite elevi
//transferă datele în datasetul ds sub forma unei tabele locale numite profi
Proprietăţi
INTERACŢIUNEA CU BAZE DE DATE WEB 185
Metode
a) Constructori:SqlDataAdapter()|SqlDataAdapter(obiect_comanda)|
SqlDataAdapter(string_comanda, conexiune);
b) Fill() permite umplerea unei tabele dintr–un obiect DataSet cu date. Permite
specificarea obiectului DataSet în care se depun datele, eventual a numelui tablei din
acest DataSet, numărul de înregistrare cu care să se înceapă popularea (prima
având indicele 0) şi numărul de înregistrări care urmează a fi aduse.
c) Update() permite transmiterea modificărilor efectuate într–un DataSet către baza de
date.
V.7.2. DataSet
Un DataSet este format din Tables (colecţie formată din obiecte de tip DataTable;
DataTable este compus la rândul lui dintr-o colecţie de DataRow şi DataColumn),
Relations (colecţie de obiecte de tip DataRelation pentru memorarea legăturilor părinte–
copil) şi ExtendedProperties ce conţine proprietăţi definite de utilizator.
Scenariul uzual de lucru cu datele dintr-o tabelă conţine următoarele etape:
popularea succesivă a unui DataSet prin intermediul unuia sau mai multor obiecte
DataAdapter, apelând metoda Fill (vezi exemplul de mai sus)
procesarea datelor din DataSet folosind numele tabelelor stabilite la umplere,
ds.Tables["elevi"], sau indexarea acestora, ds.Tables[0], ds.Tables[1]
actualizarea datelor prin obiecte comandă corespunzătoare operaţiilor INSERT,
UPDATE şi DELETE. Un obiect CommandBuilder poate construi automat o
combinaţie de comenzi ce reflectă modificările efectuate.
186
Aşadar, DataAdapter deschide o conexiune doar atunci când este nevoie şi o inchide
imediat când aceasta nu mai este necesară.
De exemplu DataAdapter realizează următoarele operaţiuni atunci când trebuie să
populeze un DataSet: deschide conexiunea, populează DataSet-ul, închide conexiunea şi
următoarele operaţiuni atunci când trebuie să facă update pe bază de date: deschide
conexiunea, scrie modificările din DataSet în baza de date, închide conexiunea. Între
operaţiunea de populare a DataSet-ului şi cea de update conexiunile sunt închise. Între
aceste operaţii în DataSet se poate scrie sau citi.
Crearea unui obiect de tipul DataSet se face folosind operatorul new.
Exemplu.
SqlDataAdapter daProd =
new SqlDataAdapter("SELECT IdProdus, DenumireProdus FROM PRODUSE", conn);
să utilizăm comenzi care vor folosi mai multe tabele este recomandată construirea separată
a comenzilor şi apoi ataşarea lor adapterului, folosind proprietăţi.
daProd.Fill(dsProduse, "PRODUSE");
În exemplul următor va fi populat DataSet-ul dsProduse. Cel de-al doilea parametru (string)
reprezintă numele tabelului (nu numele tabelului din baza de date, ci al tabelului rezultat în
DataSet) care va fi creat. Scopul acestui nume este identificarea ulterioară a tabelului. În
cazul în care nu sunt specificate numele tabelelor, acestea vor fi adaugate in DataSet sub
numele Table1, Table2, ...
Exemplu. 65
După ce au fost făcute modificări într-un DataSet acestea trebuie scrise şi în baza de date.
Actualizarea se face prin apelul metodei Update.
daProd.Update(dsProduse, "PRODUSE");
65
Se pot afişa mai multe tabele dintr-un DataSet, semnul "+" permiţându-i utilizatorului să
aleagă care tabel să fie afişat. Pentru a suprima afişarea acelui semn "+" setăm proprietatea
DataMembers pe numele tabelului care va fi afişat. Numele tabelului este acelaşi care l-am folosit ca
parametru în apelul metodei Fill.
188
adapter.Fill(ds, "produse");
}
catch (Exception err){text1.Text = "Eroare la citire "+ err.Message;}
finally {conn.Close();}
foreach (DataRow produs in ds.Tables["produse"].Rows)
{
ListItem newItem = new ListItem();
newItem.Text = produs["DenumireProdus"] + "(" +produs["Descriere"]+")";
newItem.Value = produs["CodProdus"].ToString();
DropDownList2.Items.Add(newItem);
}
}
Pentru a construi un obiect de tip DataSet în mediu vizual trebuie să folosim opţiunea
Add New Item şi să selectăm template-ul DataSet.
Putem să adăugăm itemi din Database Explorer (tabele, vizualizări, etc), prin selecţie
simplă şi deplasare pe suprafaţa de design sau să adăugăm elemente noi pe o suprafaţa
corespunzătoare unui obiect DataSet.
INTERACŢIUNEA CU BAZE DE DATE WEB 189
Pentru a trasa relaţiile dintre tabele putem folosi opţiunea Relation din meniul
Toolbox ataşat. După alegerea acestei unelte trebuie să stabilim tabelele relaţionate şi tipul
relaţiilor.
190
În cazul exemplului ales au fost marcate cele două relaţii de tip 1-n dintre tabele.
În concluzie, dacă doriţi să extrageţi înregistrări dintr-o bază de date şi vreţi să le puneţi
într-un obiect de tip DataSet trebuie să utilizaţi un obiect de tip DataAdapter. Fiecare obiect
de tip DataAdapter conţine patru tipuri de comenzi (SELECT,INSERT,UPDATE,DELETE).
Acest lucru vă permite să utilizaţi un singur obiect DataAdapter pentru mai multe sarcini.
INTERACŢIUNEA CU BAZE DE DATE WEB 191
Modelul conceptual ataşat unei aplicaţii poate fi generat automat prin selectarea din
Pentru generare putem folosi tabelele unei baze de date deja contruită sau putem crea
un model conceptual nou.
În cazul exemplului ales avem două relaţii de tip 1-n între tabela Comenzi şi tabela
Clienţi, respectiv Produse.
ds.Relations.Add(Clienti_Comenzi);
ds.Relations.Add(Produse_Comenzi);
try
{
conn.Open();
adapter.Fill(ds, "Clienti");
cmd.CommandText = "SELECT CodClient,IdComanda,NumarProduse FROM
Comenzi";
adapter.Fill(ds, "Comenzi");
}
catch (Exception err){text1.Text = "Eroare: "+ err.Message;}
finally {conn.Close();}
Exemplu:
RETURN
Codul SQL dintr-o procedură stocată poate fi generat automat urmând aceeaşi
paşi prin care se generează vizual o interogare.
Secvenţele de cod SQL din procedura stocată pot fi selectate şi executate separat.
198
66
În limba engleză data binding
67
Capitolul 5.5.2
68
Întrucât bazele de date Acess nu au server dedicat (precum SQL Server) care să gestioneze
accesul concurent ele sunt indicate în cazul site-urile mici pentru care numărul utilizatorilor simultani
este redus.
INTERACŢIUNEA CU BAZE DE DATE WEB 199
Bazele de date pot fi legate la mai multe tipuri de controale însă unele dintre acestea
au fost proiectate exclusiv pentru bazele de date.
Printre acestea se numără GridView, DetailsView, şi FormView, controale ce pot
afişa mai multe câmpuri la un moment dat sub forma unui tabel sau a unei structuri bine
definite şi permit operaţii de selectare, editare şi ordonare.
Cele mai puternice controale ce pot fi legate la baze date sunt:
este ideal pentru afişarea la un moment dat a unei singure înregistrări dintr-
o tabelă, într-un tabel ce are o singură linie pentru fiecare câmp şi permite editarea;
69
în limba engleză grid
INTERACŢIUNEA CU BAZE DE DATE WEB 201
string connectionString =
WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
string selectSQL = "SELECT * FROM clase";
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand(selectSQL, con);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds, "clase");
GridView1.DataSource = ds;
GridView1.DataBind();
Definirea coloanelor
tip descriere
afişează un buton
afişează o casetă de validare şi se utilizează pentru câmpurile ce pot
avea una dintre valorile True/False
conţine butoane pentru selecţie sau editare
afişează conţinutul ca hyperlink.
afişează imaginea dintr-un câmp 70
permite afişarea câmpurilor folosind şabloane personalizate
Configurarea coloanelor
Atunci când declarăm explicit coloanele legate putem seta proprietăţile acestora :
DataField – numele câmpului ce va fi afişat în coloană
DataFormatString – indică modul de formatare a datelor de pe coloană
FooterText/HeaderText/HeaderImageUrl-setează textul/imaginea din antet
/subsol
ReadOnly- permite/inhibă modificarea conţinutului coloanei în mod editare
InsertVisible- permite/inhibă inserarea valorilor în coloană
Visible- permite/inhibă afişarea coloanei
SortExpression- permite ordonarea valorilor de pe această coloană
NullDisplayText- afişează un text în locul valorilor NULL de pe coloană
ConvertEmptyStringToNull- converteşte şirurile vide de pe coloană la NULL
ControlStyle, HeaderStyle, FooterStyle, and ItemStyle – stabileşte modul în
care sunt afişate datele pe acea coloană
70
furnizorul trebuie să suporte formatul în care este memorată imaginea
INTERACŢIUNEA CU BAZE DE DATE WEB 203
Un control de tip GridView permite selectarea unui rând din tabel atunci când
proprietatea ShowSelectButton a coloanei de tip CommandField este setată la True.
Fiecare element de pe această coloană poate fi afişat ca legătură, ca buton sau ca imagine.
În exemplul următor butoanele Select sunt afişate ca legături.
Pentru a putea şterge sau modifica o înregistrare din tabela legată unui control
GridView trebuie să definim comenzile de ştegere şi actualizare ca în exemplu:
Pentru exemplificare,se modifică valoarea din câmpul „intensiv” pentru clasa 9F.
În exemplul următor datele sunt ordonate mai întâi după profil şi după aceea după
specializare.
71
numele coloanelor sunt subliniate
INTERACŢIUNEA CU BAZE DE DATE WEB 207
<ItemTemplate>
<b>Clasa:</b>
<%# Eval("idClasa") %><br />
<b>Profil:</b>
<%# Eval("profil") %><br />
<b>Specializare:</b>
<%# Eval("specializare") %><br />
</ItemTemplate>
</asp:FormView>
Şablonul Header este procesat o singură dată şi iniţiază grafic tabela şi titlul.
<HeaderTemplate>
<table style ="border:1px solid black;"class="stdtext">
<thead bgcolor="#ff6666" style:white">
<td><b> Clasa </b></td>
<td><b> Profil </b></td>
<td><b> Specializare </b></td>
</thead>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td bgcolor="#ffcc99">
<b><%# DataBinder.Eval(Container.DataItem,"idClasa") %></b></td>
<td bgcolor="#ffcc99">
<%#DataBinder.Eval(Container.DataItem,"profil")%></td>
<td bgcolor="#ffcc99">
<%#DataBinder.Eval(Container.DataItem,"specializare") %> </td>
</tr>
</ItemTemplate>
<AlternatingItemTemplate>
<tr>
<td bgcolor="#ffffcc">
<b><%# DataBinder.Eval(Container.DataItem,"idClasa") %></b></td>
<td bgcolor="#ffffcc">
<%# DataBinder.Eval(Container.DataItem,"profil") %> </td>
<td bgcolor="#ffffcc">
<%# DataBinder.Eval(Container.DataItem,"specializare") %> </td>
</tr>
</AlternatingItemTemplate>
Şablonul Footer este afişat, ca şi şablonul Header, o singură dată. Acest şablon defineşte
rândul final.
<FooterTemplate>
<tfoot>
<td bgcolor="#ffcc66" colspan="3"><%# " Clase" %></td>
</tfoot>
</table>
</FooterTemplate>
V.10.4.2 DataList
controlului poate fi personalizat prin setarea de proprietăţi stil pentru diferite părţi ale
controlului.
Controlul DataList prezintă structuri grafice predefinite, posibilităţi avansate de
formatare şi suport pentru selectare şi editare.
Operaţiile fundamentale de legare la date care folosesc DataList sunt similare celor
care folosesc Repeater. Se foloseşte proprietatea DataSource pentru a lega controlul la date
şi metoda DataBind pentru a actualiza interfaţa utilizator.
Contolul DataList suportă două şabloane speciale SelectedItemTemplate şi
EditItemTemplate.
V.10.4.3 DropDownList
În exemplul următor elementele listei derulante sunt preluate din tabela clase.
V.10.4.4 CheckBoxList
La un moment dat , un control CheckBoxList poate avea unul sau mai multe elemente
selectate.
Toate controalele listă au o proprietate Items
(elemente) care conţine setul de elemente fii. Proprietatea
Items este implementată prin intermediul clasei
ListItemCollection, iar fiecare element din listă pote fi accesat
printr-un obiect ListItem.
V.10.4.5 RadioButtonList
V.10.5. Evaluare
1) Pentru toate cerinţele de mai jos se consideră următorul scenariu:
Administratorul unei firme trebuie să ţină o evidenţă a departamentelor firmei şi a
angajaţilor care lucrează în aceste departamente. Un angajat nu poate lucra în acelaşi timp
la mai multe departamente.În timp, un angajat poate fi mutat de la un departament la altul.
Fiecare departament are un şef .
a) contruiţi un model conceptual care să corespundă cadrului prezentat şi să conţină
cel puţin două tabele : angajati, departamente.
b) adăugaţi înregistrări în tabele folosind modul vizual
c) generaţi diagrama corespunzătoare modelului conceptual ales
d) proiectaţi o pagină Web care să vă permită efectuarea următoarelor operaţii
(pentru fiecare operaţie se utilizează controler-ul indicat)
d.1 afişarea angajaţilor din firmă (GridView)
d.2 afişarea departamentelor din firmă (DetailsView)
d.3 afişarea angajaţilor dintr-un departament (FormView)
d.4 afişarea şefilor de departament (Repeater)
d.5 afişarea informaţiilor referitoare la unul dintre angajaţi (DataList)
d.6 ştergerea unui angajat din baza de date (DataList)
d.7 mutarea unui angajat de la un departament la altul (DropDownList)
d.8 ştergerea unui departament din baza de date (implicit a angajaţilor care
lucrează în acest departament) (RadioButtonList)
d.9 adăugarea unui angajat (GridView)
d.10 adăugarea unui departament (DetailsView)
d.11 afişarea numărului de angajaţi din mai multe departamente
(CheckBoxList)
2) Construiţi o pagină Web care să permită gestiunea unui depozit de materiale, ştiind
că : au loc operaţii de vânzare şi aprovizionare, se pot vizualiza informaţii referitoare la stocul
de materiale, persoanele care cumpără din depozit sunt persoane fizice sau juridice.
3) Construiţi o pagină Web care să permită vânzarea de bilete on-line la diferite
spectacole.
4) Realizaţi o aplicaţie care să implementeze activiatea desfăşurată la o grădină
zoologică (evidenţa animalelor, angajaţilor, etc)
5) Realizaţi o aplicaţie care să reprezinte site-ul unui muzeu virtual.
214
VI.1.Windows Authentication
VI.2.Forms-Based Authentication
Aceste obiective pot fi atinse foarte u or utilizând func ionalită ile i uneltele din
ASP.NET respectiv Visual Studio, anume clasa Membership si unealta ASP.NET
Configuration (din meniul Website al Visual Studio Web Developer Express). Configurarea
autentificarii si autorizarii se poate realiza dupa cum se vede in acest tutorial:
http://msdn2.microsoft.com/en-us/library/879kf95c(VS.80).aspx .
216
VII.1.1. MasterPages
Pentru a obţine un aspect unitar al site-ului, se foloseşte o pagină specială numită
MasterPage. Aceasta este o machetă pe baza căreia vor fi realizate toate paginile din site-ul
web. În afara conţinutului moştenit din MasterPage, fiecare pagină .aspx va avea şi un
conţinut propriu.
Proiectarea şi realizarea unei aplicaţii Web 217
Pentru a adăuga o pagină MasterPage, din meniul Website se alege opţiunea Add
New Item, şi apoi MasterPage:
Figura 7.4 La adăugarea unei noi pagini .aspx se bifează opţiunea Select master page
Layout-ului paginii MasterPage poate fi realizat prin intermediul tabelelor sau prin
intermediul tag-urilor html <div> formatate prin declaraţii css. În exemplul de mai sus, pentru
definirea layout-ului s-au folosit tag-uri <div>:
Zona de header:
Coloana este formată din două casete de informaţii, fiecare fiind definită de un div.
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<link href="StyleSheet.css" rel="stylesheet" type="text/css" />
<title>Movie Info</title>
<asp:ContentPlaceHolder id="head" runat="server"></asp:ContentPlaceHolder>
</head>
<body>
<form id="form1" runat="server">
<div id="header">
<div id="logo"></div>
<div id = "banner"> </div>
</div>
<div id="page">
<div id="content">
<asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</div>
<div id="sidebar">
<div class="boxed">
<h2 class="title">Top Incasari</h2>
<div class="content"></div>
</div>
<div class="boxed">
<h2 class="title">In curand</h2>
<div class="content"></div>
</div>
</div>
</div>
<div id="footer"></div>
</form>
</body>
</html>
Figura 7.17 Opţiunile din meniul Styles pentru construirea foilor de stil
Cu ajutorul opţiunii Add Style Rule puteţi defini o nouă regulă de stil, o nouă clasă
sau o regulă de formatare pentru un tag html identificat printr-un id.
Odată definită o declaraţie css, puteţi stabili formatările prin intermediul opţiunii Build Style.
Pentru un control server web puteţi folosi proprietatea CssClass pentru a-i asocia o
clasă css definită în fişierul StyleSheet.css. De exemplu, controlul Menu1 din MasterPage
are asociată clasa css menu.
<div id="logo">
<asp:HyperLink ID="HyperLink5" runat="server"
ImageUrl="~/images/logo1.gif" NavigateUrl="~/Home.aspx">Movie Info
</asp:HyperLink>
</div>
În secţiunea de banner vom folosi un control de tip AdRotator, care va afişa bannere
de filme. Controlul AdRotator va fi conectat la o sursă de date. De asemenea, pentru
navigarea între paginile site-ului, vom utiliza un control de tip Menu.
<div id="header">
<div id="logo">
<asp:HyperLink ID="HyperLink5"runat="server"ImageUrl="~/images/logo1.gif"
NavigateUrl="~/Home.aspx"> Movie Info
</asp:HyperLink>
</div>
<div id = "banner">
<asp:AdRotator ID="AdRotator1" runat="server" Height="75px"
Target="_blank" Width="474px" />
<asp:Menu ID="Menu1" runat="server" Orientation="Horizontal"
CssClass="menu">
<StaticMenuStyle VerticalPadding="0px" />
<StaticMenuItemStyle Font-Bold="True" BorderColor="White"
BorderStyle="Solid" BorderWidth="1px" HorizontalPadding="5px" />
<StaticHoverStyle BackColor="#990000" ForeColor="Blue" />
<Items>
<asp:MenuItem Text="Home" Value="Home"NavigateUrl="~/Home.aspx">
</asp:MenuItem>
<asp:MenuItem Text="Filme" Value="Filme" NavigateUrl="~/Movie.aspx">
</asp:MenuItem>
226
<asp:MenuItem Text="Contact"Value="Contact"NavigateUrl="~/Contact.aspx">
</asp:MenuItem>
</Items>
</asp:Menu>
</div>
</div>
<div id="page">
<div id="content">
<asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</div>
<div id="sidebar">
<div class="boxed"><h2 class="title">Top Incasari</h2>
<div class="content">
<asp:BulletedList ID="BulletedList1" runat="server"DisplayMode="LinkButton"
DataValueField="id" onclick="BulletedList1_Click" Target="_parent">
</asp:BulletedList>
</div>
</div>
<div class="boxed"><h2 class="title">In curand</h2>
<div class="content">
<asp:BulletedList ID="BulletedList2" runat="server"DisplayMode="LinkButton"
onclick="BulletedList2_Click">
</asp:BulletedList>
</div>
</div>
</div>
</div>
<div id="footer">
<p> </p>
<p>© 2008
<asp:HyperLink ID="HyperLink6" runat="server" Font-Bold="True"
NavigateUrl="http://www.microsoft.com/romania/educatie/cursnet/default.mspx"
Target="_blank">Microsoft Romania</asp:HyperLink>
</p>
<p id="links">
<asp:HyperLink ID="HyperLink1" runat="server"NavigateUrl="~/Home.aspx">Home
</asp:HyperLink> |
<asp:HyperLink ID="HyperLink2" runat="server" NavigateUrl="~/Movie.aspx">Filme
</asp:HyperLink> |
<asp:HyperLink ID="HyperLink4" runat="server"NavigateUrl="~/Contact.aspx">Contact
</asp:HyperLink>
</p>
</div>
Proiectarea şi realizarea unei aplicaţii Web 227
Pentru a adăuga o bază de date în cadrul site-ului web, în fereastra Solution Explorer
apăsaţi click dreapta pe directorul App_Data şi apoi alegeţi opţiunea Add New Item. În noua
fereastră selectaţi Sql Server Database. Noua bază de date va fi denumită filme.mdf.
Figura 7.22 Adăugarea unei baze de date sql server în cadrul site-ului web
Pentru a păstra simplitatea site-ului web, informaţiile despre filme le vom reţine într-o
singură tabelă, deşi aceasta nu se găseşte în forma normală 3. Structura tabelei film este
următoarea:
Câmpul id este cheie primară. Ca şi în Access, MySql sau Oracle, şi în Sql Server
puteţi defini un câmp pentru care valorile se autoincrementează. Pentru aceasta, trebuie
setată proprietatea Is Identity cu valoarea yes.
228
În baza de date filme vom mai adăuga o nouă tabelă numită ads, care va constitui
sursa de date pentru controlul AdRotator din MasterPage. Această tabelă trebuie să aibă
structura:
Pentru controlul AdRotator avem nevoie de toate înregistrările din tabelă, deci vom
folosi interogarea: SELECT * FROM ads
Pentru a modifica interogarea sql, puteţi alege opţiunea Configure Data Source a
controlului SqlDataSource generat.
Pentru caseta de informaţii „Top încasări” parcurgem aceeaşi paşi. La pasul doi
putem folosi connection string –ul generat anterior. Interogarea pentru extragerea
interogărilor este:
SELECT TOP (5) nume, id FROM film
WHERE (data_aparitie < GETDATE()) ORDER BY incasari DESC
Sunt selectate primele 5 filme care au apărut înaintea datei curente, în ordinea
descrescătoare a încasărilor.
Figura 7.33 Interogarea Sql folosită pentru caseta de informaţii „Top încasări”
Caseta de informaţii „În curând” trebuie să afişeze primele 5 filme care au data
apariţiei mai mare decât data curentă. Pentru clauza Where putem utiliza funcţia
GETDATE() care returnează data curentă, la fel ca în cazul casetei „Top încasări”. Pentru a
exemplifica însă diversele posibilităţi de construcţie a interogărilor, vom folosi o altă
abordare.
Interogarea de extragere a filmelor cu data apariţiei mai mare ca data curentă, va
avea un parametru.
SELECT TOP 5 nume, id FROM film
WHERE (data_aparitie > @dataAparitie) ORDER BY data_aparitie
Numele parametrului este precedat de caracterul @.
Figura 7.35 Interogarea parametrizată pentru selectarea filmelor cu data apariţiei mai
mare ca data trimisă ca parametru.
Figura 7.36 Parametrul interogării va fi preluat din sesiune, câmpul numit „data”
Proiectarea şi realizarea unei aplicaţii Web 233
VII.2. Home.aspx
VII.3. Movie.aspx
În această pagină sunt afişate filmele din baza de date şi se poate realiza filtrarea
acestora după anumite criterii.
Sursa de date din GridView va fi un obiect DataSet. Adăugarea unui obiect DataSet
se poate realiza prin intermediul opţiunii Add New Item.
Obiectul DataSet poate conţine unul sau mai multe obiecte TableAdapter. Fiecare
TableAdapter poate avea mai multe interogări care populează obiectul DataSet. Cea mai
simplă metodă pentru a adăuga un obiect TableAdapter pentru o tabelă, este cu drag & drop
din fereastra Database Explorer în fereastra DataSet. În cazul proiectului nostru, a fost creat
un obiect TableAdapter corespunzător tabelei film.
Figura 7.41 Adăugarea unui obiect TableAdapter prin Drag&Drop din fereastra Database
Explorer
Implicit este creată metoda FillAll, care returnează toate înregistrările din tabelă.
Pentru a vedea rezultatul interogării, se poate alege opţiunea Preview Data.
Adăugarea unei noi interogări este realizată cu ajutorul opţiunii Add Query, iar
modificarea unei interogări existente cu ajutorul opţiunii Configure.
Figura 7.43 Tipul sursei de date pentru controlul GridView este Object
Filtrarea datelor din controlul GridView se realizează prin intermediul criteriilor definite
de controalele de tip RadioButton. Există 3 modalităţi de filtrare: după categoria filmului,
după numele acestuia sau afişarea tuturor filmelor. Categoria filmului căutat poate fi
selectată printr-un control DropDownList.
<asp:ListItem>S.F.</asp:ListItem>
<asp:ListItem>Romance</asp:ListItem>
<asp:ListItem>Drama</asp:ListItem>
<asp:ListItem>Razboi</asp:ListItem>
<asp:ListItem>Actiune</asp:ListItem>
<asp:ListItem>Aventura</asp:ListItem>
<asp:ListItem>Desene animate</asp:ListItem>
</asp:DropDownList>
</td>
</tr>
<tr>
<td class="style2">
<asp:RadioButton ID="RadioButton2" runat="server" AutoPostBack="True"
Font-Bold="True" ForeColor="White" GroupName="filtru"
oncheckedchanged = "RadioButton2_CheckedChanged" Text="Nume" />
</td>
<td>
<asp:TextBox ID="TextBox1" runat="server" CssClass="textBox"
Enabled="False" Width="130px" AutoPostBack="True"
ontextchanged="TextBox1_TextChanged"></asp:TextBox>
</td>
</tr>
<tr>
<td class="style2">
<asp:RadioButton ID="RadioButton3" runat="server" AutoPostBack="True"
Checked="True" Font-Bold="True" ForeColor="White" GroupName="filtru"
Text="Toate" oncheckedchanged = "RadioButton3_CheckedChanged" />
</td>
<td> </td>
</tr>
</table>
</asp:Panel>
Pentru a putea filtra datele din GridView, vom adauga obiectului TableAdapter 3
metode, ce conţin interogări sql parametrizate. Metodele se vor numi GetDataById(),
GetDataByCategory(), GetDataByName().
Interogarea va returna acea înregistrare din tabela film, care are valoarea câmpului id
egală cu valoarea trimisă ca parametru:
SELECT actori, categoria, data_aparitie, id, incasari, nume, poza, regizor
FROM film WHERE (id = @id)
Acelaşi procedeu îl vom folosi şi pentru filtrarea după criteriile nume şi categorie:
ObjectDataSource1.SelectMethod = "GetData";
ObjectDataSource1.SelectParameters.Clear();
}
VII.4. Detalii.aspx
Pentru afişarea şi modificarea informaţiilor pentru un film, vom folosi un control de tip
DetailsView
Sursa de date pentru acest control va fi tot obiectul DataSet. Metoda care va popula
controlul DatailsView va fi GetDataById(). Valoarea parametrului @id din interogare, este
preluat prin QueryString, deoarece in această pagină se ajunge din movie.aspx prin
selectarea link-ului Detalii din controlul GridView. Paşii pentru selectarea sursei de date sunt:
În lista de câmpuri ale controlului DetailsView, vrem să apară un link către pagina
care permite upload-ul unui fişier, respectiv un câmp de tip imagine, care să afişeze imagina
upload-ată. Imaginea reprezintă posterul filmului, iar câmpul poza din tabela film conţine
numele fişierului imagine. Toate posterele sunt upload-ate în directorul images/movies.
Proiectarea şi realizarea unei aplicaţii Web 245
VII.5. Upload.aspx
În această pagină utilizatorul poate upload-a un fişier, acesta fiind salvat îndirectorul
/images/movies/. Controlul de tip FileUpload are asociat un control de validare de tip
RequiredFieldValidator. De asemenea, pentru a afişa erorile vom utiliza un control de tip
ValidationSummary.
Utilizatorul poate ajunge în pagina upload.aspx fie din pagina de adăugare a unui nou
film (AdaugăFilm.aspx), fie din pagina de detalii (Detalii.aspx). Deoarece în pagina de detalii
posterul filmului este afişat printr-un câmp ImageField al controlului DetailsView, după
upload-ul fişierului pe server se salvează numele fişierului uploadat în tabela film din baza de
date filme.
Pentru conectarea la baza de date se foloseşte şirul de conectare salvat în fişierul
web.config. Astfel, în această pagină trebuie inclus spaţiul de nume
System.Web.Configuration:
using System.Web.Configuration;
VII.6. AdaugăFilm.aspx
<asp:Content ID="Content2"ContentPlaceHolderID="ContentPlaceHolder1"Runat="Server">
<table cellpadding="5" cellspacing="1" class="style1">
<tr>
<td bgcolor="#990000">
<asp:Label ID="Label1" runat="server" Font-Bold="True" ForeColor="White"
Text="Denumirea:"></asp:Label>
</td>
<td>
<asp:TextBox ID="txtDenumire" runat="server" Width="213px" TabIndex="1"
BorderStyle="Groove" CssClass="textBox" MaxLength="50"></asp:TextBox>
</td>
<td>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
ControlToValidate="txtDenumire" ErrorMessage="Nu ati introdus denumirea"
Font-Bold="True" ForeColor="#990000">*</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td bgcolor="#990000">
<asp:Label ID="Label2" runat="server" Font-Bold="True" ForeColor="White"
Text="Regizorul:"></asp:Label>
</td>
<td>
<asp:TextBox ID="txtRegizor" runat="server" Width="214px" TabIndex="2"
BorderStyle="Groove" CssClass="textBox" MaxLength="50"></asp:TextBox>
</td>
<td>
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server"
ControlToValidate="txtRegizor" ErrorMessage="Nu ati introdus regizorul"
Font-Bold="True" ForeColor="#990000">*</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td bgcolor="#990000">
<asp:Label ID="Label3" runat="server" Font-Bold="True" ForeColor="White"
Text="Actori:"></asp:Label>
</td>
<td>
<asp:TextBox ID="txtActori" runat="server" Rows="5" TextMode="MultiLine"
Width="212px" TabIndex="3" BorderStyle="Groove" CssClass="textBox"
MaxLength="50"></asp:TextBox>
</td>
<td>
<asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server"
ControlToValidate="txtActori" ErrorMessage="Nu ati introdus actorii"
Font-Bold="True"ForeColor="#990000">*
</asp:RequiredFieldValidator>
</td>
</tr>
250
<tr>
<td bgcolor="#990000">
<asp:Label ID="Label4" runat="server" Font-Bold="True" ForeColor="White"
Text="Data aparitiei:"></asp:Label>
</td>
<td>
<asp:TextBox ID="txtData" runat="server" Width="100px" TabIndex="4"
BorderStyle="Groove" CssClass="textBox"></asp:TextBox>
<asp:ImageButton ID="ImageButton1" runat="server"
ImageUrl="~/images/calendar.gif" onclick="ImageButton1_Click"
ToolTip="Calendar" CausesValidation="False" />
<asp:Calendar ID="Calendar1" runat="server" BackColor="#FFFFCC"
BorderColor="#FFCC66" BorderWidth="1px" DayNameFormat="Shortest"
Font-Names="Verdana" Font-Size="8pt" ForeColor="#663399" Height="200px"
ShowGridLines="True" Visible="False" Width="220px"
onselectionchanged="Calendar1_SelectionChanged">
<SelectedDayStyle BackColor="#CCCCFF" Font-Bold="True" />
<SelectorStyle BackColor="#FFCC66" />
<TodayDayStyle BackColor="#FFCC66" ForeColor="White" />
<OtherMonthDayStyle ForeColor="#CC9966" />
<NextPrevStyle Font-Size="9pt" ForeColor="#FFFFCC" />
<DayHeaderStyle BackColor="#FFCC66"Font-Bold="True"Height="1px" />
<TitleStyle BackColor="#990000" Font-Bold="True" Font-Size="9pt"
ForeColor="#FFFFCC" />
</asp:Calendar>
</td>
<td>
<asp:RequiredFieldValidator ID="RequiredFieldValidator4" runat="server"
ControlToValidate="txtData" ErrorMessage="Nu ati introdus data aparitiei"
Font-Bold="True" ForeColor="#990000">*</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td bgcolor="#990000">
<asp:Label ID="Label7" runat="server" Font-Bold="True" ForeColor="White"
Text="Incasari:"></asp:Label>
</td>
<td>
<asp:TextBox ID="txtIncasari" runat="server" TabIndex="5" BorderStyle="Groove"
CssClass="textBox">0</asp:TextBox>
</td>
<td>
<asp:RangeValidator ID="RangeValidator1" runat="server"
ControlToValidate="txtIncasari" ErrorMessage="Incasarile intre 0 si 1000000 $"
Font-Bold="True" ForeColor="#990000" MaximumValue="1000000"
MinimumValue="0">*</asp:RangeValidator>
</td>
</tr>
<tr>
<td bgcolor="#990000" class="style5">
<asp:Label ID="Label5" runat="server" Font-Bold="True" ForeColor="White"
Text="Categoria:"></asp:Label>
</td>
<td>
<asp:DropDownList ID="DropDownList1" runat="server" TabIndex="6"
CssClass="textBox">
Proiectarea şi realizarea unei aplicaţii Web 251
<asp:ListItem>S.F.</asp:ListItem>
<asp:ListItem>Romance</asp:ListItem>
<asp:ListItem>Drama</asp:ListItem>
<asp:ListItem>Razboi</asp:ListItem>
<asp:ListItem>Actiune</asp:ListItem>
<asp:ListItem>Aventura</asp:ListItem>
<asp:ListItem>Desene animate</asp:ListItem>
</asp:DropDownList>
</td>
<td> </td>
</tr>
<tr>
<td bgcolor="#990000">
<asp:Label ID="Label6" runat="server" Font-Bold="True" ForeColor="White"
Text="Poster:"></asp:Label>
</td>
<td >
<asp:TextBox ID="txtPoster" runat="server" CssClass="textBox" Height="22px"
MaxLength="50" Width="173px"></asp:TextBox>
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False"
onclick="LinkButton1_Click">Upload </asp:LinkButton>
</td>
<td>
<asp:RequiredFieldValidator ID="RequiredFieldValidator5" runat="server"
ControlToValidate="txtPoster" ErrorMessage="Nu ati uploadat posterul"
ForeColor="#990000">*</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td align="center" colspan="3">
<asp:Button ID="Button1" runat="server" Text="Adauga" CssClass="button"
onclick="Button1_Click" />
</td>
</tr>
<tr>
<td colspan="3">
<asp:ValidationSummary ID="ValidationSummary1" runat="server"
Font-Bold="True" ForeColor="#990000" />
</td>
</tr>
</table>
</asp:Content>
Afişarea sau ascunderea calendarului se realizează prin intermediul unui control de tip
ImageButton .
Server.Transfer("Upload.aspx?id=0");
}
În evenimentul Page_Load al paginii vom verifica dacă sunt date în sesiune, şi vom
iniţializa controalele din pagină.
Proiectarea şi realizarea unei aplicaţii Web 253
La apăsarea butonului Adaugă, datele vor fi salvate în baza de date şi şterse din
sesiune:
cmd.Parameters.AddWithValue("@poza", txtPoster.Text.Trim());
cmd.Parameters.AddWithValue("@categoria", DropDownList1.SelectedValue);
cmd.ExecuteNonQuery();
Session.Remove("denumire");
Session.Remove("regizor");
Session.Remove("actori");
Session.Remove("dataAparitiei");
Session.Remove("incasari");
Session.Remove("denumire");
Session.Remove("categoria");
Session.Remove("uploadedFileName");
Server.Transfer("Movie.aspx");
}
VII.7. Contact.aspx
Datele introduse de utilizator în acest formular, vor fi trimise prin email către
deţinătorul paginii. Pentru realizarea formularului, s-a folosit un control de tip Wizard, care
conţine trei paşi.
Figura 7.59
Pasul 1 de
completare al
formularului de
contact
Figura 7.63
Al doilea pas este de tip Finish
256
<td class="style3">
<asp:TextBox ID="txtEmail" runat="server" Width="215px"></asp:TextBox>
</td>
<td>
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server"
ControlToValidate="txtEmail" ErrorMessage="Nu ati introdus email-ul" Font-Bold="True"
ForeColor="#990000">*</asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server"
ControlToValidate="txtEmail" ErrorMessage="Nu ati scris corect email-ul"
Font-Bold="True" ForeColor="#990000"
ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">*
</asp:RegularExpressionValidator>
</td></tr>
<tr>
<td class="style2" colspan="3">
<asp:ValidationSummary ID="ValidationSummary1" runat="server" Font-Bold="True"
ForeColor="#990000" />
</td></tr></table>
</asp:WizardStep>
<asp:WizardStep runat="server" title="Comentarii" StepType="Finish">
<table class="style1">
<tr>
<td class="style4">
<asp:Label ID="Label3" runat="server" Font-Bold="True"
Text="Comentariile dvs (nu mai mult de 50 caractere)"></asp:Label>
</td>
<td class="style3">
<asp:TextBox ID="txtComments" runat="server" Rows="5"
TextMode="MultiLine" Width="217px"></asp:TextBox>
</td>
<td>
<asp:CustomValidator ID="CustomValidator1" runat="server"
ControlToValidate="txtComments" ErrorMessage="Nu mai mult de 50 carcatere"
Font-Bold="True" ForeColor="#990000" OnServerValidate=
"CustomValidator1_ServerValidate" ValidateEmptyText="True">*</asp:CustomValidator>
</td></tr>
<tr>
<td class="style2" colspan="3">
<asp:ValidationSummary ID="ValidationSummary2" runat="server"
Font-Bold="True" ForeColor="#990000" />
</td></tr></table></asp:WizardStep>
<asp:WizardStep runat="server" StepType="Complete" Title="Trimite">
<asp:Label ID="Label4" runat="server" Font-Bold="True"
Text="Mailul a fost trimis!"></asp:Label></asp:WizardStep></WizardSteps>
<SideBarButtonStyle ForeColor="White" />
<NavigationButtonStyle BackColor="White" BorderColor="#CC9966" BorderStyle="Solid"
BorderWidth="1px" Font-Names="Verdana" Font-Size="0.8em" ForeColor="#990000" />
<SideBarStyle BackColor="#990000" Font-Size="Small" VerticalAlign="Top" Width="80px" />
<HeaderStyle BackColor="#FFCC66" BorderColor="#FFFBD6" BorderStyle="Solid"
BorderWidth="2px" Font-Bold="True" Font-Size="0.9em" ForeColor="#333333"
HorizontalAlign="Center" />
<StepPreviousButtonStyle BackColor="#990000" BorderColor="Black"
BorderStyle="Solid" Font-Bold="True" Font-Size="X-Small" ForeColor="White"
Height="20px" Width="60px" />
</asp:Wizard>
</asp:Content>
258
VII.8. Evaluare
1. Adăugaţi bazei de date o tabelă numită Categorii, care va conţine toate categoriile
posibile ale unui film. Modificaţi apoi controalele de tip DropDownList din paginile
Movie.aspx respectiv AdaugăFilm.aspx astfel încăt să preia datele direct din tabela
nou introdusă. Veţi folosi un obiect de tip TableAdapter adăugat în DataSet-ul
existent.
2. Adăugaţi o nouă tabelă numită Actori. Realizaţi un formular de introducere a datelor
pentru noua tabelă. Modificaţi formularul de introducere a informaţiilor despre film ,
astfel încât actorii sa fie preluaţi din noua tabelă.
3. Modificaţi pagina upload.aspx astfel încât să realizeze doar upload-ul unui fişier, fără
a mai salva în baza de date numele acestuia. Apoi modificaţi pagina detalii.aspx
astfel încât să permită vizualizarea posterului upload-at în pagina upload.aspx.
4. Presupunând că firma dvs. are două locaţii într-un singur oraş, adăugaţi o nouă
pagină numită Despre.aspx, care să conţină un control de tip ImageMap. Imaginea
trebuie să fie o hartă cu cele două locaţii, iar la click pe fiecare dintre ele trebuie să se
afişeze informaţiile despre locaţia respectivă într-o nouă pagină.
b. C
c. Visual Basic .Net
4. Pentru a delimita codul C# sau VB.Net scris în cadrul unei pagini se foloseşte tag-ul:
a. < Body >
b. < Head >
c. < Script >
5. Controlul ASP.Net folosit pentru afişarea unui text într-o pagină web este:
a. < asp:label >
b. < asp:listitem >
c. < asp:button >
6. Controlul ASP <asp:dropdownlist> corespunde cărui tag Html ?
a. < Option >
b. < Select >
c. < List >
7. Controlul ASP < asp : listitem > corespunde cărui tag Html ?
a. < Option >
b. < UL >
c. < List >
8. Proprietatea “EnableViewState” permite salvarea datelor introduse de utilizator?
a. Da
b. Nu
9. Care din următoarele posibilităţi nu este o modalitate de menţinere a stării ?
b. Querystate
c. HiddenField
d. Application
e. Cookies
10. Într-o pagină web trebuie salvate informaţii de dimensiuni mici între două accesări ale
paginii. Securitatea datelor nu este importantă. Care dintre următoarele posibilităţi este cea
mai potrivită?
a. cookie
b. query string
c. url
d. javascript function
e. hidden field
11. Care dintre următoarele evenimente este ultimul în cadrul cilului de viaţă a unei pagini
web?
a. Page_Load
b. Validate
c. Page_Init
12. Care dintre următoarele proprietăţi este comună tuturor controalelor de validare?
a. ValueToCompare
b. ControlToValidate
c. InitialValue
d. ValidationExpression
e. ControlToCompare
13. Ce tip de dată are valoarea returnată de proprietatea IsPostBack
a. bit
b. boolean
c. int
d. object
e. string
14. Într-o pagină web există un control de tip DropDownList pentru a reţine nume de
persoane. Controlul are două valori: Ion şi Marius. La apăsarea unui buton de submit, se
generează o acţiune de post back. În loc de două valori, controlul DropDownList conţine 4: 2
valori „Ion” şi 2 valori „Marius”. De ce?
Test de verificare a cunoştinţelor 261