Sunteți pe pagina 1din 71

UNIVERSITATEA DIN BUCURETI

FACULTATEA DE MATEMATIC I INFORMATIC

LUCRARE DE LICEN
Evidena evenimentelor n ASP .NET i C#

COORDONATOR TIINIFIC
Lect. Dr. Mihail Cherciu
ABSOLVENT
(prenume nume)

BUCURETI
2013

1. NOIUNI INTRODUCTIVE..................................................................................................3

1.1 Aplicaii web

1.1.1 Servicii Web...........................................................................................................4


1.1.2 Despre browser.......................................................................................................5
1.1.3 HTTP (Hypertext Transfer Protocol)......................................................................6
1.2 Despre Ajax

1.2.1 Proprietile i metodele obiectului XMLHTTPRequest......................................8


1.3 Ajax n ASP .NET 9
1.3.1 ScriptManager........................................................................................................9
1.3.2 Update Panel.........................................................................................................10
1.3.3 Update Progress....................................................................................................10
2. INTRODUCERE N ASP .NET I C#..................................................................................12

2.1 Generaliti despre C#

12

2.1.1 Manipularea obiectelor.........................................................................................12


2.1.2 Interfee.................................................................................................................14
2.1.3 Delegai.................................................................................................................14
2.1.4 Folosirea i importarea spaiilor de nume............................................................15
2.1.5 Membrii statici......................................................................................................17
2.1.6 Suprancrcarea metodelor...................................................................................17
2.2 Elemente de baz n ASP .NET 19
2.2.1 Tipuri de date in .NET..........................................................................................19
2.2.2 Structura unei pagini n ASP. NET.......................................................................20
2.2.3 Tipurile de fiiere ASP .NET................................................................................21
2.2.4 Clasa Page............................................................................................................22
2.2.5 Trimiterea ctre o alt pagin...............................................................................23
2.2.6 Elemente HTML n ASP .NET i C#....................................................................24
2.2.7 Codificarea HTML - ului......................................................................................26
2.3 Tipuri de controale web din ASP .NET

27

2.3.1 Repeater................................................................................................................27
2.3.2 DataList................................................................................................................27
2.3.3 DataGrid...............................................................................................................28
1

2.3.4 GridView..............................................................................................................28
2.4 Clasele WebControl

31

2.4.1 Clasa WebControl de baz....................................................................................31


2.4.2 Obiectele de tip Color...........................................................................................32
2.4.3 Obiectele de tip FontInfo......................................................................................33
2.5 Despre evenimente i AutoPostBack

33

2.5.1 Funcionarea Post Back ului..............................................................................34


2.5.2 Ciclul vieii unei pagini........................................................................................35
2.6 Validatori n asp .NET

36

2.6.1 Tipuri de validatori...............................................................................................36


2.6.2 Proprieti ale clasei BaseValidator......................................................................37
2.7 Obiectul de tip Calendar 38
2.7.1 Proprieti.............................................................................................................38
2.8 Cookie-uri n ASP .NET 39
2.9 Sesiuni n ASP .NET

40

2.9.1 Configurarea strii Session-ului...........................................................................41


2.10 Interaciunea cu baza de date

42

2.10.1 Ciclul vieii unei pagini cu Data Binding...........................................................42


2.10.2 SqlDataSource....................................................................................................43
2.10.3 Interogri parametrizate......................................................................................45
2.10.4 Modificarea nregistrrilor..................................................................................46
3. DESCRIEREA APLICAIEI................................................................................................49

3.1 Descrierea aplicaiei

49

3.2 Baza de date diagrama conceptual


3.3 Structura aplicaiei

50

51

3.3.1 Pagina principal..................................................................................................51


3.3.2 Pagina de profil.....................................................................................................52
3.3.3 Adugarea evenimentelor.....................................................................................58
3.3.4 Editarea evenimentelor.........................................................................................60
3.3.4 Editarea profilului.................................................................................................62
3.3.5 Notificarea prin e-mail.........................................................................................66
3.3.6 Notificarea prin pop-up........................................................................................68
4. BIBLIOGRAFIE....................................................................................................................71

NOIUNI INTRODUCTIVE
World Wide Web funcioneaz pe baza principiului de lucru n reeaua client/server.
Atunci cand se scrie n browser o adres URL i se apasa Enter, de fapt se face o cerere HTTP
ctre un calculator ce are adresa respectiv. Astfel, calculatorul respectiv randeaz pagina cerut.
n cazul internetului, aceste calculatoare se pot gsi n orice loc din lume.
Un server web este un program ce decodific cererile HTTP i randeaz pagina web
cutat ntr-o form compatibil cu browser-ul. Acest termen este utilizat att pentru calculatorul
pe care ruleaz pagina respectiv, ct i pentru definirea definirea unui program de server web.

1.1 Aplicaii web


O aplicaie web este o aplicaie ce ruleaz pe un server ce poate fi accesat de utilizatori
prin intermediul browserului. Pentru ca aceast aplicaie s fie util pentru un spectru ct mai larg
de utilizatori ar trebui sa fie transparent, uor se folosit i cu o interfaa simpl.
Avantajele unei aplicaii web sunt numeroase:

Sunt multi-platform ;
Nu au nevoie de upgrade deoarece toate funcionalitile noi ale aplicaiei sunt

implementate pe server i expuse automat utilizatorilor ;


n general sunt ieftine ;
Nu este nevoie de configurarea unor setri ale clientului ;

Dezavantaje:

In cele mai multe cazuri, aplicaia nu poate fi accesat offline;

n aplicaiile web regsim o combinaie de client-side: HTML, CSS, JavaScript i de


server-side: Asp, Ruby, Php etc. Pe partea de client se implementeaz interfaa, iar pe partea de
server putem face lucruri mai dificile, precum interogri ale bazei de date; astfel vom avea pagini
web dinamice (al cror coninut se poate schimba n funcie de informaia regasit n baza de
date).

Dezvoltarea pe partea de front-end (pe partea de client) const n crearea de pagini statice
(pagini care arat la fel indiferent de informaia din baza de date). Acestea se creeaz n HTML,
CSS, Javascript i eventual, jQuery (o librrie a Javascript-ului).
O problem a dezvoltrii pe partea de client o constituie incompatibilitatea cu unele
browsere sau sisteme de operare.
HTML (HyperText Markup Language) reprezint un limbaj de marcare, cu ajutorul cruia
putem structura pagina noastr astfel nct browserul s tie cum afieze informaiile. Cu ajutorul
CSS (Cascading Style Sheets) - ului vom putea personaliza anumite elemente HTML din pagin.
JavaScript este un limbaj de scriptare ce ofer posibilitatea de a crea pagini web
interactive (cu diverse animaii), de a controla anumite caracteristici ale browserului, deschiderea
de noi ferestre si pop-up-uri etc. Codul scris in JavaScript se poate ngloba n pagina HTML, ntre
tagurile <script> i </script>. Pentru ca mai multe pagini web s dispun de o funcie JavaScript
din alt pagin (fr a fi rescris), funcia respectiv poate fi memorat ntr-un fiier separat de pe
server, iar pe fiecare pagin ce folosete funcia respectiv vom avea <script
language=text/javaScript src=functie.js> </script>.
jQuery este o librrie a JavaScript-ului folosit pentru animaii i efecte. Integrnd i
jQuery n aplicaia noastr, vom avea un design mai atractiv.
XML (Extensible Markup Language) este un limbaj de marcare ce asigur trasmiterea i
memorarea datelor ntr-un mod structurat. Se aseaman foarte bine cu HTML-ul (este mai
puternic i mai flexibil), doar c etichetele pot fi definite in funcie de dorinele utilizatorului
(numele etichetelor vor descrie datele ce le conin).
Standardele web ce urmeaz sunt considerate fundamentale:

Pentru HTML, XHTML, CSS se ine seama de recomandrile fcute de W3C.

Pentru Javascript se ine cont de standardele dezvoltate de Ecma International.

Pentru Document Object Model (DOM se ine seama de recomandrile fcute de W3C.

1.1.1 Servicii Web


Un serviciu Web reprezint o aplicaie software care poate fi accesat la distan folosind
limbaje bazate pe XML (acesta constituie fundamentul serviciilor web). Un serviciu Web este
identificat de un URL, asemntor cu site - urile web. Diferena fa de site-urile web const n
tipul de interaciune.
Bazate pe un limbaj comun i un protocol comun de transport, serviciile web acioneaz
ca un mediator ntre dou entiti ce doresc s comunice ntre ele.
4

Serviciile web au mai multe roluri, precum: folosirea unui registru UDDI, unui ablou
WSDL, unei interfae SOAP ce permite interaciunea ntre aplicaii i a unei reele(Internet)
pentru transportul datelor.
Soap este un protocol de mesagerie bazat pe XML. De fapt, o cerere Soap conine mai
multe elemente ce curpind informaii despre apelare i rspunsuri neateptate, dar i elemente ce
transport diverse date. Un mesaj Soap poate fi transmis cu ajutorul metodelor HTTP Get sau
Post.
Fiind bazat pe mesaje, SOAP poate fi uor implementat peste protocoale de reea
asincrone, precum SMTP.
Avantaje:

Utilizarea concomitent a SOAP ului cu HTTP asigur o comunicare mai bun n


spatele unui proxy / firewall fa de tehnologia anterioar ce folosea apelul la distan.

Acest protocol permite folosirea protocoalelor de transport diferite. Stiva standard C


folosete protocolul HTPP, dar se pot fot folosi i alte protocoale, precum TCP.

Dezavantaje:

SOAP - ul limiteaz cantitatea de date trimise i din cauza formatului XML, poate fi

destul de lent (cnd se trimit mesaje scurte nu mai avem aceast problem).
n anumite cazuri, dezvolttorii trebuie s utilizeze polling n schimbul unei notificri.

C# folosete XML si Soap(XML ajut la codul documentaiei i paseaz datele


internetului, iar Soap ajut la implementarea de servicii web). XML - ul si Soap - ul se
completeaz perfect, combinnd ntr-o aplicaie diverse servicii web.
Wsdl (Web Service Description Language) - este un limbj bazat pe XML ce ofer o
descriere a serviciilor web.
WSDL este foarte des folosit in combinaie cu SOAP i XML Schema. Un program client
ce se conecteaz la un serviciu web poate citi WSDL - ul pentru a afla ce funcii sunt disponibile
pe server. Clientul va putea apoi folosi SOAP pnetru apelarea unei funcii definite n WSDL.
SMTP - Simple Mail Transfer Protocol este protocolul utilizat la trimiterea de mail-uri.

1.1.2 Despre browser


Un browser web este folosit pentru afiarea paginilor web. Browserele folosesc o
memorie cache pentru a reine local coninutul paginilor web. Cnd se cere o pagin web,
browserul ncearc s ncarce o pagin din memoria cache n loc s fac o cerere HTTP ( doar
cererile GET sunt afectate, cererile POST nu sunt salvate n memoria cache). Acest lucru pare
5

foarte convenabil deoarece timpul de ncrcare a paginilor s-ar reduce semnificativ, ns se pot
crea dificulti atunci cnd scriem o aplicaie n Ajax, deoarece acesta comunic foarte mult cu
serverul i nu are nevoie de rencrcarea din memoria cache.

1.1.3 HTTP (Hypertext Transfer Protocol)


HTTP (Hypertext Transfer Protocol) reprezint protocolul principal din World Wide Web
i constituie un ansamblu de reguli referitoare la modul de transmitere a datelor. Acesta poate fi
comparat cu o discuie bazat pe ntrebri i rspunsuri HTTP.
Metodele de cerere HTTP includ get, post, put, delete si head. Folosind Get, informaia
transmis de utilizator este ncrcat n url, pe cnd la Post ea se transmite prin conexiunea
curent HTTP. n general, Post- ul se folosete la upload, la formularele de login, iar Get-ul
atunci cand trebuie s extragem anumite date.
Dup deschiderea unei conexiuni ctre un anumit server, se trimite o cerere HTTP avnd
urmtoarea structur:
Prima linie i una sau mai multe linii de antet ;
O linie goal i eventual, un corp de mesaj.
Prima linie va conine numele metodei, calea ctre pagina cerut i versiunea HTTP utilizat.
De exemplu, dac avem: POST /pag.HTML HTTP/1.0 nseamn c s-a fcut o cerere HTTP de
tip POST ctre pagina test.HTML i c aceast cerere este trimis utiliznd HTTP versiunea 1.0.
Liniile de antet sunt utilizate la trimiterea detaliilor despe cerere sau despre datele ce sunt
trimise n corpul mesajului. Pe fiecare linie avem o pereche de tip parametru - valoare. De
exemplu:
User-agent: Mozilla/5.0 (Windows NT 6.1; rv:19.0)
Rspunsul HTTP conine o prim linie denumit i linie de stare, n care se ntoarce un
cod de stare al rspunsului (un numr din 3 cifre) i un scurt mesaj denumit fraz motiv. De
exemplu:
HTTP/1.0 200 Ok
De obicei, prima cifr a codului de stare furnizeaz detalii despre natura mesajului:
200 (Succes)
201 (Creat)
202 (Acceptat)
203 (Informaii
neoriginale)
204 (Niciun
coninut)

Serverul a procesat cu succes solicitarea. n general, aceasta nseamn c


serverul a furnizat pagina solicitat.
Solicitarea a fost efectuat cu succes, iar serverul a creat o nou resurs.
Serverul a acceptat solicitarea, dar nu a ncrcat-o nc.
Serverul a procesat cu succes solicitarea, ns ntoarce informaii care pot s
fie din alt surs.
Serverul a procesat cu succes solicitarea, ns nu ntoarce nici un coninut.

205 (Resetare
coninut)
206 (Coninut
parial)

Serverul a procesat cu succes solicitarea, ns nu returneaz nici un coninut.


Spre deosebire de rspunsul 204, acest rspuns necesit ca solicitantul s
reseteze vizualizarea documentului.
Serverul a procesat cu succes o solicitare GET incomplet.

1.2 Despre Ajax


Ajax (JavaScript i XML asincron) este o grupare de tehnici de dezvoltare web folosite
pentru a crea aplicaii web interactive.
Ajax creeaz un strat suplimentar de prelucrare ntre pagin i server. Acest strat, adic
motorul Ajax gestioneaz comunicarea cu serverul (asincron, adic rspunsurile i cererile
serverului nu trebuie s coincid cu anumite aciuni ale utilizatorului, ci pot avea loc oricnd, iar
browserul permite utilizatorului s recurg la orice aciuni n pagina curent).
Cnd se execut click pe un link sau se trimite un formular, se execut o cere HTTP ctre
server, timp n care browserul este ngheat , iar utilizatorul trebuie s atepte procesarea noii
pagini. Pentru ca aplicaia s funcioneze asincron, adic a putea trimite cereri ctre server fr o
cerere asociat de afiare a unei pagini noi se folosete obiectul XMLHTTPRequest. Acest obiect
JavaScript poate s realizeze o conexiune cu serverul i s genereze o cerere HTTP fr a mai fi
nevoie de o ncrcare a paginii.
Din perspectiva scriptului pe partea de server, comunicarea cu obiectul
XMLHTTPRequest eset doar o alt cerere HTTP. Pentru aplicaiile Ajax nu prea conteaz
limbajul de pe partea de server; dac motorul Ajax pe parte de client primete un rspuns HTTP
corect i la timp, n orice limbaj va funciona la fel de bine. Dup ce cererea asincron se
realizeaz cu succes se poate utiliza informaia returnat de server (Ajax permite returnarea
acestor date n mai multe formate).
Acest obiect este acceptat de aproape toate browserele moderne (Mozilla, Opera, Safari,
Konquerror), inclusiv de Microsoft Internet Explorer 5+ i de diverse platforme (Unix/ Linux).
Scopul acestuia este de a permite ca Javascript - ului s poat formula cereri HTTP pe care s le
transmit serverului. Astfel, se poate ca pagina s efectueze apelri n mod asincron, ceea ce
permite utilizarea paginii fr o remprosptare a browserului.

Pentru a folosi obiectul XMLHTTPRequest, trebuie s l instaniem (adic s apelm


contructorul obiectului). n cazul acestui obiect va trebui schimbat contructorul pentru a ndeplini
cerine speciale n funcie de browser. Utilizatorii pot folosi orice tip de browser, deci codul ce
trebuie scris trebuie s i adapteze comportamentul din mers pentru a asigura crearea cu success
a obiectului. n Internet Explorer, acest obiect se declar astfel:
Var request = new ActiveXObject(Microsoft.XMLHTTP);

1.2.1 Proprietile i metodele obiectului XMLHTTPRequest


Proprieti:

onreadystatechange: ofer o modalitate de tratare a evenimentului readyState la fiecare


schimbare a strii acestuia.

readyState: are doar drept de citire i reprezint un intreg care indica starea obiectului

XMLHTTPRequest. Valorile sale pot fi 0, 1, 2, 3 sau 4.


responseText: reine sub forma unui ir datele ntoarse de server. Daca readyState are o

valoare diferit de 3 (Receiving) sau 4 (Loaded), valoarea sa va fi un ir vid.


Status: Cod de stare HTTP returnat de server.
StatusText: Fraz motiv HTTP returnat de server.

Metode:

Abort(): oprete cererea curent. Cnd este invocat, metoda trebuie s anuleze orice
activitate de transmitere de date pentru care este responsabil obiectul i sa il reseteze. Metoda
nu primete parametrii, nu ntoarce nicio valoare si nu genereaz excepii.

GetAllResponseHeaders(): ntoarce sub forma unui ir de caractere setul complet de anteturi


HTTP (nume si valori) ale unei resurse. Daca proprietatea readyState are o alt valoare dect

3 (Receiving) sau 4 (Loaded), metoda ntoarce null.


GetResponseHeader(antet): ntoarce sub forma unui ir de caractere valoarea antetului inclus
n anteturile HTTP ale rspunsului serverului. Daca nu exist niciun antet avnd numele
specificat, metoda ntoarce un ir vid. n cazul in care proprietatea readyState are o valoare

diferit de 3 sau 4.
Open(method, URL,a): furnizeaz metoda HTTP (dac se folosete GET, atunci adresa
url trebuie s fie denumit corespunztor), adresa url cerut i dac cererea a fost gestionat
asincron(dac da, a-ul va fi true, altfel va fi false).

Send(content): trimite cererea la server. Dac proprietatea readyState are o valoare diferit de
1(Open), va fi generat o excepie INVALID_STATE_ERR. Altfel, proprietatea respectiv

trebuie s fie setat la valoarea 2(Sent), cererea fiind trimis.


SetRequestHeader(x,y): fixeaz o pereche parametru - valoare i o atribuie antetului ce
urmeaz a fi trimis cu cererea.

1.3 Ajax n ASP .NET


Pentru a utiliza Ajax n ASP .NET nu trebuie s scriem cod n JavaScript deoarece
ASP.NET AJAX ofer un set de componente i controale de pe partea de server ce se folosesc
pentru interfaa web. Aceste componente includ i JavaScriptul de care avem nevoie pentru
efectul dorit. Vom putea lucra cu Ajax n pagina noastr n timp ce vom folosi un metod
familiar i productiv de a lucra cu obiectele de pe partea de sever. Nu vom avea acelai control
de a personaliza fiecare detaliu, dar vom putea obine funcionaliti importante cu un efort
minim.

1.3.1 ScriptManager
<asp:ScriptManager ID="ScriptManager1"
runat="server"></asp:ScriptManager>
La nivel de design, ScriptManager -ul reprezint un element gol deoarece acesta nu
genereaz nici un tag HTML. n schimb, acesta are un rol important i anume de a aduga linkuri
ctre librriile de JavaScript ASP.NET AJAX.
Fiecare pagin ce utilizeaz funcionaliti ASP.NET AJAX cere o instan a
ScriptManager - ului. Se poate utiliza doar un singur ScriptManager pe o pagin. Controalele
activate ASP.NET AJAX pot interaciona cu ScriptManager - ul, cerndu-i afiarea linkurilor
ctre resursele de JavaScript.
Dup acest control trebuie s folosim un alt control foarte important (UpdatePanel).
Acesta permite nglobarea elementelor ce vor fi parial updatate i poate cuprinde tagurile
ContentTemplate sau Triggers. ContentTemplate este obligatoriu cci nglobeaz coninutul
panoului, care poate reprezenta orice element din pagin, de la casete text pan la controale web.
Tagul Triggers ne permite de a defini triggeri ce vor manipula coninutul panoului. n afar de
aceste controale, restul sunt controale standard. Proprietatea view state indic statusul paginii
atunci cnd s-a fcut o cerere HTTP.
9

Proprieti:
AsyncPostBackErrorMessage - seteaz sau extrage mesajul de eroare ce este trimis
userului atunci cnd o excepie este declanat n timpul post-back-ului asincron.
IsInAsyncPostBack - extrage valoarea ce indic dac postback-ul curent este executat n
timpul unei randri pariale.
Context - extrage obiectul HTTPContext asociat cu controlul serverului pentru cererea
curent.
EnablePartialRendering - seteaz sau extrage o valoare care permite randarea parial a
paginii, care n schimb permite updatarea anumitor elemente din pagin, ce sunt incluse n
controalele din UpdatePanel.

1.3.2 Update Panel


HasChildViewState - extrage o valoare ce indic dac copiii controlului current al
serverului au vreun view state salvat.
IsViewStateEnabled - extrage o valoare ce indic dac view state - ul este activat pentru
controlul respectiv.
ValidateRequestMode - extrage sau seteaz o valoare ce indic dac controlul respectiv
verific valoarea introdus de utilizator.
IsInPartialRendering - extrage sau seteaz o valoare ce indic dac controalele din
UpdatePanel sunt updatate ca rezultat al postback-ului asincron.
Attributes - extrage stilurile CSS ale controalelor din UpdatePanel.
Update Panel-ul poate monitoriza anumite elemente pe care acesta nu le conine. Pentru
aceasta, ntre tagurile <Triggers> </Triggers> definim triggeri pentru fiecare element(buton).

1.3.3 Update Progress


n timp ce se ateapt dup rspunsul la cererea asincron ce am realizat-o cu ajutorul
Ajax-ului, putem seta apariia n pagin a unor anumite elemente pentru a anuna utilizatorul de
faptul c pagina se ncarc i trebuie sa mai atepte puin. Putem afia un mesaj, dar mai indicat
ar fi s folosim o imagine cu extensia .gif . aceasta fiind mai sugestiv dect un mesaj (arat ca un
progress bar.). Acesta se introduce ntre tagurile <UpdateProgress> i </ UpdateProgress>. Ce
este ntre aceste taguri se va afia atunci cnd cererea asincron dureaz ceva timp. Pentru a ne

10

asigura c dureaz suficient pentru a vedea UpdateProgress-ul, putem ca pe partea de server s


ntrziem procesarea astfel:
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(10));

INTRODUCERE N ASP .NET I C#


2.1 Generaliti despre C#

11

C# este un limbaj de programare ce a fost dezvoltat pentru utilizarea cu Microsoft .NET.


Strategia .NET constituie crearea unui alt model de programare cu scopul de a fi mai eficieni i
mai productivi. n C# sintaxa este foarte asemntoare cu cea din C++ sau Java, dar conine i
unele simplificri pentru a face limbajul mai consistent i mai concis. Astfel, programatorii pot
nva mai uor C# i l pot translata cu uurin n cod Java sau C++. Mai mult, codul C# poate fi
nglobat n pachete pentru a lucra cu cod existent scris n C++. C# este un limbaj modern de
programare, cu multe funcionaliti sigure; este orientat pe obiecte i aduce aceleai beneficii ca
i Java, C++. Acest limbaj nu permite efectuarea de operaii riscante, precum utilizarea
pointerilor / alocarea memoriei i astfel, uureaz munca programatorului. C# permite
utilizatorilor de a crea servicii Web pentru a transfera date i a crea aplicaii web.
Visual Studio .NET reprezint mediul de dezvoltare pentru C# i permite programarea
vizual. n loc de a implementa diverse funcionaliti, programatorul poate ngloba
componentele necesare ntr-un program prin drag and drop. Acest tip de programare vizual
propulsat de Virtual Basic a dus la ctiguri mari.
Iniial, Miscrosoft a dezvoltat ASP i apoi ASP .NET , ambele permind crearea de pagini
dinamice fr grija nivelului sczut de implementare al detaliilor. Din acest motiv, ambele
platforme au avut succes. Originalul ASP devenise mult mai celebru dect anticipase Microsoftul, fiind folosit de aproape 1 milion de dezvoltatori. ns, cu timpul, s-au ivit probleme de
configurare i astfel, a aprut ASP .NET care prea a completa perfect ASP-ul. n comparaie cu
clasicul ASP, ASP .NET este mai performant i are instrumente pentru design mult mai bune.
Aceste dou limbaje sunt destul de diferite, ASP - ul fiind un limbaj de programare mai mult
bazat pe scripting, pe cnd ASP .NET fiind orientat pe obiecte i permind construirea unei
aplicaii la fel de uor ca i construirea unei aplicaii Windows.

2.1.1 Manipularea obiectelor


n .NET variabilele obinuite sunt obiecte cu drepturi depline. Asta nseamn c tipurile
de date obinuite sunt contruite astfel nct s poat trata anumite operaii (de exemplu, numratul
caracterelor dintr-un string). Mai mult, se pot manipula stringuri, date, numere n acelai mod n
C#. De exemplu, fiecare tip include o metod ToString(). Implementarea implicit a acesteia
returneaz numele clasei. n variabilele simple este returnat un rezultat mai folositor:
reprezentarea variabilei date ntr-un string. Pentru a converti un ntreg avem:
string myString;
int myInteger = 100;
12

myString = myInteger.ToString();//deci vom avea stringul 100


Metode pentru tipul string:
-

Length - returneaz numrul de caractere dintr-un string (ca ntreg).

ToUpper() i ToLower() - returneaz o copie a stringului cu toate caracterele schimbate n

majuscule sau n litere mici.


Trim(), TrimEnd() i TrimStart() - nltur spaiile sau alte caractere de la sfaritul /

nceputul stringului.
PadLeft() i PadRight() - adaug la string caracterul specificat de attea ori ct este

necesar pentru ca lungimea stringului s fie egal cu numrul specificat.


Insert() - pune un alt string la un index specificat.
Remove() - nltur un numr specificat de caractere de la o poziie dat.
Replace() - nlocuiete un substring specificat cu un alt string.
Replace("a", "b") - schimb toate caracterele a n b.
Substring() - extrage o parte din string cu o lungime dat.
StartsWith() i EndsWith() - determin dac un string ncepe sau se termin cu un anumit

substring.
IndexOf() i LastIndexOf() - gsete prima poziie a unui substring dintr-un string.
Acestea returneaz doar prima potrivire i pot cuta ncepnd de la nceput sau sfritul
stringului. De asemenea, se pot folosi i versiuni suprascrise ale acestor metode ce accept

un parametru care specific poziia de start a cutrii.


Split() - mparte stringul ntr-un ir de substringuri delimitate printr-un substring specific .
Join() - Contopete un ir de stringuri ntr-un string nou . Trebuie specificat un separator
ce va fi nserat ntre fiecare element (sau putem folosi i stringul vid).

2.1.2 Interfee
O clas abstract este o clas ce nu poate fi instaniat. Aceasta se utilizeaz pentru
motenire. O clas abstract poate conine codul complet sau parial, care poate fi rescris.
O clas ce nu este abstract i deriveaz dintr-o clas abstract trebuie s conin
implementrile membrilor abstraci.
Interfaa este o clas abstract ce conine numai signaturile funciilor. Poate conine
metode, evenimente, indeci (nu conine cmpuri, constructori, destructori, operatori, membri de
tip static sau tipuri imbricate). Membrii interfeei sunt implicit public abstract(virtuali). Clasele i
struct -urile pot implementa mai multe interfee, iar interfeele pot extinde alte interfee.
13

O clas poate moteni o singur clas de baz, dar poate implementa mai multe interfee.
Fiecare membru al interfeei trebuie implementat sau motenit de la o clas de baz.
Implementarea metodelor nu trebuie declarat ca override, ci folosind virtual sau abstract(o
interfa poate fi implementat de o clas abstract).
Din punct de vedere al vitezei de execuie, o interfa este mai lent dect o clas
abstract.

2.1.3 Delegai
Un delegat este un tip ce refereniaz o metod. Odat ce delegatul este ataat metodei
respective, acesta se va comporta exact ca metoda corespunztoare. Variabila poate fi folosit
oricnd pentru a invoca metoda respectiv.
Signatura unui delegat conine cuvntul cheie de accesibilitate, tipul de date returnat,
parametrii i tipul acestora.
Un delegat se poate declara ca o metod i se utilizeaz exact ca o metod obinuit, cu
parametri i valoare returnat. Orice metod ce cuprinde acelai tip returnat i aceeai parametri
ca a unui delegat poate fi asignat acestuia. De exemplu, dac avem o metod ce accept ca
parametru un string i o alta care accept doi parametri, tot de tip string, vom avea nevoie de doi
delegai pentru fiecare metod n parte. Numele delegatului i a parametrilor nu conteaz,
important este ca tipul de date returnat i cel al parametrilor s coincid cu cel al delegatului
pentru a putea referenia respectiva metod. Delegaii sunt asemntori pointerilor la funcii din
C#, doar c au anumite restricii.
Declararea unui tip delegat:
delegate void Del (string sender);
Declararea unei variabile de tip delegat:
Del delegat;
Asignarea unei metode la o variabil de tip delegat:
void MyName(string name)
{
Console.WriteLine("My name is " + name);
}
delegat = new Del(MyName);
Apelarea unui delegat:
delegat(del);

14

Crearea unei variabile de tip delegat:


del = new DelegateType(object.Method)
Un delegat memoreaz o metod i destinatarul acesteia, dar fr parametri. Obiectul
poate fi this(deci poate fi omis), iar metoda poate fi i static(i atunci se va accesa cu numele
clasei urmat de numele metodei deci nu se va instania cu un anumit obiect). Prototipul funciei
trebuie s coincid cu signatura DelegateType-ului, adic s aib acelai numr de parametri i de
acelai tip (i cel returnat).
Un delegat poate indica ctre mai multe metode n acelai timp. Atunci cnd vom apela
delegatul, se vor apela ambele funcii pe care le indic:
Del del1;
del1 = firstFunction;
del1 += secondFunction;
Delegaii ce trateaz evenimente au urmtoarea signatur:
delegate void MyEvent(object source, MyEventArgs e);
Tipul rezultat este void (primul parametru este de tip object i este constituit de expeditorul
evenimentului, iar al doilea este de tip event- subclas la System.EventArgs).

2.1.4 Folosirea i importarea spaiilor de nume


Fiecare parte a codului din .NET provine dintr-un anumit tip(de obicei dintr-o clas) iar
fiecare tip de date exist ntr-un namespace. Acesta grupeaz toate tipurile de date ntr-o librrie
de clase. Far namespace-uri aceste tipuri ar fi organizate ntr-o list lung i dezordonat. Acest
tip de ordonare este practic dac avem o cantitate mic de informaii, dar n .NET avem foarte
multe structuri de date. Atunci cnd vom scrie cod n ASP .NET putem folosi acele namespaceuri create automat de Visual Studio. Dac vrem s ne organizm codul n namespace-uri multiple,
le putem defini printr-o structur de bloc:
namespace MyFirstNamespace
{
namespace MySecondNamespace
{
public class MyClass
{
// type code here;
}
}
}

15

n acest exemplu, clasa MyClass se afl n namespace-ul MyFirstNamespace


.MySecondNamespace. Codul din acest namespace poate accesa aceast clas cu numele ei.
Codul din afara acestui namespace poate accesa aceast clas folosind numele
MyFirstNamespace.MySecondNamespace.MyClass.
Spaiile de nume nu dein un cuvnt cheie ce ar defini accesibilitatea i pot fi grupate n
oricte nivele avem nevoie. Uneori, gruparea poate fi realizat i fr a exista o anumit relaie
ntre namespace-urile respective(ca i n cazul nostru, ntre MySecondNamespace i
MyFirstNamespace nu exist neaparat o legtur). Namespace-ul MyFirstNamespace.
MySecondNamespace poate fi creat i scriindu-l direct cu acest nume, iar coninutul acestuia
fiind reprezentat doar de clasa MyClass.
Atunci cnd dorim s folosim n codul nostru un anumit spaiu de nume, acesta trebuie
importat. Pentru a importa un namespace folosim cuvntul cheie using. Aceste importuri se vor
scrie pe primele linii din fiierul respectiv. Importarea reprezint mai mult o convenie i nu
influeneaz performana aplicaiei. De fapt, chiar dac se folosesc importuri, codul compilat va fi
acelai deoarece atunci cnd se genereaz un EXE sau un DLL compilatorul translateaz
referinele claselor n clase.
Chiar dac nu importm nici un spaiu de nume, putem comprima orice declaraie de
obiect pentru a-l instania, folosind cuvntul cheie var.
De exemplu, n loc de:
MyFirstNamespace.MySecondNamespace.MyClass name = new
MyFirstNamespace.MySecondNamespace.MyClass();
Avem:
var name = new MyFirstNamespace.MySecondNamespace.MyClass();
Acest lucru este posibil deoarece compilatorul poate determina tipul de date corect pentru
variabila name, bazndu-se pe tipul de obiect creat cu ajutorul lui new. Aceat abordare este la
fel de palpabil ca i cea fr var deoarece este clar ce tip de obiect vrem sa creem. Totui,
aceast tehnic va eua n cazul n care compilatorul nu va putea determina tipul obiectului pe
care l creem. Dincolo de asta, var este folosit limitat pentru variabilele locale i nu poate fi
utilizat la declararea unei variabile membru a unei clase.

2.1.5 Membrii statici

16

Membrii statici ai unei clase sunt adesea folosii pentru a furniza anumite funcionaliti
ale unui obiect. Pentru a crea o proprietate sau o metod static trebuie folosit cuvntul cheie
static imediat dup cuvntul ce definete accesibilitatea cmpului respectiv. Proprietatea
respectiv va avea aceai valoare n toate obiectele definite, deci o putem accesa prin numele su,
fr a instania vreun obiect. Pentru a accesa cmpuri non-statice din clas avem nevoie de
instanierea unui obiect.
De exemplu, dac vrem ca la fiecare PostBack s se afieze numrul de PostBack-uri
realizate pn n acel moment, definim n clasa noastr o variabil static global:
public static int nr;
Pe partea de client avem un Label cu id-ul Label1 n care vom afia numrul de PostBackuri realizate pn n acel moment. Deci, n funcia de Page_Load avem:
protected void Page_Load(object sender, EventArgs e)
{
nr++;
Label1.Text = nr.ToString();
}
Deci, de fiecare dat cnd se va face un PostBack, valoarea din Label1 se va incrementa.
Exist clase care conin numai elemente de tipul static. Atunci, putem defini i clase cu
ajutorul cuvntului cheie static, iar elementele sale componente vor avea i ele cuvntul
static la declarare. Aceste clase nu vor putea fi instaniate.

2.1.6 Suprancrcarea metodelor


Metodele constituie cel mai de baz mod de organizare a codului. Mai exact, o metod
este o grupare de linii de cod. Ideal ar fi ca fiecare metod s aibe o anumit sarcin. Grupnd
codul n mai multe astfel de sarcini, viaa programatorului se va simplifica semnificativ i va
ajuta la organizarea codului n clase i la structurarea codului conform conceptelor OOP.
Signatura metodei conine cuvntul cheie de accesibilitate, numele ei, tipul de date returnat i
parametrii(dac exist). Dac aceasta nu retuneaz nimic, se utilizeaz cuvntul cheie void.
Suprancrcarea metodelor permite crearea mai multor metode cu acelai nume, dar cu alt
set de parametri. Atunci cnd se apeleaz metoda, CLR alege automat versiunea corect a
metodei, examinnd parametrii dai. Nu se pot suprancrca metode cu aceeai signatur deoarece
asta nseamn c avem acelai numr si tip de parametri iar CLR nu le va putea distinge. Atunci

17

cnd se apeleaz o metod suprancrcat, se va apela versiunea ce se potrivete cu tipul de date


folosit n apel. Dac nu se gsete acea versiune, va aprea o eroare.
Pentru a realiza suprancrcarea mai flexibil, putem folosi parametri opionali. Acetia se
plaseaz la sfritul listei de parametri i iau o valoare implicit dat de noi. De exemplu, dac
avem:
private string GetName(int ID, bool hasName = false)
{
// Type here
}
Vom putea apela funcia GetName, att cu un singur parametru, ct i cu doi:
GetName(3,true);
GetName(5); //al doilea parametru va fi implicit false
Dac avem metode cu mai muli parametri opionali, atunci cnd vrem s le setm alt
valoare la apel, le vom scrie numele urmat de : i valoarea pe care vrem s o atribuim. Dei se
pot realiza cam aceleai lucruri cu ajutorul parametrilor opionali i suprancrcarea metodelor,
clasele prefer metoda suprancrcrii metodelor. Un motiv ar fi faptul c n .NET clasele au fost
create n versiunile anterioare ale C#, cnd acesta nu permitea parametrii opionali. Un alt motiv
l constituie faptul ca nu toate limbajele .NET nu permit parametrii opionali (dei VB i C#
permit).
n multe situaii, utilizarea suprancrcarea metodelor este mult mai natural, spre
deosebire de folosirea parametrilor opionali.

2.2 Elemente de baz n ASP .NET


2.2.1 Tipuri de date in .NET
C# Nume

.NET nume

Conine

byte

Byte

Un ntreg de la 0 la 255.

short

Int16

Un ntreg de la 32,768 la 32,767.

int

Int32

Un ntreg de la 2,147,483,648 la 2,147,483,647.

long

Int64

Un ntreg de la 9.2e18 la 9.2e18.


18

float

Single

Un numr n virgul mobil cu o singur zecimal de la


aproximativ -3.4e38 la 3.4e38 (pentru numere mari)
sau -1.5e-45 la 1.5e-45 (pentru numere fracionare mici).

double

Double

Un numr n virgul mobil cu dou zecimale de la


aproximativ 1.8e308 la 1.8e308 (pentru numere mari)
sau 5.0e-324 la 5.0e-324 (pentru numere fracionare mici).

char

Char

Un singur caracter Unicode.

String

String

O variabil format din mai multe caractere Unicode.

Bool

Boolean

O valoare true sau false .

DateTime

Reprezint orice dat i timp de la 12:00:00 AM, 1 Ianuarie al


anului 1 n calendarul Gregorian la 11:59:59 PM,
31 Decemberie 9999. Intern, tipul de dat se
stocheaz ca un ntreg pe 64 de bii .

object

Object

Ultima clas de baz al tuturor tipurilor .NET .Poate c


conine orice tip de dat sau obiect.

Pentru a introduce cod C# n ASP .NET, l vom introduce ntre <%# i %>. De exemplu:
public partial class SetURL : System.Web.UI.Page
{
protected string URL;
protected void Page_Load(Object sender, EventArgs e)
{
URL = "imagini/poza.png";
this.DataBind();
}
}
Astfel, vom avea o variabil URL ce poate fi accesat i folosit de elemente de pe partea de
client. URL poate fi un url-ul unui link, al unei imagini sau text al unei etichete:
<asp:Image id="ThisIsmyImage" ImageUrl="<%# URL %>"
runat="server" />
<asp:Hyperlink id="ThisIsMyHiperLink" Text="Path to an image"
NavigateUrl="<%# URL %>"
runat="server" />
<asp:Label id="MyLabel" runat="server"><%# URL %></asp:Label>

2.2.2 Structura unei pagini n ASP. NET

19

n ASP .NET, o pagin este format din trei seciuni. Prima seciune este constituit de
directiv:
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>
Aceasta ofer informaii despre compilarea paginii, despre limbajul folosit i modul de
tratare a event-urilor. Poate indica de asemenea unde este localizat fiierul i numele obinuit al
paginii. Directiva paginii nu trebuie neaparat modificat de utilizator, deoarece Visual Studio face
asta automat.
A doua seciune este constituit de doctype. ntr-o pagin normal Asp .NET, doctype-ul se
afl pe prima rnd al paginii, dar ntr-un web form acesta ocup al doilea rnd, dup directiv.
Acesta este opional, dar Visual Studio l adaug automat. Doctype-ul reflect tipul de markup (de
exemplu HTML sau XHTML) ce se utilizeaz n pagin. Este destul de important deoarece
influeneaz modul de interpretare a browser-ului asupra paginii. Astfel, pot aprea probleme n
anumite browsere (n special n Internet Explorer).
Dup procesarea codului pe server, motorul Asp .NET creeaz un snapshot HTML ce l
trimite browserului.
A treia seciune este marcat de deschiderea tagului <HTML>. n interiorul acestui tag,
pagina noastr este mprit n 2 seciuni:

head (ce stocheaz informaii despre pagin - de exemplu titlul, cuvinte cheie etc ) - avem

atributul runat = server , ce ajut la manipularea codului.


body (conine pagina ce apare n browser).
ntr-un pagin web, n tagul body trebuie s avem un formular ce definete seciunea din

pagin ce poate transmite informaii la server.


Pentru a ncepe implementarea pe partea de server, trebuie s ajungem n vizualizarea
codului din spatele paginii cu extensia .aspx. Aici gsim o clas pentru pagina noastr web, care
conine anumite namespace-uri implicite.

2.2.3 Tipurile de fiiere ASP .NET


Fiierele ce au extensia .aspx reprezint pagini web ASP .NET ce conin interfaa
utilizatorului.
Fiierele ce au extensia .ascx reprezint controale ASP.NET ale userului. Acestea sunt
asemntoare cu paginile web, cu excepia faptului c utilizatorul nu poate accesa direct acele

20

fiiere. Controalele userului permit dezvoltarea unei mici pri ale interfeei userului i integrarea
acesteia n mai multe formulare fr a rescrie codul.

web.config - reprezint un XML de configurare pentru aplicaia noastr ce include setri

pentru securitate, organizarea memoriei etc.


global.asax - acesta constituie fiierul global al aplicaiei. Se folosete pentru definirea
variabilelor globale (ce pot fi accesate din orice pagin web din aplicaie) ce pot

reaciona la evenimente globale (precum la pornirea aplicaiei).


fiierele ce au extensia .cs conin cod C# i permit separarea interfeei de codul din spate.
Fiierul global.asax arat ca un fiier normal .aspx, doar c nu conine taguri HTML sau

ASP .NET, ci conine handleri de evenimente ce trateaz evenimente ale aplicaiei. Cnd
adugm acest fiier, Visual Studio insereaz mai multe handlere implicite, iar noi trebuie s le
adugm cod. Evenimentele ce pot aprea sunt:
Application_Start() apare atunci cnd pornete aplicaia, cnd este prima oar cns se primete
o cerere de la un utilizator. Nu se va declana dup mai multe cereri.Acest eveniment este creat
pentru a memora unele informaii iniiale ce pot fi folositoare pe viitor.
Application_End() apare atunci cnd aplicaia este prsit din cauza faptului c serverul este
restartat. n tratarea acestui eveniment se poate introduce cod pentru curare.
Application_BeginRequest() apare la fiecare cerere primit de aplicaie, exact nainte de
executarea codului.
Application_EndRequest() apare la fiecare cerere primit de aplicaie, exact dup executarea
codului.
Session_Start() apare dac a fost acceptat o cerere a unui utilizator nou i a nceput o nou
sesiune.
Session_End() apare dac o sesiune a expirat sau s-a terminat dintr-un alt motiv
Application_Error() apare n urma unei erori ce nu a fost luat n considerare.
n fiierul web.config avem trei seciuni principale cu care vom lucra: seciunea
<appSettings> ce permite de a aduga diverse informaii, seciunea <connectionStrings> ce
permite definirea informaiilor necesare pentru accesarea unei bazde de date i seciunea
<system.web> ce cuprinde fiecare setare ce trebuie configurat. n interiorul acestei seciuni,
fiecare element ce constituie un aspect al configurrii este un tag separat. De exemplu, putem
aduga tagul < authentication> pentru a configura setrile referitoare la autentificare. Cnd creem
un website, n seciunea <system.web> avem un singur element i anume <compilation>. Acesta
specific dou proprieti utiliznd dou atribute:

21

debug acest atribut spune ASP-ului dac s compileze aplicaia n modul de debug,
pentru a putea utiliza instrumentele oferite de Visual Studio pentru a face debug(atunci
cnd rulm aplicaia, Visual Studio ne ntreab dac vrem s comutm pe modul de debug

i ar trebui s selectm Yes);


targetFramework acest atribut spune ce versiune de .NET se folosete pe serverul
nostru web(ceea ce determin ce funcionaliti trebuie acesate n aplicaia noastr).
Acesta se seteaz la crearea website-ului i poate fi modificat oricnd.

2.2.4 Clasa Page


Fiecare pagin este o clas ce motenete System.Web.UI.Page. Prin aceast motenire,
pagina capt anumite proprieti i metode ce pot fi utilizate n codul nostru.
IsPostBack este o proprietate boolean ce indic dac este prima oar cnd pagina este
afiat (false) sau dac aceasta a fost retrimis n urma unui eveniment(true). Valoarea acestei
proprieti trebuie verificat n handlerul din Page Load pentru a ne asigura c iniializarea
paginii web se face o singur dat.
EnableViewState - cnd este setat ca fiind fals, aceasta suprascrie proprietatea
EnableViewState a controalelor, asigurndu-se c nici un control nu va pstra informaia despre
stare.
Application - aceast colecie cuprinde informaii care circul ntre toi userii ce folosesc
website-ul. De exemplu, se poate folosi colecia Application pentru a numra de cte ori o pagin
a fost vizitat.
Session - aceast colecie cuprinde informaii pentru un singur user, deci poate fi folosit
n pagini diferite. De exemplu, ntr-un site de e-commerce se poate folosi colecia Session pentru
a memora anumite articole din pagina ce conine coul de cumprturi al unui user.
Cache - aceast colecie permite memorarea obiectelor(ce necesit timp pentru a putea fi
create) pentru a putea fi reutilizate de ali useri. Dac implementarea este bun, aceast tehnic
poate mbunti performan paginilor web .
Request - se refer la un obiect de tip HTTPRequest ce conine informaii despre cererea
curent. Acest obiect se poate folosi pentru a obine informaii despre browserul userului curent.
Obiectul HTTPRequest se poate utiliza i pentru transmiterea de informaii ntre pagini.
Response - se refer la un obiect de tip HTTPRequest ce reprezint rspunsul ce va fi
trimis browser-ului. Acest obiect se poate folosi pentru a crea cookies, ceea ce va permite de a
redireciona userul ctre alte pagini.
22

Server - se refer la un obiect de tip HTTPServerUtility ce permite realizarea unor diverse


activiti. De exemplu, permite codificarea textului pentru securitatea paginii.
User - dac userul a fost autentificat, aceast proprietate va fi iniializat cu informaiile
userului.
Unele proprieti pot fi utilizate pentru trimiterea ctre o alt pagin sau pentru a codifica
texte ce pot conine caractere speciale i care trebuie s fie inserate ntr-o pagin HTML.

2.2.5 Trimiterea ctre o alt pagin


Exist mai multe moduri de a ajunge de la o pagin la alta. Cea mai simpl metod const
n folosirea unui element HTML <a>, ce reprezint un link:
<a href="home.aspx">Link</a> duce la home.aspx.
O alt metod este cea de redirectare folosind cod C#. Aceast abordare este foarte
folositoare dac naintea redirectrii trebuie fcute anumite aciuni n cod. Pentru a realiza
redirecionarea avem nevoie de un control ce determin retrimiterea paginii (adic ne trebuie o
tratare de eveniment care s reacioneze la un eveniment de ServerClick a unui control, precum
HTMLInputButton sau HTMLAnchor). Atunci cnd pagina este trimis i se execut tratarea de
eveniment, se poate folosi HTTPResponse.Redirect() pentru a redireciona userul. Se poate
accesa obiectul curent HTTPResponse prin proprietatea Page.Response. De exemplu:
Response.Redirect("profile_page.aspx")

Aceasta redirecioneaz userul ctre o pagin ce se afl n acelai folder n care se


lucreaz. Atunci cnd se folosete aceast metod, ASP .NET oprete procesarea paginii i
trimite browserului un mesaj de redirecionare. Orice cod scris dup Redirect() nu va fi executat.
Atunci cnd browserul primete informaia de redirecionare, se trimite o cerere pentru o nou
pagin. Metoda Redirect() se poate folosi pentru a redireciona ctre orice tip de pagin (se poate
trimite i ctre o pagin cu o cale absolut , ce ncepe cu HTTP://). ASP .NET ofer i o alt
opiune de a trimite userul pe o alt pagin. Se poate folosi metoda HTTPServerUtility.Transfer()
n locul celei de Redirect(). Un obiect de tipul HTTPServerUtility este accesibil prin proprietatea
Page.Server, deci redirecionarea va fi:
Server.Transfer("profile_page.aspx");
Aceast metod ofer avantajul de a nu implica i browserul. n loc de a trimite un mesaj
browserului, ASP .NET ncepe procesarea paginii ca i cum userul a fcut o cerere a paginii
respective. Aceast soluie salveaz mult din timp, dar n acelai timp introduce unele limitri.
23

Transfer() nu se poate folosi pentru a transfera userul ctre un alt website sau ctre o pagin care
nu este ASP .NET (de exemplu pagin HTML). Aceast metod permite redirecionarea de la o
pagin ASP .NET la alta, din aceeai aplicaie.
n concluzie, este mult mai indicat de a folosi HTTPResponse.Redirect() dect
HTTPServerUtility.Transfer().

2.2.6 Elemente HTML n ASP .NET i C#


n ASP .NET avem toate controalele HTML definite n namespace - ul
System.Web.UI.HTMLControls, iar fiecare control are o clas separat. Denumirea clasei este
asemntoare cu tag-ul corespunztor n HTML. De exemplu, tagul <form> din HTML
corespunde clasei HTMLForm. Exist dou metode de a aduga controale de server HTML: se
pot scrie ca i elemente HTML la care le adugm atributul runat=server sau pur i simplu
facem drag and drop din Toolbox.
n C# putem crea elemente HTML utiliznd metoda AppendChild. HTML Document
Object Model(DOM) permite modificarea coninutului unei pagini HTML n mai multe moduri,
iar AppendChild d posibilitatea de a aduga elemente paginii existente sau de a muta unele
elemente din pagin. De exemplu, avem un control n pagina noastr cu numele de myDiv:
if (myDiv.Document != null)
{
HTMLElement anotherDiv =
myDiv.Document.CreateElement("div");
anotherDiv.SetAttribute("border", 1px solid green);
myDiv.Document.Body.AppendChild(anotherDiv);
}
Pentru a aduga atribute putem folosi metoda setAtrribute:
public void SetAttribute
(
string attributeName,
string value
)
AttributeName este de tip System.String i reprezint numele atributului ce trebuie setat, iar value
este tot de tip System.String i reprezint noua valoare a atributului.
Se pot accesa membri neexpui din HTML DOM folosind interfeele Component Object
Model (COM) expuse de fiecare clas DOM. Acest lucru este recomandat atunci cnd se fac
multe apeluri ctre membri neexpui sau atunci cnd aceti membri ntorc alte interfee ce nu sunt
cuprinse de HTML DOM.

24

n pagina HTML se pot scrie diverse script-uri ce conin funcii. Acestea se scriu ntre
tagurile <script> i </script>. Accesarea funciilor din script-uri pot fi accesate la comand sau ca
i rspuns la un eveniment. Pentru a se apela aceste funcii localizate n script-uri se folosete
metoda InvokeScript. Dac funcia apelat returneaz un element HTML, acesta trebuie convertit
la HTMLElement.
De exemplu, n script avem:
<SCRIPT>
function thisIsMe(name,age)
{
alert("Name is " + name + "and age is " + age);
}
</SCRIPT>
n code-behind avem:
private void Test(String name, String age)
{
if (webBrowser1.Document != null)
{
Object[] objectsArray = new Object[2];
objectsArray[0] = (Object)name;
objectsArray[1] = (Object)age;
webBrowser1.Document.InvokeScript("thisIsMe",

objArray);

}
}
n pagina noastr avem un control WebBrowser cu numele WebBrowser1.
Pentru a regsi un anumite atribut, se folosete funcia:
public string GetAttribute
(
string attributeName
)
AttributeName reprezint numele atributului i este de tip String. Dac atributul respectiv
nu exist pentru elementul respectiv, se returneaz stringul vid.
Funciile GetAttribute i SetAttribute sunt case-insensitive.
Exemplu de extragere a meta-informaiilor:
private void ShowMeta()
{
if (webBrowser1.Document != null)
{
HTMLElementCollection metaElems =
webBrowser1.Document. GetElementsByTagName("META");
25

foreach (HTMLElement elem in metaElems)


{
String nameS = elem.GetAttribute("name");
if (nameS != null && nameS.Length != 0)
{
String contentS =
elem.GetAttribute("content");
MessageBox.Show("Document: " +
webBrowser1.Url.ToString() + " Description: " + contentS);
}
}
}
}

2.2.7 Codificarea HTML - ului


Dup cum se tie, exist anumite caractere ce au o semnificaie n HTML. De exemplu,
<<, sunt folosite pentru taguri. Prin urmare, pot aprea problem atunci cnd trebuie afiate n
pagin anumite caractere care au o anumit semnificaie in HTML.
Caractere special in HTML:
Codificare spaiu : &nbsp;
Codificare < : &lt;
Codificare > : &gt;
Codificare & : &amp;
Codificare : &quot;

2.3 Tipuri de controale web din ASP .NET


2.3.1 Repeater
Acest control este folosit pentru afiarea repetat a unei liste de elemente ce aparine
acestui control. Repeater-ul poate fi conectat la un tabel dintr-o baz de date, un XML sau la o
alt list de elemente.
Acesta reprezint singurul control ce permite mprirea tagurilor peste ablon. Pentru a
crea un tabel folosind un ablon, trebuie scris tagul <table> n HeaderTemplate, un <tr> n
ItemTemplate i nchiderea tagului </table> n FooterTemplate.
Repeater - ul cuprinde 5 tipuri de abloane:

HeaderTemplate: este folosit pentru elementele ce trebuie afiate o singur dat naintea
seciunii ItemTemplate.
26

FooterTemplate: este folosit pentru elementele ce trebuie afiate o singur dat dup

seciunea ItemTemplate.
ItemTemplate: este folosit pentru elementele ce trebuie afiate o singur dat pe un rnd.
AlternatingItemTemplate: este folosit pentru elementele ce trebuie afiate pe fiecare rnd
cu indice par (aceasta ne permite de a alterna culoarea de fundal). Este folosit doar pentru

numr par de nregistrri.


SeparatorTemplate: este folosit pentru delimitarea rndurilor (de exemplu, de a marca
sfritul de linie dup fiecare nregistrare).

2.3.2 DataList
Ca i Repeater-ul, DataList-ul este folosit pentru a afia o list de elemente care se repet.
DataList-ul furnizeaz grupri de date i un model flexibil (ca i ListView), dar nu ofer i
funcionaliti precum updatarea, tergerea, paginarea sau sortarea.
Proprietile precum RepeatDirection = "Horizontal" / "Vertical" ne ajut la afisarea
elementelor pe direcie orizontal / vertical, iar RepeatColumns = "5" ne arat numrul de
coloane.

2.3.3 DataGrid
DataGrid - ul este un control cu mai multe coloane. Aceste coloane pot fi folosite pentru a
afia sau edita datele. Putem include i comenzi de Edit, Update, Cancel, Select Buttons, Custom
Buttons i Template Columns. Acest control afieaz cmpurile unui DataSource ca i coloanele
unui tabel n care fiecare rnd reprezint o nregistrare din baza de date. DataGrid-ul permite
selectarea, editarea, paginarea i sortarea elementelor sale. Ca i Repeater-ul i DataList-ul, acesta
permite formatarea i editarea diverselor nregistrri dintr-un tabel. n plus, are funcionaliti
avansate, precum sortarea i paginarea nregistrrilor. Acestea pot fi afiate n DataGrid fr a
utiliza abloane. Un DataSource poate fi cu uurin legat de DataGrid i astfel, acesta va afia
automat nregistrrile din tabelul ce provine din baza de date definit n DataSource.

2.3.4 GridView
Controlul GridView este sucesorul DataGrid -ului. Acesta se folosete prin asocierea cu
un DataSource prin proprietatea DataSourceID. n ASP.NET 2.0 sunt mai multe controale
DataSource ce au fost creionate pentru a lucra cu diferite DataSource-uri. GridView -ul este
27

foarte flexibil, cuprinznd mai multe coloane pentru fiecare cmp din baza de date. Acest control
reprezint unul din cele mai puternice controale, cuprinznd multe funcionaliti ce uureaz
mult munca programatorului.
Acest control suport urmtoarele tipuri de cmpuri:

BoundField se folosete pentru afiarea anumitor valori din baza de date.


CheckBoxField conine ckeck-box-uri i este folosit automat pentru cmpurile boolene.
ButtonField conine butoane.
HyperlinkField cuprinde text din baza de date sub form de link-uri.
CommandField furnizeaz selectare sau editare de butoane.
TemplateField aceast coloan permite adugarea de noi cmpuri, de anumite controale
n funcie de necesitile utilizatorului.

GridView-ul furnizeaz mai multe tipuri de template-uri:

HeaderTemplate conine partea de header a tabelului.


FooterTemplate conine partea de footer a tabelului(dac proprietatea ShowFooter este

setat true).
ItemTemplate reprezint coninutul fiecrui rnd din tabel.
AlternatingItemTemplate reprezint coninutul fiecrui rnd impar din tabel(se poate si

seta un fundal diferit pentru aceste rnduri i atunci vom avea un deisgn mai atractiv).
EditItemTemplate cuprinde controale utilizate n modul de editare.
Pentru definirea coloanelor din GridView se folosete asp:BoundField, cu atributele

DataField i HeaderText. DataField va reprezenta numele cmpului din baza de date al crui
valoare va fi afiat pe rndul corespunztor. HeaderText reprezint numele coloanei ce va aprea
utilizatorului.
Pentru a nfrumusea GridView-ului putem folosi diverse proprieti:

HeaderStyle - presonalizeaz rndul ce cuprinde titlul coloanelor (dac este setat s apar

ShowHeader este true).


RowStyle - reprezint stilul fiecrui rnd.
AlternatingRowStyle - permite ca rndurile consecutive s fie diferite ca stil, pentru a

oferi un design mai atractiv.


SelectedRowStyle - ofer posibilitatea de a personaliza un anumit rnd atunci cnd acesta

este selectat.
EditRowStyle - ofer posibilitatea de a personaliza un anumit rnd atunci cnd acesta este

editat.
FooterStyle dac ShowFooter este setat ca fiind true, se pot schimba diverse proprieti
ale footer-ului.

28

Proprietatea AutoGenerateColumns setat ca fiind true permite crearea automat a


coloanelor din GridView. Folosirea acesteia nu ofer flexibilitatea de care are nevoie
programatorul, cci acesta poate dori afiarea numai a anumitor cmpuri din baza de date pe care
poate dorete s le numeasc altfel sau s le formateze diferit. Pentru aceasta, se seteaz
proprietatea AutoGenerateColumns la false i pentru definirea coloanelor se face n interiorul
tagulului <Columns> din seciunea GridView-ului.
Pentru a putea edita fiecare cmp de pe linia corespunztoare avem la dispoziie tagul
<asp:CommandField> ce are proprietatea ShowEditButton setat ca fiind True. Astfel, vom avea
un buton care, la click, va permite editarea cmpurilor respective. La click-ul pe buton cmpurile
cu valorile din baza de date vor deveni editabile i vor aprea dou butoane ce ofer posibilitatea
de a anula editarea sau de a o salva. Pentru a ti ce buton corespunde unei anumite nregistrri,
trebuie ca proprietatea DataKeyNames a Gridview-ului s fie setat ca fiind cheia primar a
tabelului respectiv. n DataSource-ul ataat controlului vom defini UpdateCommand (comanda de
updatare) ca n exemplu:
UpdateCommand="UPDATE Users SET First_Name = @First_Name
WHERE UserId = @UserId "
Numele cu @ n fa reprezint de fapt parametrii ce sunt valorile cmpurilor transmise
dup editare i numele lor trebuie s corespund cu numele cmpului din baza de date.
Pentru a activa sortarea ntr-un GridView trebuie setat proprietatea AllowSorting la true.
Apoi, pentru fiecare element din GridView ar trebui setat proprietatea SortExpression pentru a
defini dup ce coloan s se fac sortarea. Sortarea se face i n funcie de tipul de date al
coloanelor respective. Datele numerice i de tip dat sunt sortate de la cele mai mici la cele mai
mari, iar cele de tip String sunt ordonate alfabetic. Tipurile binare nu pot fi ordonate. La primul
click pe denumirea coloanei, sortarea se va face ascendent, iar la al doilea click se va face
descendent.
n baza de date putem avea multe nregistrri i atunci GridView-ul va fi foarte mare, iar
dac utilizatorul are o conexiune slab la internet, GridView-ul respectiv se va ncrca foarte
greu. De aceea, putem folosi proprietatea de paginare ce permite mprirea pe pagini a
nregistrrilor din GridView. Paginarea se realizeaz folosind diverse proprieti:

AllowPaging activeaz sau dezactiveaz paginarea nregistrrilor(default este fals).

PageSize seteaz numrul de nregistrri afiate ntr-o singur pagin a grid-ului


(default este 0).
29

PageIndex dac paginarea este activat, va seta indexul paginii curente.

Evenimentele PageIndexChanging i PageIndexChanged se declaneaz nainte de a se


schimba pagina(PageIndexChanging) i imediat dup(PageIndexChanged).
Pentru a activa editarea sau tergea unor nregistrri ntr-un control GridViews se seteaz
proprietatile AutoGenerateDeleteButton i AutoGenerateEditButton ca fiind true.

2.4 Clasele WebControl

30

2.4.1 Clasa WebControl de baz


Aceast clas definete funcionaliti importante(de exemplu, afiarea datelor) i include
proprieti de baz ce pot fi folosite de aproape orice control.

Proprieti:

BackColor, ForeColor i BorderColor - seteaz culorile pentru fundal,pentru prim plan i


conturul controlului. n majoritatea controalelor culoarea pentru prim plan reprezint i
culoarea textului.
31

TabIndex - reprezint un numr ce permite manipularea ordinii. Atunci cnd se ncarc


pagina pentru prima oar, controlul cu TabIndex egal cu 0 va capta atenia. Atunci cand
se va apsa Tab se va ajunge la elementul cu urmtorul cel mai mic TabIndex. Aceast

proprietate este permis ncepnd cu versiunea Internet Explorer 4.0.


ToolTip - afieaz un mesaj atunci cnd userul trece cu mouse-ul deasupra controlului

respectiv.
Controls - curpinde toate controalele ce sunt coninute n controlul current. Fiecare obiect
este vzut ca i obiect generic din System.Web.UI.Control, aa c, pentru a accesa

anumite proprieti ale controlului, acesta trebuie convertit.


Disabled - dezactiveaz controlul atunci cnd acesta este setat true i astfel, asigurnd

faptul ca userul nu poate interaciona cu el, iar evenimentele sale nu vor fi declanate.
EnableViewState - dezactiveaz starea automat a controlului cnd este setat false; n
acest caz controlul va avea proprietile i formatarea specificat n tagul su de fiecare
dat cand se face post back.

2.4.2 Obiectele de tip Color


Pentru a putea folosi obiecte Color trebuie s importm namespace-ul System.Drawing.
Proprietatea Color refer un obiect Color din System.Drawing. Un obiect Color se poate crea
n mai multe moduri:

Folosind ARGB (alpha, red, green, blue) fiecare reprezentnd fiind un ntreg ntre 0 i

255. Alpha reprezint transparena culorii (pentru opacitate total se folosete 255).
Folosind nume de culori predefinite n ASP .NET se pot alege din 140 de nume de

culori.
Folosind nume de culori din HTML se specific valoarea ca i un string folosing clasa
ColorTranslator.

Pentru a obine unei culoare folosind ARGB:


int alpha = 255, red = 0, green = 255, blue = 0;
control.ForeColor = Color.FromArgb(alpha, red, green, blue);
Obinerea unei culori folosind culori din ASP .NET:
control.ForeColor = Color.Crimson;
Obinerea unei culori folosind culori HTML:
control.ForeColor = ColorTranslator.FromHTML("Red");

2.4.3 Obiectele de tip FontInfo


32

Proprietatea Font refer un obiect de tip FontInfo ce este definit n namespace ul


System.Web.UI.WebControls. Fiecare obiect de acest tip are urmtoarele proprieti:

Name - indic numele font-ului respectiv.


Names - reprezint un ir de stringuri format din nume de fonturi, n ordinea preferinelor.
Browserul va utiliza prima potrivire a fontului cu ceea ce este instalat pe computerul

utilizatorului.
Size - reprezint dimensiunea font-ului ca i obiect de tip FontUnit. Poate reprezenta o

mrime relativ sau absolut.


Bold, Italic, Strikeout, Underline, i Overline proprieti boolene ce se aplic pe anumite
stiluri.

Exemplu:
control.Font.Name = "Verdana";
control.Font.Bold = true;
Setarea dimensiunii folosind tipul FontUnit - dimensiune relativ:
control.Font.Size = FontUnit.Small;
Specific dimensiune absoluta de 14 px:
control.Font.Size = FontUnit.Point(14;

2.5 Despre evenimente i AutoPostBack


Atunci cnd se face click pe un buton din pagin se face post back. Totui, exist aciuni
cauzate de un eveniment n urma crora nu se execut un post back. Un exemplu relevant ar fi
atunci cnd utilizatorul schimb un anumit text dintr-un textbox (i se declaneaz evenimentul
TextChanged) sau cnd trebuie s aleag un element dintr-un select (i se declaneaz
evenimentul SelectedIndexChanged). Dac se vrea un rspuns la acest evenimente fr post back,
ASP .NET ofer dou opiuni:

Se poate atepta pn la urmtorul postback. De exemplu, evenimentul


SelectedIndexChanged se declaneaz la selectarea unui element dintr-o list. Atunci cnd
userul selecteaz un element, nu se ntmpl nimic. Dac userul va da click pe un buton,
se va face post back i se vor declana dou evenimente: Button.Click i
ListBox.SelectedIndexChanged. Dac exist mai multe controale, este posibil ca ntr-un

singur postback s declaneze mai multe evenimente, ntr-o ordine aleatoare.


Se poate folosi un postback automat pentru a fora un control de a face post back la pagin
imediat dup ce userul face o anumit aciune.n acest caz, cnd userul alege un element
33

dintr-un select , pagina este retrimis (se face post back) i o nou versiune a paginii este
returnat.
Evenimente ale controalelor:
Eveniment

Controale web care pot declana evenimentul

Se face PostBack

Click

Button, ImageButton

Adevrat

TextChanged

TextBox (se declaneaz dup ce userul

Fals

duce cursorul asupra altui control)

Fals

CheckedChanged

CheckBox, RadioButton

Fals

SelectedIndexChanged

DropDownList, ListBox, CheckBoxList,

Fals

RadioButtonList
Dac se dorete captarea imediat a unui eveniment(precum TextChanged,
CheckedChanged sau SelectedIndexChanged), trebuie setat proprietatea AutoPostBack la true.
Astfel, pagina va fi trimis atunci cnd utilizatorul va interaciona cu controlul. Atunci cnd
pagina va fi retrimis, ASP .NET va examina pagina i va ncrca informaiile curente. n funcie
de necesiti, unele controale vor face post back, iar altele nu.

2.5.1 Funcionarea Post Back ului


Atunci cnd se creeaz o pagin ce include mai multe controale web, acestea sunt
configurate pentru a folosi AutoPostBack. ASP.NET adaug o funcie special JavaScript
corespunztoare paginii afiate. Aceast funcie poart numele de __doPostBack(). Atunci cnd
este apelat, se declaneaz un PostBack, iar datele sunt trimise napoi la server. ASP .NET
cuprinde dou cmpuri ascunse adiionale ce sunt folosite pentru a transmite informaiile napoi
la server. Acestea conin ID-ul controlului ce a declanat evenimentul i orice informaii care pot
fi relevante. Aceste cmpuri sunt iniial goale:
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET"
value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT"
value="" />
Funcia __doPostBack() are rolul de a seta aceste valori cu informaiile potrivite ale
evenimentului i apoi de a trimite formularul.
34

ASP .NET genereaz aceast funcie automat:


<script language="text/javascript">
function __doPostBack(eventTarget, eventArgument)
{
if (!theForm.onsubmit || (theForm.onsubmit() != false))
{
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
...
}
</script>
n final, fiecare control care are setat proprietatea AutoPostBack va fi conectat la aceast
funcie prin atributele onclick sau onchange. Aceste atribute indic cum ar trebui s reacioneze
browser-ul ca i rspuns la aceste evenimente.

2.5.2 Ciclul vieii unei pagini


Considerm c se declaneaz un eveniment asupra unui control ce are proprietatea
AutoPostBack setat ca fiind adevrat:
1. Pe partea de client este invocat funcia __doPostBack, iar pagina este retrimis la server.
2. ASP.NET recreeaz obiectul Page, folosind fiierul .aspx.
3. ASP.NET preia informaiile despre stare din inputurile ascunse ce indic starea i
actualizeaz controalele corespunztoare.
4. Se declaneaz evenimentul de Page.Load.
5. Evenimentul corespunztor controlului respectiv este declanat(dac sunt mai multe
controale ce declaneaz mai multe evenimente, ordinea n care acestea au loc este
nedeterminat) .
6. Se declaneaz evenimentul Page.PreRender, iar pagina este afiat (se transform dintrun set de obiecte n pagin HTML).
7. Se declaneaz Page.Unload.
8. Noua pagin este trimis userului.

2.6 Validatori n asp .NET

35

2.6.1 Tipuri de validatori

RequiredFieldValidator - se folosete pentru ca userul s nu omit completarea unui cmp.


CompareValidator - se utilizeaz pentru a compara valorile introduse de user cu o
anumit valoare constant (utilizm un operator de comparare precum < , >, = ) sau

pentru un anumit tip de date .


RegularExpressionValidator - se folosete pentru a verifica o anumit regul definit de o
expresie regulat. Acest tip de validare ne permite verificarea prezenei anumitor caractere

(de exemplu @ n email).


CustomValidator - verific valorile introduse de utilizator utiliznd o funcie ce poate fi
customizat.

Funcia ce va transparentiza scopul acestui validator are urmtorul prototip:


protected void TextValidate(object source,
ServerValidateEventArgs args)
Aceasta va seta args.IsValid la true sau la false n funcie de validrile fcute.
Pe partea de client avem:
<asp:CustomValidator id="CustomValidator1" runat="server"
OnServerValidate="TextValidate" ControlToValidate="TextBox1"
ErrorMessage="Text must be 8 or more characters.">
Pe partea de server avem:
protected void TextValidate(object source,
ServerValidateEventArgs args)
{
args.IsValid = (args.Value.Length >= 8);
}
Fiecare validator corespunde unui singur control. n plus, pentru acelai control se pot
folosi mai multe tipuri de validatoare (cu funcii diferite). Dac se folosete RangeValidator,
CompareValidator sau RegularExpressionValidator, validarea se face cu succes dac controlul
este gol, deoarece nu exist nici o valoare care sa fie validat. Dac nu dorim acest lucru, atunci
trebuie s folosim validatorul RequiredFieldValidator care s fie legat la controlul respectiv
Acest lucru asigur realizarea a dou tipuri de validri i restricionnd valorile blank.
Controalele de validare se gsesc n namespace-ul System.Web.UI.WebControls i motenesc
clasa BaseValidator. Aceasta definete funcionalitatea unui control de validare.

36

2.6.2 Proprieti ale clasei BaseValidator


ControlToValidate - identific controlul ce este verificat de validator. Fiecare validator
poate verifica valoarea din controlul respectiv. Totui, este rezonabil s folosim mai muli
validatori pentru acelai control deoarece putem avea mai multe tipuri de restricii.
ErrorMessage i ForeColor - dac validarea eueaz, validatorul va afia un mesaj de
eroare (setat prin proprietatea ErrorMessage). Prin schimbarea proprietii ForeColor se poate
seta culoarea acestui mesaj.
Display - permite configurarea unui mesaj de eroare ce va aprea atunci cnd avem
nevoie n pagin (dinamic) sau ntr-un anumit spaiu rezervat mesajului (static). Dinamic este util
atunci cnd se folosesc mai multe validri una dupa alta. Astfel, spaiul se va mri pentru a plasa
indicaiile active i nu vor exista spaii n plus. Static este util atunci cnd validator este ntr-un
tabel i nu vrem ca limea coloanei respective s cad atunci cnd nici un mesaj nu este afiat.
IsValid - dup ce se realizeaz validarea, aceasta va returna adevrat sau fals, dac
validarea s-a fcut sau cu succes. n general, se va verifica starea ntregii pagini, verificnd
proprietatea IsValid.
Enabled - atunci cnd proprietatea este setat ca fiind fals, validarea automat nu se va
realiza pentru controlul respectiv atunci cnd pagina va fi trimis.
EnableClientScript - atunci cnd proprietatea este setat ca fiind adevrat, ASP.NET va
aduga cod JavaScript i DHTML pentru a permite validarea pe partea de client.

2.7 Obiectul de tip Calendar


Acest control constituie un calendar n miniatur ce poate fi plasat n orice loc din pagina
noastr web. Calendarul poate fi tratat ca pe un singur obiect (definit ntr-un simplu tag), dar care,
afiat, este format din multe linii HTML.
<asp:Calendar id="MyCalendar" runat="server" />
Acesta prezint o vizualizare pe lun a zilelor. Utilizatorul poate schimba luna sau ziua,
iar ASP .NET va furniza datele i lunile corespunztoare. Nu este nevoie de a implementa diverse
proprieti ale acestui calendar deoarece acesta furnizeaz, n mare, majoritatea funcionalitilor
unui calendar. Se pot configura moduri de selecie a userului (de exemplu, s poat selecta o
37

sptmn ntreag). Calendarul este fcut astfel nct atunci cnd se selecteaz o anumit lun
s se poat aleag o singur zi din respectiva lun. Tipul de selecie se poate selecta prin
proprietatea Calendar.SelectionMode, iar configurarea pentru selectarea unei sptmni ntregi se
poate face folosin Calendar.FirstDayOfWeek. Atunci cnd se permite selectarea multipl a zilelor
este necesar verificarea proprietii SelectedDates ce cuprinde o colecie a datelor selectate.
Aceasta se poate itera folosind foreach. De exemplu:
selDates.Text = "Ai selectat urmatoarele date:<br />";
foreach(DateTime dt in MyCalendar.SelectedDates)
{
selDates.Text +=

dt.ToLongDateString()+ -;

2.7.1 Proprieti
DayHeaderStyle - afieaz stilul pentru seciunea calendarului ce cuprinde zilele saptmnii..
DayStyle - reprezint stilul default pentru zilele sptmnii din luna curent.
NextPrevStyle - reprezint tipul controalelor de navigare din seciunea de titlu ce duce la o lun
la alta.
OtherMonthDayStyle - reprezint stilul datelor ce nu sunt afiate n luna curent.
SelectedDayStyle - reprezint stilul datelor selectate.
SelectorStyle - reprezint stilul sptmnii / lunii selectate.
TitleStyle - reprezint stilul seciunii curente a titlului.
TodayDayStyle - reprezint stilul pentru datele ce reprezint data curent.
WeekendDayStyle - reprezint stilul pentru zilele din weekend.

2.8 Cookie-uri n ASP .NET


Cookie-urile sunt fiiere de regul mici, ce sunt stocate de browser. Acestea sunt create
atunci cnd utilizatorul navigheaz pe un site ce foloseste cookie - uri. Acestea sunt de dou
tipuri: cookie-uri de sesiune i cele persistente. Cele de sesiune sunt depozitate temporar n
timpul navigrii pe un anumit site, iar odat cu prsirea site-ului acestea sunt terse. Cookie
-urile persistente rmn n folderul browserului chiar dac utilizatorul prsete site-ul, iar n
cazul n care acesta revine pe acel site, cookie urile se reactiveaz. Cookie - urile persistente se
mai numesc i de urmrire.
38

n ASP .NET, cookie - urile sunt uor de folosit. Obiectele Request i Response (ce sunt
proprieti ale lui Page) furnizeaz colecii de cookie-uri. Cel mai important fapt este s nu uitm
c extragerea de cookie-uri se face cu ajutorul obiectului Request, iar setarea de cookie-uri se
face prin intermediul obiectului Response.
Pentru a seta un cookie trebuie creat un obiect de tip HTTPCookie, iar apoi trebuie setat
informaia corespunztoare i adugat rspunsului curent.
Crearea de cookie :
HTTPCookie cookie = new HTTPCookie("Pref");
Setarea unei valori:
cookie["Sign"] = "Pisces";
Adugarea altei valori:
cookie["City"] = "Bucharest";
Adugarea la rspuns:
Response.Cookies.Add(cookie);
Un astfel de cookie va fi trimis la fiecare cerere i va exista pn cnd userul nchide
browserul. Pentru a crea cookie-uri persistente se poate seta o dat de expirare a cookie-ului
respectiv. Un cookie ce expir dup cinci ani:
myCookie.Expires = DateTime.Now.AddYears(5);
Un cookie se poate accesa folosing colecia Request.Cookies:
HTTPCookie myCookie = Request.Cookies["Pref"];
Deoarece userul poate dezactiva cookie-urile , nainte de a accesa un cookie este recomandat s
testeze existena acestuia :
String Sign;
if(cookie != null)
{
Sign language = cookie["YourSign"];
}
Pentru a nltura un cookie, l putem nlocui cu un alt cookie cu o or de expirare din
trecut :
HTTPCookie myCookie = new HTTPCookie("Preferences");
myCookie.Expires = DateTime.Now.AddDays(-10);
Response.Cookies.Add(myCookie);

39

2.9 Sesiuni n ASP .NET


ASP.NET identific fiecare sesiune folosind un identificator pe 120 de bii. Acesta este
generat n urma unui algoritm ce garanteaz (statistic vorbind) unicitatea numrului i
imposibilitatea de a fi aflat prin reverse-engineering. Id-ul sesiunii se va transmite ntre serverul
web i client. Atunci cnd clientul deine id-ul respectiv, ASP.NET furnizeaz obiectele stocate n
sesiunea respectiv i le plaseaz ntr-o colecie special pentru a putea fi accesate(acest proces se
realizeaz automat).
Clientul poate trimite id-ul sesiunii prin dou metode:
-

Metoda default este de a folosi cookie-uri (se utilizeaz un cookie special cu numele de
ASP.NET_SessionId, fiind creat automat de ASP .NET atunci cnd se folosete o colecie

de sesiune).
A doua metod este valabil i dac sunt dezactivate cookie-urile. Aceasta poate fi folosit
folosind URL - uri modificate. Dei aceast metod rezolv multe probleme de
administrare, serverul este forat s memoreze informaii adiionale ce pot influena

performana aplicaiei.
Pentru a putea interaciona cu session trebuie s folosim clasa System.Web.SessionState.
HTTPSessionState, ce este furnizat n pagina noastr web ca un obiect predefinit de tip Session.
Dac vrem s adugm elemente n colecia noastr i s le extragem este ca i cum vrem s
adugm elemente la view-state-ul paginii. De exemplu, pentru a memora un DataSet n memoria
Session - ului avem:
Session["DataSet"] = ds;
Pentru a extrage informaia, vom folosi conversie:
ds = (DataSet)Session["DataSet"];
nainte de accesa obiectul ds, trebuie verificat mai nti dac acesta exist.
Starea sesiunii a utilizatorului curent este global ntregii aplicaii. Aceasta se poate pierde n
urmtoarele situaii:
-

Dac sesiunea expir (adic trece un anumit timp n care utlizatorul nu face nimic).Despre

expirarea sesiunii putem afla n seciunea de configurare.


Daca n pagina noastr se apeleaz, la un moment dat, metoda Session.abandon().
Dac userul nchide i redeschide browserul sau dac acceseaz aplicaia n alt browser.

2.9.1 Configurarea strii Session-ului

40

Fiierul de configurare web.config ne permite de a seta diverse opiuni despre starea


Session-ului. Opiunile ce pot fi setate pentru <sessionState> sunt: cookieless, cookieName,
regenerateExpiredSessionId, timeout, mode, stateConnectionString, stateNetworkTimeout,
sqlConnectionString.
Opiunea Cookieless poate lua una din valorile:

UseUri - nu sunt folosite Cookie-urile, iar id-ul sesiunii se memoreaz n URL.


UseCookies Cookie-urile sunt folosite ntotdeauna, chiar dac browserul nu le accept
sau dac acestea sunt dezactivate. Dac sistemul nu accept cookie-uri, atunci id-ul
sesiunii se va pierde dup cererile urmtoare, deoarece fiecare cerere va determina

generarea unui nou id.


UseDeviceProfile - ASP .NET alege dac s foloseasc sau nu cookie-uri n funcie de

obiectul BrowserCapabilities.
AutoDetect - ASP .NET incearc s afle dac browserul utilizatorului suport sau nu
cookie-urile, ncercnd s seteze i sa extrag un cookie. Aceast metod determin dac
un browser suport sau nu cookie-urile, dar n cazul n care acestea sunt dezactivate se va
folosi opiunea de cookieless.
O setare important a strii sesiunii din web .config este timeout-ul. Acesta specific

numrul de minute ateptate de ASP .NET fr a primi o cerere nainte de a se abandona sesiunea.
Aceast setare reprezint unul din cele mai importante compromisuri al strii sesiunii. O diferen
de minute poate avea un efect dramatic asupra ncrcrii serverului i a performanei aplicaiei.
Cel mai bine ar fi s se aleag un interval de timp suficient de scurt pentru a permite server-ului
s revendice o important parte de memorie dup ce un client nu mai utilizeaz aplicaia
respectiv. Totui, acest interval de timp trebuie s fie suficient de lung pentru a permite
utilizatorului s ia o pauz i s i continue sesiunea fr s-o piard. Timeout-ul sesiunii poate fi
schimbat din cod. Dac se tie c o sesiune conine o cantitate mare de informaii, probabil va fi
nevoie de setarea unei limite de timp. De exemplu:
Session.Timeout = 10;

2.10 Interaciunea cu baza de date


2.10.1 Ciclul vieii unei pagini cu Data Binding
Controalele ce constituie surse de date pot avea dou atribuii:

41

pot s regseasc informaiile din baza de date(printr-o surs de date) i s le atribuie


anumitor controale. Atunci cnd se folosete aceast proprietate, controalele sunt populate

automat cu date i nu este necesar apelul DataBind().


pot s modifice baza de date. Pentru realizarea acestui lucru trebuie folosit un control
precum GridView, DetailsViews etc. De exemplu, dac n GridView se va da click pe
butonul de Update, acesta va declana update-ul n controlul cu sursa de date respectiv i
acesta va modifica informaiile din baza de date.

Pentru a putea utiliza aceste controale, trebuie s nelegem ciclul vieii unei pagini:
1. Se creeaz obiectul Page (bazat pe pagina cu extensia .aspx).
2. Se declaneaz evenimentele de Page.Init i Page.Load.
3. Se declaneaz toate celelalte evenimente ale controalelor.
4. Dac utilizatorul face vreo schimbare, controalele cu surse de date ii vor desfura
operaiile de updatare. Dac un rnd este updatat, evenimentele Updating i Updates vor fi
declanate. Dac un rnd este ters, evenimentele Deleting i Deleted vor fi declanate.
5. Se declaneaz evenimentul de Page.PreRender.
6. Controalele cu surse de date i execut interogrile i se populeaz controalele cu datele
specificate. Acest pas se va executa atunci cnd se face pentru prima oar PostBack la pagin,
iar la fiecare PostBack se asigur c avem date actuale. Evenimentele declanate sunt
Selecting i Selected.
7. Pagina este afiat.
Paii 4 i 6 constituie paii n care controalele intervin n acest proces.

2.10.2 SqlDataSource
ASP .NET furnizeaz un control numit SqlDataSource, care, dup cum sugereaz i
numele, este folosit pentru extragerea informaiilor din baza noastr de date.
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ... />
De fapt, acest control reprezint o conexiune la baza de date ce folosete furnizorul
ADO.NET. SqlDataSource-ul are nevoie de un mod generic de a crea conexiunea, comanda
aferent i obiectele de tip DataReader. Acest lucru este posibil dac furnizorul nostru de date ne

42

poate oferi anumite date. Din fericire, .NET furnizeaz aceste date pentru fiecare din cei patru
furnizori:
System.Data.SqlClient
System.Data.OracleClient
System.Data.OleDb
System.Data.Odbc
Numele de furnizor System.Data.SqlClient este implicit i poate fi omis.
Se pot folosi oricare din cei patru furnizori mpreun cu SqlDataSource, iar numele
furnizorului va trebui setat ca n exemplul:
<asp:SqlDataSource ProviderName="System.Data.SqlClient" ... />
n continuare, trebuie s adugm stringul de conexiune, care este foarte important, cci
prin intermediul lui se realizeaz conexiunea la baza de date. Acesta se poate introduce n tagul
de SqlDataSource sau poate fi scris n seciunea <connectionStrings> din fiierul web.config. Cea
de-a doua variant e mult mai flexibil i n cazuri extreme, se asigur faptul c stringul de
conexiune nu se va modifica.
<configuration>
<connectionStrings>
<add name="AspNetDb" connectionString=
"Data Source=.\SQLEXPRESS;AttachDbFilename="C:\Users\
Documents\App_Data\ASPNETDB.MDF";Integrated
Security=True;Connect Timeout=30;User Instance=True
"/>
</connectionStrings>
...
</configuration>
Pentru a scrie stringul de conexiune n tagul controlului SqlDataSource putem folosi
urmtoarea sintax:
<asp:SqlDataSource ConnectionString="<%$
ConnectionStrings:AspNetDb %>" ... />
n continuare, putem folosi SqlDataSource-ul pentru a face o cerere Sql putem face
select, update, delete, n funcie de ceea ce avem nevoie. Pentru acestea, controlul deine anumite
proprieti: SelectCommand, InsertCommand, UpdateCommand i DeleteCommand. Toate
ateapt un string. Acesta poate fi introdus att pe pagina noastr .aspx, ct i din cod C#.
Stringul poate conine SQL inline n acest caz avem SelectCommandType,
InsertCommandType, UpdateCommandType sau DeleteCommandType care pot corespunde cu
numele unei proceduri n acest caz avem StoredProcedure. De exemplu, dac vrem s extragem
43

toi utilizatorii din baza noastr de date i s populm un drop down cu informaiile existente,
definim mai nti un SqlDataSource cu comanda de select aferent, dup care adugm un
DropDownList pe care l legm de SqlDataSource-ul ce are id-ul corespunztor(folosind
proprietatea DataSourceId).
<asp:SqlDataSource ID="MyUsers" runat="server"
ConnectionString="<%$ ConnectionStrings:AspNetDb %>"
SelectCommand="SELECT user_name, user_id FROM
aspnet_users"/>
<asp:DropDownList ID="Users" runat="server"
AutoPostBack="True"
DataSourceID="MyUsers" DataTextField="user_name"
DataValueField="user_id" />
Toate controalele ce permit popularea lor cu date dinamice, permit i modificarea
proprietii DataValueField, ce atribuie informaia corespunztoare atributului din controlul
respectiv. Acest lucru ne permite de a memora date importante ce nu sunt afiate. De exemplu,
putem defini cele dou proprieti astfel:
Users.DataTextField = "Valoare";
Users.DataValueField = "Cheie";
n funcia ce trateaz evenimentul corespunztor schimbrii unei opiuni din lista
noastr( PostBack trebuie setat true), vom putea extrage i cheia(id-ul) elementului ce a fost
selectat:
protected void Users_SelectedIndexChanged(Object sender,
EventArgs e)
{
Label1.Text = "Userul ales: " + Users.SelectedItem.Text;
Label2.Text = " Cu id-ul: " + Users.SelectedItem.Value;
}

2.10.3 Interogri parametrizate


Nu ntotdeauna avem flexibilitatea de a scrie interogarea direct n tagul controlului
deoarece aceasta presupune extragerea anumitor informaii ce depind de o anumit valoare de
care avem nevoie. De exemplu:
<asp:SqlDataSource ID="aboutUsers" runat="server"
ProviderName="..."
ConnectionString="<%$ ConnectionStrings:AspNetDb %>"
44

SelectCommand=select * from aspnet_users WHERE user_id=@user_id"


/>
Valoare ce conine @ n fa reprezint un parametru ce trebuie definit n seciunea de <
SelectParameters> a controlului nostru SqlDataSource. Practic, aceast seciune transmite
controlului unde ar trebui s gseasc valoarea corespunztoare fiecrui parametru.
<SelectParameters>
<asp:ControlParameter ControlID="ControlFirstUser"
Name="user_id"
PropertyName="SelectedValue" />
</SelectParameters>
Numrul de parametri pe care i putem defini este nelimitat, ns valoarea ce i este
asociat trebuie s fie unic. n cazul nostru, valoarea pentru @user_id va proveni din
proprietatea ControlFirstUser.SelectedValue. Practic, se va atribui parametrului o valoare ce este
plasat ntr-un control.
Pentru a afia diverse informaii din baza de date este indicat s folosim controale precum
GridView, DetailsView sau FormView. Aceste controale pot afia mai multe cmpuri din baza de
date ntr-un design extrem de flexibil.
Parametrul ce indic o proprietate a unui control este de tip ControlParameter. Putem avea
i alte tipuri de parametri:
-

<asp:ControlParameter> Reprezint o proprietate a unui alt control de pe

pagin.
<asp:QueryStringParameter> Reprezint valoarea din stringul interogrii

curente.
<asp:SessionParameter> Reprezint valoarea memorat n sesiunea utilizatorului

curent.
<asp:CookieParameter> Reprezint valoarea de la orice cookie asociat cererii

curente.
<asp:ProfileParameter> Constituie o valoare din profilul curent al utilizatorului.
<asp:RouteParameter> Reprezint o valoare din URL-ul rutat. URL-urile rutate

reprezint o metod avansat ce permite maparea oricrui URL ctre orice alt pagin.
<asp:FormParameter> Constituie o valoare trimis paginii dintr-un input. De obieci,
se folosete proprietatea controlului respectiv, dar este de preferat s se extrag valoarea
dorit exact din colecia de Form-uri n caz c view state-ul este dezactivat pentru acel
control.

n unele situaii, avem nevoie de folosirea tagului <asp:Parameter> prin care s ne definim
parametrul. Valoarea sa va fi setat din codul de pe partea de server. SqlDataSource cuprinde
45

anumite evenimente responsabile pentru setarea valorilor parametrilor. Acetia se pot seta n urma
declanrii evenimentului Selecting; similar, se pot folosi i evenimentele de Updating, Deleting
sau Inserting n urma modificrii, tergerii sau a inserrii. n handlerii pentru aceste evenimente,
putem accesa comanda ce urmeaz a fi executat(folosind proprietatea Command al obiectului
EventArgs). SqlDataSource furnizeaz i evenimente precum Selected, Updated,
Deleted i Inserted care au loc dup ce interogrile au fost fcute, deci ar fi prea ttziu pentru a
mai schimba valoarea parametrilor. Pentru a seta valoarea unui parametru(ce reprezint o dat)
adugnd la acesta nc cinci ani:
protected void sourceOrders_Selecting(object sender,
SqlDataSourceSelectingEventArgs e)
{
e.Command.Parameters["@Data"].Value =
DateTime.Today.AddYears(5);
}

2.10.4 Modificarea nregistrrilor


Cnd trebuie s efectum comanda de update, apare o problem deoarece nu toate
controalele permit update-ul. De exemplu, ListBox-ul nu furnizeaz pentru utilizator vreo metod
de editare, tergere sau inserare, dar pentru acestea exist controale precum GridView,
DetailsView sau FormView. nainte de a comuta ctre funcionalitile de editare, trebuie definite
comenzile ce trebuie efectuate n sursa noastr de date. Acestea pot fi InsertCommand,
DeleteCommand sau UpdateCommand i se definesc folosind o interogare parametrizat, ca n
exemplul:
<asp:SqlDataSource ID="sourceProductDetails" runat="server"
ProviderName="..."
ConnectionString="<%$ ConnectionStrings:AspNetDb %>"
SelectCommand="SELECT
userName,usedId,lastActivityDate,MobileAlias
FROM aspnet_users WHERE userId=@userId"
UpdateCommand="UPDATE aspnet_users SET userName = @userName,
lastActivityDate = @lastActivityDate, MobileAlias = @MobileAlias
WHERE user_id=@user_id ">
<SelectParameters>
<asp:ControlParameter ControlID="FirstUserofTheControl"
Name="userId"
PropertyName="SelectedValue" />
</SelectParameters>
</asp:SqlDataSource>

46

n acest exemplu, numele parametrilor nu sunt alei arbitrar. Parametrii nu trebuie definii
separat dac le dm acelai nume cu cmpul din baza de date(cu @ n fa). Acest lucru este
permis deoarece ASP .NET introduce toi parametrii ntr-o colecie nainte de a avea loc updateul. Fiecare parametru din colecie respect convenia de nume, fapt ce ce ne salveaz mult din
timp. De asemenea, trebuie oferit utilizatorului o metod de a introduce noi valorip. De
exemplu, putem utiliza DetailsViews ce furnizeaz posibilitatea de a edita nregistrri din baza de
date(proprietatea AutoGenerateEditButton va fi setat True):
<asp:DetailsView runat="server" ID="Inregistrari"
DataSourceID="mySource" AutoGenerateEditButton="True" />
La o comand de update vom avea probleme dac doi utilizatori acceseaz n acelai timp
pagina ce conine aceste nregistrri. Dac cei doi utilizatori vor face modificri pe aceeai
cmpuri, pot aprea probleme. Acestea se pot rezolva folosind metoda concurenei match-allvalues. n aceast situaie, comanda de update va eua dac nregistrrile originale au fost
modificate ntre timp. n clauza where va trebui s punem condiii de egalitate pe toate
cmpurile respective. De asemenea, trebuie ntiinat SqlDataSource-ul pentru a menine valorile
vechi din sursa de date i de a le furniza numele parametrilor ce ncep cu _original. Astfel, va
trebui s setm dou proprieti: SqlDataSource.ConflictDetection se va seta
ConflictOptions.CompareAllValues n loc de ConflictOptions.OverwriteChanges (ce era
implicit). Proprietatea OldValuesParameterFormatString se va seta cu textul original_{0}, care
spune DataSource-ului s insereze textul _original nainte de numele cmpului pentru a crea
parametrul ce deine vechea valoare. SqlDataSource-ul nu va arunca nici o excepie dac nici un
update nu va fi efectuat. Pentru a verifica acest lucru, putem folosi proprietatea
SqlDataSourceStatusEventArgs.AffectedRows. Dac aceasta are valoare 0, nici o nregistrare nu
a fost updatat, iar utilizatorul ar trebui ntiinat de problema de concuren ce a mpiedicat
update-ul:
protected void UpdatedInfo(object sender,
SqlDataSourceStatusEventArgs e)
{
if (e.AffectedRows == 0)
{
Label1.Text = "Nu s-a realizat nici un update.
Comanda este incorect sau s-a ivit o problem de
concuren
}
else
{
47

Label1.Text = "Record successfully updated.";


}
}

Aceast metod de rezolvare a concurenei nu este foarte eficient pentru o baz de date
mare. n aceast situaie, putem s adugm o coloan la tabelul respectiv de tip timestamp, ce va
fi folosit pentru a verifica existena concurenei. Timestamp-ul este un cmp special folosit
pentru a ine evidena strii unui cmp. Dac se realizeaz o schimbare asupra unui cmp, n baza
de date timestamp-ul se va modifica i va primi o alt valoare. Scopul acestui timestamp este de a
uura verificarea concurenei. Atunci cnd vrem s facem un update pe un tabel ce include un
cmp timestamp, trebuie folosit n condiia where:
UpdateCommand="UPDATE Users SET UserName=@UserName,
ImageUrl = @ImageUrl, BirthDate = @BirthDate
WHERE UserId=@UserId AND RowTimestamp=@RowTimestamp"
Id-ul utilizatorului este necesar pentru a identifica nregistrarea corespunztoare. Dac
valoarea din coloana RowTimestamp va coincide cu cea dat, vom ti c nregistrarea respectiv
nu a fost modificat. Valoarea actual a timestamp-ului nu este important, deoarece aceasta este
controlat de baza de date. Trebuie s tim doar dac respectiva valoare s-a schimbat ntre timp.
Crearea unui timestamp este uoar: de exemplu, n SqlServer se poate crea un cmp timestamp
folosind tipul de dat timestamp.

DESCRIEREA APLICAIEI
3.1 Descrierea aplicaiei
Aceas aplicaie este o aplicaie web care furnizeaz un calendar ce permite utilizatorilor
de a-i crea evenimente de care vor fi notificai in prealabil.

48

Dup ce i creeaz un cont, utilizatorul va avea o pagin de profil. n aceasta pagin


evenimentele vor putea fi vizualizate sub form de calendar zilnic ( n care se poate alege orice
alt zi pentru a se afia evenimentele corespunztoare) sau sub form de calendar sptmnal ( n
care , n funcie de ziua aleas, se va furniza sptmna din care face parte acea zi). Evenimentele
care dureaza o or vor fi afiate normal, n spaiul lor corespunztor, iar cele care dureaz mai
puin de o zi i mai mult de o or vor avea scris durata atunci cnd se va trece cu mouse-ul
deasupra lor. Cele care dureaz mai mult de o zi vor fi afiate n partea de sus a calendarului
atunci cnd vom selecta o zi n care evenimentul este n derulare.
Utilizatorul va putea crea noi evenimente. Acestea pot avea o culoare special (cu care
apoi va aprea n calendar ca i fundal al evenimentului) sau pot avea setat ca utilizatorul curent
s fie notificat prin e-mail/pop-up cu un anumit numr de minute nainte de a avea loc
evenimentul respectiv. De asemenea, se pot aduga invitai la acest eveniment(prin introducerea
adresei de mail).
Utilizatorul va putea edita evenimentele. Se vor putea schimba numele, orele, data,
culoarea evenimentului, detalii despre notificri sau se pot aduga invitai.
Evenimentele ce vor avea setat opiunea de notificare prin e-mail, vor aprea n
calendare diferit fa de restul avnd n plus si un plic, care sugereaz utilizatorului c
evenimentul respectiv are setat opiunea de trimitere de e-mail-uri.
Tot n pagina de profil, utilizatorul va putea selecta o alt culoare pentru calendarele sale.
Utilizatorul va avea o seciune de editare a profilului, ce se aseaman cu un panou de
control. n cadrul acesteia va avea opiuni de schimbare a parolei, a detaliilor personale i a pozei
de profil. Tot aici, utilizatorul va putea vedea agenda sa, adic toate evenimentele sortate dup
dat i toate invitaiile primite.
Pentru dezvoltarea acestei aplicaii am folosit urmtoarele tehnologii:
- pe partea de client, pentru interfaa aplicaiei am folosit ASP .NET 4.0, JavaScript,
jQuery, HTML, CSS.
- pe partea de server, pentru implementarea funcionalitilor, am utilizat C# 4.0.

3.2 Baza de date diagrama conceptual


Un sistem de gestiune a bazelor de date constituie componenta software a unui sistem de
baz de date ce interfereaz cu toate componentele acestuia, realiznd legtura i interdependena
ntre componentele sistemului.
49

Rolul unui SGBD ntr-un context de sistem de baz de date este de a:


- defini i descrie structura bazei de date, printr-un limbaj propriu specific, respectnd un
anumit model de date;
- ncrca/valida datele n baza de date respectnd nite restriciile de integritate;
- realiza accesul la date pentru diferite operaii;
- ntreine baza de date cu ajutorul unor instrumente speciale;
- asigura protecia bazei de date sub la nivelul securitii i integritii datelor.
n aceast aplicaie am folosit sistemul de gestiune a bazelor de date Microsoft SQL
Server.
Microsoft SQL Server este un sistem de gestiune a bazelor de date relaionale creat de
compania Microsoft.
Baza de date a aplicaiei mele este detsul de simpl, cuprinznd tabelul Users, tabelul
Events n care se memoreaz evenimentele i tabelul UsersParticipateEvent , ce constituie un
tabel asociativ ntre celelalte dou.

3.3 Structura aplicaiei


50

3.3.1 Pagina principal


Pe pagina principal am integrat logarea n partea de sus a paginii, iar sub acesta am
integrat i sign-up-ul. n partea stng a sign up-ului, am ales s adaug cteva indicaii despre
aplicaie pentru a convinge utilizatorul de a folosi aceast aplicaie.

Am folosit login-ul implicit al ASP-ului i am modificat tabelul User din baza de data
furnizat de ASP, adugnd coloanele Skin i Picture, n care am memorat numele ultimului tip
de skin ales de utilizator i numele pozei de profil. La aceast baz de date am mai adugat
tabelul Events n care se memoreaz evenimentele fiecrui utilizator i in care avem detalii
despre evenimentul respectiv, precum titlul, ora, data etc.
Formularul de login cuprinde validatori de prezen pentru cele dou cmpuri(numele
utilizatorului i parola). Evident, dac nu sunt coincid valorile inserate cu cele din baza de date,
se va semnala un mesaj de eroare.

3.3.2 Pagina de profil

51

Fiecare pagin creat poate fi accesat doar dac utilizatoul este logat. Aa c, n funcia
de Page Load a fiecrei pagini am testat:
if (User.Identity.IsAuthenticated)
{
userID = Membership.GetUser().ProviderUserKey.ToString()
}
else Response.Redirect("Default.aspx");
De asemenea, pentru vizualizarea paginii de profil a utilizatorului este necesar extragerea
pozei de profil a utilizatorului(ce apare n partea de sus a paginii) i tema curent a calendarului.
if (!Page.IsPostBack)
{
SqlCommand extractPicture = new SqlCommand("select Picture
from aspnet_Users where UserId = '" + userID + "'", c);
SqlCommand extractSkin = new SqlCommand("select Skin from
aspnet_Users where UserId = '" + userID + "'", c);
c.Open();
dr = extractPicture.ExecuteReader(CommandBehavior.
CloseConnection);
while (dr.Read())
{
src = dr["Picture"].ToString();
}
Image1.ImageUrl = src;
dr.Close();
c.Open();
dreader = extractSkin.ExecuteReader(CommandBehavior.
CloseConnection);
while (dreader.Read())
{
skin = dreader["Skin"].ToString();
}
dreader.Close();
}
De asemenenea, tot in funcia de Page Load, trebuie populat i dropdown-ul ce conine
tipurile de fundaluri ale calendarului. Valoarea selectat va fi cea regsit n baza de date.
if (!Page.IsPostBack)
{
string[] sArray1 = new string[] { "implicit", "Fundal1",
"Fundal2", "Fundal3" };
DropDownList1.DataSource = sArray1;
DropDownList1.DataBind();
DropDownList1.SelectedValue = skin;
52

}
Atunci cnd un user se logheaz i se afieaz calendarul cu toate evenimentele din ziua
respectiv, dar se poate alege i o alt zi pentru a vedea i alte evenimente. Atunci cnd se alege o
alt zi se face PostBack la pagin (deoarece obiectul asp:Calendar are setat proprietatea
autoPostBack ca fiind true) i se declaneaz un eveniment cu numele de OnSelectionChanged,
ce apeleaz o funcie n care se modific data(data curent va deveni data selectat) i se va
interoga baza de date pentru a extrage evenimentele din data respectiv. Vom memora datele
despre aceste evenimente n nite variabile. Prin PostBack, se va rencrca i partea de client i
astfel, n JavaScript vom accesa variabilele respective din C# (care trebuie declarate ca variabile
publice). De exemplu:
saptamana = "<%= this.week %>"
Deci, prin intermediul PostBack-ului i a comunicrii client-server, vom avea afiate
evenimentele corespunztoare n funcie de data selectat de utilizator.

La click pe butonul de Zi se apeleaz funcia ce afieaz calendarul ce conine


evenimentele din ziua respectiv. Elementele calendarului le-am creat dinamic i le-am apendat
unui element cu id-ul wrapCalendar. Div-urile din partea stng au ca i coninut(innerHTML)

53

toate perechile de ore din timpul unei zile(de la 00:00-01:00 pn la 23:00-00:00), iar div-urile
din partea dreapt conin evenimentele ce ncep la ora ce este scris n div-ul din partea stng.
La acestea le-am adugat dinamic o clas n care le-am setat diverse proprieti, precum
background, padding, margin, float, minHeight etc. Aceste proprieti sunt importante pentru
designul calendarului.
Pentru a corela div-urile din stnga cu cele din dreapta, am setat id-ul fiecrui element din
dreapta ca fiind egal cu orele ce corespund evenimentului de pe linia respectiv (prin variabila
unique_id).
Acest id este foarte necesar deoarece la onClick trebuie s se poat aduga evenimente la
ora corespunztoare elementului pe care s-a dat click(vom folosi setAttribute).
calendar2.id = unique_id;
calendar2.setAttribute('onClick', 'addEvent("' + unique_id
+ '",event)');
n funcia de addEvent trebuie s redirecionm ctre o pagin cu extensia .aspx(folosind
window.location.href) i s transmitem acest id (n C# vom putem accesa variabilele din URL,
folosind Request. QueryString).
if (Request.QueryString["nr"] != null)
idEvent = Request.QueryString["nr"];
Dup ce s-a adugat un eveniment(vom detalia acest proces n capitolul Adugarea de
evenimente), se redirecioneaz pe pagina principal, n care calendarul nostru va aprea
updatat, coninnd i evenimentul proaspt adugat. Astfel, pe partea de client va trebui s
accesm anumite variabile din code-behind ce conin detalii despre evenimentul respectiv, n
special culoarea i titlul (avem nevoie de acestea atunci cnd afiam evenimentul respectiv).

54

De asemenea, se pot vizualiza evenimentele nu numai zilnic, ci i sptmnal. Utilizatorul


are la dispoziie dou butoane cu ajutorul crora poate schimba modul de vizualizare al
calendarului. Implicit, butonul ce realizeaz vizualizarea pe zi a calendarului este apsat iniial.
La click pe butonul ce duce la vizualizarea sptmnal a calendarului, am apelat o funcie n
care iniial, am ters toi copii elementului cu id-ul wrapCalendar la care am apendat toate
div-urile despre care am detaliat mai sus, dup care am creat noi elemente.

Calendar sptmnal este sincronizat cu data selectat (adic va conine sptmna n care
exist data respectiv). Am creat o funcie ce seteaz un vector cu datele sptmnii curente.
Aceasta se va apela att n PageLoad (dac nu se face PostBack), ct i din metoda apelat n
urma schimbrii datei. Acest vector se va actualiza n funcie de ziua datei selectate. De exemplu,
dac ziua selectat va fi zi de Luni, atunci avem:
if (Calendar1.SelectedDate.DayOfWeek.ToString() == "Monday")
{
for(k = 0 ;k < n ; k++)
{
saptCurenta[k] = (Calendar1.SelectedDate.AddDays(k));
}
}
Calendarele pot avea mai multe skinuri pe care le alege utilizatorul n funcie de
preferine. Utilizatorul poate alege dintr-un drop-down un anumit skin. Acest drop-down are
ataat un eveniment OnSelectedIndexChanged.Astfel, cnd se va alege o alt tem pentru
calendar, se va apela o anumit funcie n care se va updata valoarea Skin-ului din baza de date a
utilizatorului curent.
string userID = Membership.GetUser().ProviderUserKey.ToString();
skin = DropDownList1.SelectedValue;
55

string updatestr = "Update aspnet_Users SET Skin ='" +


DropDownList1.SelectedValue +"'where UserId = '" + userID +"'";
SqlCommand SqlCommand1 = new SqlCommand(updatestr, c);
c.Open();
SqlCommand1.ExecuteNonQuery();
Vom seta la acest drop-down proprietatea AutoPostBack ca fiind true. Astfel, se va face
refresh la pagin i, la nivel de JavaScript vom seta ca fundalul calendarului s coincid cu
valoarea din baza de date(memorat la nivel de C# ntr-o variabila public).
backgr = '<%= this.skin %>';
La schimbarea skin-ului calendarului zilnic, automat ar trebui ca i calendarul lunar s
apar cu acelai skin. Am utilizat o alt metod, nefolosind valoarea Skin-ului din baza de date.
n funcia ce afieaz caledarul pe tip de sptmn am extras n variabila backgr background-ul
elementelor ce au fost apendate pn n acel moment la elementul wrapCalendar(am folosit
funcia hasChildNodes i background-ul elementului respectiv l-am accesat prin variabila
childNodes[1].style.background). Funcia hasChildNodes va returna mereu true pentru c n
funcia ce se apeleaz la pageLoad se creeaz copiii elementului wrapCalendar. Totui, am pus
aceast condiie pentru siguran.
if (cell.hasChildNodes())
{
backgr = cell.childNodes[1].style.backgroundColor;
while (cell.childNodes.length >= 1) {
cell.removeChild(cell.firstChild);
}
}

56

Evenimentele ce au setat notificarea prin e-mail apar cu alt background, iar evenimentele
ce dureaz mai mult de o or n aceeai zi va avea proprietatea ca, la hover pe eveniment,
utilizatorul va putea vedea, de fapt, ct dureaz evenimentul.
el.setAttribute('onMouseOver',
'setHours(\''+hour+'\','+random_id+')');
el.setAttribute('onMouseOut',
'outsetHours(\''+hour+'\','+random_id+)');
function setHours(ora,id)
{
var el = document.getElementById(id);
var durata = document.createElement('div');
durata.innerHTML = ora ;
durata.className = "durataEv";
el.appendChild(durata);
}
function outsetHours(ora,id)
{
var el = document.getElementById(id);
//stergem fiii
if (el.hasChildNodes())
{
for (var i = 0; i < el.childNodes.length; i++)
if(el.childNodes[i].className == "durataEv")
{
el.removeChild(el.childNodes[i]);
}
}
}
Titlul evenimentelor poate depi mrimea predefinit a div-urilor n care sunt afiate
acste evenimente. De aceea, am creat o funcie n JavaScript ce asigur, n cazul n care titlul
evenimentului depete numrul maxim de caractere permise nlocuirea acestora cu puncte de
suspensie:
if(numeEv[i][j].length > max_length)
{
for(s = 0 ; s < max_length - 2 ; s++ )
elem.innerHTML += numeEv[i][j][s];
elem.innerHTML += "...";
}

57

3.3.3 Adugarea evenimentelor


n pagina de adugare de evenimente, se poate aduga titlul evenimentului(ce este
obligatoriu), datele de nceput/sfrit, orele de nceput/sfrit, culoarea evenimentului i setarea
dac se dorete notificarea prin e-mail.
Datele se adaug printr-un calendar (obiect din ASP de tip Calendar) ce este sincronizat
cu un input ce conine data ce este selectat. Iniial, valoarea este setat ca fiind data curent.
Calendarul are setat ca la evenimentul de onSelectedDate s insereze data selectat n baza de
date i s se modifice valoarea din input-ul respectiv.
Orele de nceput/sfrit au valorile iniiale corespunztoare div-ului pe care s-a dat click.
Dac este bifat check-boxul care indic dac evenimentul dureaz toat ziua, aceste drop-downuri ce conin orele vor disprea.
Acele elemente colorate pe care, la click apare un border, constituie elemente dintr-o list,
a cror background l-am setat din C#. Din JavaScript m-am asigurat c la un alt click, elementul
precendent va fi deselectat i c la fiecare click voi transmite culoarea selectat unui HiddenField.
function setColor(obj)
{
......
var ascuns = document.getElementById("<%=
HiddenField1.ClientID %>");
ascuns.value = obj.style.backgroundColor;
}
Obiectul obj este parametrul funciei ce constituie elementul curent pe care s-a dat click i
care a fost transmis prin:
<li class="items" runat="server" id="Li11"
onclick="setColor(this)" > </li>
Pe partea de code-behind, vom accesa aceast valoare prin HiddenField1.Value.
La onClick pe butonul de Adaug eveniment se apeleaz o funcie ce realizeaz
nserarea.

58

3.3.4 Editarea evenimentelor


La click pe un eveniment, acesta se poate edita. La editare, trebuie transmis id-ul
evenimentului curent pentru a putea afia n pagina de editare a evenimentului informaiile
corespunztoare acestuia. Printele div-ului pe care se face click(ce este tot un div) are i el
eveniment de onClick. Dac se seteaz pe tagul fiu evenimentul onClick, nu se va declana
funcia aferent acestui eveniment, ci funcia de la onClick a elementului tat. Practic,
evenimentul de onClick de la tat se proag la fiu (acest proces poart numele de bubbling event)
i pentru a opri aceast propagare trebuie s setm anumite proprieti ale obiectului de tip event,
folosind proprietatea cancelBubble si metoda stopPropagation().
function editEvent(id, e)
{
if (!e)
var e = window.event;
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
window.location.href = "EditEvent.aspx?nr=" + id;
}

59

Se pot edita numele evenimentelor, orele, data , culoarea , setrile notificrilor sau se pot
vizualiza invitaii deja existeni si se pot aduga alii.
tergerea evenimentului se va efectua condiionat, doar dac utilizatorul va confirma
aceast aciune. Aceast confirmare am realizat-o prin intermediul comunicrii ntre JavaScript i
C#. Iniial, fereastra cu alertarea utilizatorului este ascuns i apare doar n cazul n care se d
click pe butonul de tergere a evenimentului. n pagin avem dou butoane:
<asp:Button ID="DeleteButton" style="display: none;"
runat="server" Text="Sterge eveniment"onClick="deleteEvent" />
<input id="DeleteButtonHTML" type="button" name="test"
value="Sterge eveniment" onclick="Verificare();" />
Primul buton este ascuns, ns are un rol foarte important decoare la onClick pe acesta se
declaneaz tergerea evenimentului respectiv. De aceea, am fcut un mic truc, genernd click
pe buton dintr-o funcie n JavaScript, ce se va declana cnd se apas da:
function StergeEveniment()
{
document.getElementById("DeleteButton").click();
document.getElementById("div_mare").style.display = "none";
document.getElementById("div_conf").style.display = "none";
}

60

Dac utilizatorul alege opiunea de a nu terge evenimentul, vom realiza doar ascunderea
elementelor HTML.
function NuStergeEveniment()
{
document.getElementById("div_mare").style.display = "none";
document.getElementById("div_conf").style.display = "none";
}
Pe partea de code-behind, vom realiza tergerea evenimentului din baza de date:
if (Request.QueryString["nr"] != null)
idEvent = Request.QueryString["nr"];
deletestr = "delete from Events where id_event ="+idEvent ;
SqlCommand SqlCommand1 = new SqlCommand(deletestr, c);
c.Open();
SqlCommand1.ExecuteNonQuery();

3.3.4 Editarea profilului


Utilizatorul poate vizualiza invitaiile sale si detaliile despre acestea. Pentru aceast
facilitate am interogat tabelul UsersParticipateEvent i am integrat rezultatele interogrii ntr-un
GridView(ce are setat proprietatea AutoGenerateDeleteButton ca true, iar DataKeyNames are
valoarea cheii primare din tabelul nostru).
61

string query2 = "select ev.id_event, up.gazda_event, u.UserName,


u.UserId, up.id_event, nume_event, data_event, data_event_stop,
ora_inceput, ora_sfarsit from Events ev, UsersParticipateEvent
up, aspnet_Users u where up.UserId = '" + userID + "' and
ev.id_event = up.id_event and u.UserId = up.UserId";
SqlDataSource2.SelectCommand = query2;
SqlDataSource2.DataBind();
SqldataSource -ul din pagina noastr va avea setat ConnectionString-ul corespunztor
pentru baza noastr de date i astfel , dac GridView-ul va avea setat ca la DataSourceId s aibe
id-ul controlului din pagina noastr, acesta va extrage informaiile din baza noastr de date.

Vizualizarea evenimentelor se realizeaz pe acelai principiu, cu ajutorul altui GridView,


ce va cuprinde toate evenimentele utilizatorului respectiv. Acesta are setate proprietile
AllowPagging i AllowSorting ca fiind true:
<asp:GridView ID="gridView1" Runat="server"
DataKeyNames="id_event" AutoGenerateColumns="False"
BorderWidth="1px" ForeColor="#f6b7f0"
CellPadding="5" CellSpacing="2"
BorderStyle="None" BorderColor="#DEBA84"
DataSourceID="SqlDataSource1" AllowPaging="true"
AllowSorting="true" >
62

Fiecare element din GridView constituie un BoundField cu anumite proprieti:


<asp:BoundField HeaderText="Nume eveniment"
DataField="nume_event"
SortExpression="nume_event">
</asp:BoundField>
Pentru aliniere se poate folosi n interiorul BoundField-ului elementul:
<ItemStyle HorizontalAlign="Center"></ItemStyle>
n code-behind am selectat toate evenimentele unui utilizator:
string query = "select * from Events where UserId = '" +
userID + "' order by data_event;";
SqlDataSource1.SelectCommand = query;
SqlDataSource1.DataBind();

De asemenea, utilizatorul i poate schimba parola, informaiile personale sau poza.


Acestea constituie simple update-uri n baza de date.

63

protected void updatePersonalDetails(object sender, EventArgs e)


{
string userID = Membership.GetUser().
ProviderUserKey.ToString();
SqlCommand setInfo = new SqlCommand();
SqlCommand setEmail = new SqlCommand();
//updatam in baza de date cu noile valori
setEmail = new SqlCommand("update aspnet_Membership set
Email ='"+Email.Text +"' where UserId = '" + userID + "';", c);
setInfo = new SqlCommand("update aspnet_Users set
UserName = '"+numeUser.Text + "' where UserId = '" + userID +
"';", c);
c.Open();
setEmail.ExecuteNonQuery();
setInfo.ExecuteNonQuery();
}
La upload-ul pozei am setat calea unde se va salva poza ce este uploadat de utilizator:
if (FileUpload1.HasFile)
{
String fileName = FileUpload1.FileName;
savePath += fileName;
FileUpload1.SaveAs(savePath);
string imgSource = "img/" + fileName;
}

64

3.3.5 Notificarea prin e-mail


Utilizatorul are opiunea de a seta primirea unei notificri prin e-mail nainte de a ncepe
evenimentul. Acesta trebuie s introduc cu cte minute nainte dorete s primeasc e-mail.
Pentru a realiza notificarea prin e-mail am realizat un program separat de aceast
aplicaie. Acesta trebuie s fie rulat din minut n minut, pentru a ne asigura c, indiferent dac
utilizatorul este sau nu logat n aplicaie, el va fi notificat prim e-mail, pentru fiecare eveniment
ce a fost setat s notifice utilizatorul cnd acesta dorete. Pentru acest lucru, am folosit programul
TaskScheduler, o component a Microsoft Windows, ce permite programarea rulrii unor
scripturi la momente de timp predefinite sau la anumite ore specificate.
Programul realizat interogheaz baza de date, verificnd dac la ora actual exist vreun
eveniment ce are setat email-ul i dac la aceast or utilizatorul a setat opiunea de primire a
mail-ului. Pentru aceasta trebuie s calculm pentru fiecare eveniment din ziua curent la ce or
dorete utilizatorul s primeasc e-mail.
SqlCommand extractEvent = new SqlCommand("select * from
Events where email_setat is not null and data_event ='" +
data_curenta.ToString("M/dd/yyyy") + "'", c);
c.Open();
dr = extractEvent.ExecuteReader(CommandBehavior.
CloseConnection);
while (dr.Read())
{
DateTime data_reminder = (Convert.ToDateTime
(dr["ora_inceput"])).AddMinutes(Convert.ToInt32( dr["email_setat"]));
nume_ev = dr["nume_event"].ToString();
DateTime data = DateTime.Parse(data_reminder.ToString());
data_curenta = DateTime.Now;
DateTime data_curenta2 = DateTime.Parse(data_curenta.
ToString());
}
Dac ora calculat va coincide cu ora curent, vom extrage e-mail-ul utilizatorului i i
vom trimite mail.
if (data_curenta2.ToString("HH:mm") == data_reminder.
ToString("HH:mm"))
{
SqlCommand setEmail = new SqlCommand("select Email from
aspnet_Membership where UserId = '" + dr["UserId"] + "';", d);
d.Open();

65

dr2 = setEmail.ExecuteReader(CommandBehavior.
CloseConnection);
while (dr2.Read())
{
email = dr2["Email"].ToString();
}
}
Apoi setm anumite proprieti:
var smtp = new System.Net.Mail.SmtpClient ("smtp.gmail.com",
587);
smtp.EnableSsl = true;
smtp.UseDefaultCredentials = false;
smtp.Credentials = new System.Net.NetworkCredential
("cruceanudaniella22@gmail.com","");
try
{
Label2.Text = "Mail trimis la "+email;
System.Net.Mail.MailMessage message = new System.Net.Mail.
MailMessage();
message.To.Add(email);
message.Subject = "Nu uita: " + dr["nume_event"];
message.Body = "Nu uita evenimentul! Incepe in :
"+dr["email_setat"]+" minute";
smtp.Send(message);
message = null;
}
catch (Exception exc)
{
Console.WriteLine("Eroare trimitere e-mail: " + exc);
}

66

3.3.6 Notificarea prin pop-up


Utilizatorul poate seta ca nainte de un eveniment s poat fi notificat prin pop-up. Acest
lucru l-am realizat astfel: n C#, n funcia de Page Load am apelat o funcie ce verific dac n
momentul n care utilizatorul a intrat pe pagin este vreun eveniment n derulare ce a are setarea
pentru pop-up exact la ora curent (n acest caz, cnd se intr pe pagin va aprea un pop-up). n
aceast funcie se calculeaz ora la care ar trebui s apar notificarea. De asemenea, n anumite
variabile se memoreaz detaliile evenimentului de care vom avea nevoie pentru a fi alertat
utilizatorul. Variabila ce memoreaz numrul de minute rmase pn la nceperea evenimentului
i de care vom avea nevoie pe partea de client este de tip string pentru ca, n cazul n care
utilizatorul are mai multe evenimente ce au pop-up setat la aceeai or, acestea vor aprea n
acelai alert(dac le puneam n alert-uri separate exista riscul, n anumite cazuri, s nu mai apar
unele notificri ale unor evenimente).
string numeEv = "";
string nrMin = "";
DateTime data_curenta = DateTime.Now;
SqlDataReader dr = null;
SqlCommand extractEvent = new SqlCommand("select * from Events
where popup_setat is not null and data_event ='" +
data_curenta.ToString("M/dd/yyyy") + "' and UserId = '"+userID
+"'", c);
c.Open();
dr = extractEvent.ExecuteReader(CommandBehavior.
CloseConnection);
while (dr.Read())
{
DateTime dtt = (Convert.ToDateTime(dr["ora_inceput"])).
AddMinutes(-Convert.ToInt32(dr["popup_setat"]));
nume_ev = dr["nume_event"].ToString();
DateTime dtt2 = DateTime.Parse(dtt.ToString());
data_curenta = DateTime.Now;
DateTime data_actuala = DateTime.Parse(data_curenta.
ToString());
if(data_actuala.ToString("HH:mm") == dtt2.ToString("HH:mm"))
{
//extragem detaliile evenimentului
numeEv += dr["nume_event"].ToString() +"/";
nrMin += Convert.ToInt32(dr["popup_setat"]) + "/";
}
}
67

Observm c am memorat n anumite variabile titlurile evenimentelor i numrul de


minute pentru a fi afiate n pop-up, pe partea de client. Pe partea de client, vom face un
PostBack forat, la fiecare minut, pentru a actualiza att valorile ce ne intereseaz din baza de
date, ct i cele pe care le accesm din JavaScript. Pentru a face PostBack forat, vom apela
funcia click() a unui buton ce are atributul runat=server(care face PostBack). Funcia ce face
acest lucru se apeleaz la evenimentul de onLoad pe body. Nu vom folosi SetInterval, deoarece
oricum se va da refresh la pagin atunci cnd se va da click pe buton( avem nevoie doar se
setTimeout pentru ca refresh-ul s nu aibe loc n fiecare secund).
function VerifEven()
{
var myVar = setTimeout(function() {clickB()},59000);
}
function clickB()
{
document.getElementById("<%= Button1.ClientID
%>").click();
}
function verif()
{
var nrMin = new Array();
var numeEv = new Array();
var nr_min = "<%= this.nrMin %>";
var nume_ev = "<%= this.numeEv %>";
var nume_eveniment = "";
var nrMin = nr_min.split("/");
68

var numeEv = nume_ev.split("/");


var lung = nrMin.length;
if(nume_ev != "")
{
for(i = 0 ; i< lung; i++) nume_eveniment += numeEv[i] + "";
alert(nume_eveniment+ " incep(e) peste "+nrMin[0] +"
minute");
}
}
Dup cum observm i din cod, dac vom avea mai multe evenimente ce au notificare
setat la aceeai or, ele vor aprea n acelai alert.

69

BIBLIOGRAFIE
1. Microsoft Visual C# 2012 Step by Step, John Sharp, Ed. Microsoft Press, 2012
2. Beginning Object-Oriented Programming with C#, Jack Purdum, Ed. Wiley / Wrox, 2012
3. Microsoft ASP.NET 4 Step by Step, George Shepherd, Ed. Microsoft Press, 2010
4. Professional C# 4.0 and .NET 4, Bill Evjen, Morgan Skinner, Jay Glynn, Karli Watson,
Christian Nagel, Ed. Wiley / Wrox, 2010
5. Beginning ASP.NET 4.5: in C# and VB, Imar Spaanjaars, Ed. Wiley / Wrox, 2012
6. Developer's Guide to Collections in Microsoft .NET, Calvin "Lee" Janes, Ed. Microsoft
Press, 2011
7. Beginning ASP.NET 4.5 in C#, Matthew MacDonald, Ed. Apress, 2012
8. www.msdn.microsoft.com

70

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