ASPNET Curs Microsoft
ASPNET Curs Microsoft
ASP.NET
PhD. Lucian Sasu
25 mai 2009
Cuprins
1 Aplicatii Web
1.1 Pagini Web. Servere Web. Aplicatii Web . .
1.2 Modele clasice de realizare a aplicatiilor Web
1.2.1 Comunicarea cu serverul . . . . . . .
1.2.2 Limbajul HTML . . . . . . . . . . .
1.2.3 Limbajul XHTML . . . . . . . . . .
1.3 Formulare . . . . . . . . . . . . . . . . . . .
1.3.1 Text . . . . . . . . . . . . . . . . . .
1.3.2 Password . . . . . . . . . . . . . . .
1.3.3 Checkbox . . . . . . . . . . . . . . .
1.3.4 Butoane radio . . . . . . . . . . . . .
1.3.5 Butonul de Submit . . . . . . . . . .
1.3.6 Butonul de reset . . . . . . . . . . .
1.3.7 File . . . . . . . . . . . . . . . . . . .
1.3.8 Campuri ascunse . . . . . . . . . . .
1.3.9 Image . . . . . . . . . . . . . . . . .
1.3.10 Butoane . . . . . . . . . . . . . . . .
1.3.11 Textarea . . . . . . . . . . . . . . . .
1.3.12 Select . . . . . . . . . . . . . . . . .
2 ASP.NET
2.1 Generalitati . . . . . . . . . . . . . . .
2.1.1 Ce e gresit la ASP-ul clasic? . .
2.1.2 Ce aduce ASP.NET? . . . . . .
2.2 Despre ASP.NET 3.5 . . . . . . . . . .
2.3 Tipuri de siere n ASP.NET . . . . .
2.4 Modelul de cod . . . . . . . . . . . . .
2.5 Controale Web si controale HTML . .
2.6 Forme Web . . . . . . . . . . . . . . .
2.6.1 Postback . . . . . . . . . . . . .
2.6.2 Mentinerea starii prin Viewstate
3
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7
7
10
11
14
14
16
19
20
20
21
21
22
22
22
23
24
24
25
.
.
.
.
.
.
.
.
.
.
27
27
27
29
30
30
32
36
37
37
39
CUPRINS
2.6.3
2.6.4
. . . .
pagina
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
47
47
47
47
48
48
49
50
53
53
55
57
58
58
59
59
.
.
.
.
.
.
.
.
.
.
.
.
61
61
62
62
63
64
65
66
66
67
67
68
71
.
.
.
.
73
73
74
77
83
CUPRINS
6 Legarea la date
6.1 Legarea la date simple . . . . . . . . .
6.2 Legarea la date multiple . . . . . . . .
6.3 Controale de date bogate . . . . . . .
6.4 Controale de surse de date . . . . . . .
6.5 Ciclul de viata al unei pagini Web . . .
6.6 Sursa de date SqlDataSource . . . . . .
6.6.1 Selectarea de nregistrari . . . .
6.6.2 Dezavantaje ale SqlDataSource
6.7 Sursa de date ObjectDataSource . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
85
86
88
90
91
91
93
93
94
94
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
97
97
97
98
98
98
99
99
99
. . . . . .
. . . . . .
. . . . . .
paginilor .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
101
101
103
105
105
108
109
111
116
117
117
118
118
8 JavaScript si Ajax
8.1 Elemente de baza JavaScript . . . . . . . . . . . . .
8.2 Blocuri de script . . . . . . . . . . . . . . . . . . .
8.3 Manipularea elementelor HTML . . . . . . . . . . .
8.4 Utilizare de JavaScript pentru ncarcare asincrona a
8.5 Includerea blocurilor JavaScript din code-behind . .
8.6 Atacuri de injectare de script . . . . . . . . . . . .
8.7 JavaScript pentru controale utilizator . . . . . . . .
8.8 Ajax . . . . . . . . . . . . . . . . . . . . . . . . . .
8.8.1 Obiectul XMLHttpRequest . . . . . . . . . .
8.8.2 Trimiterea cererii . . . . . . . . . . . . . . .
8.8.3 Procesarea raspunsului . . . . . . . . . . . .
8.9 Un exemplu Ajax . . . . . . . . . . . . . . . . . . .
9 ASP.NET membership
123
9.1 Congurarea autenticarii prin forme . . . . . . . . . . . . . . 125
9.2 Crearea sursei de date . . . . . . . . . . . . . . . . . . . . . . 126
9.3 Congurarea stringului de conexiune si a furnizorului de membership 126
9.4 Crearea de utilizatori . . . . . . . . . . . . . . . . . . . . . . . 131
9.5 Crearea unei pagini de login . . . . . . . . . . . . . . . . . . . 132
CUPRINS
9.6
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
132
133
133
133
134
134
134
135
135
135
136
Capitolul 1
Aplicatii Web
1.1
CAPITOLUL 1. APLICATII
WEB
10
CAPITOLUL 1. APLICATII
WEB
1.2
WEB 11
stocheaza informatii despre sesiunea unui utilizator, care partajeaza
informatii ntre utilizatorii unei aplicatii etc.
4. JSP (Java Server Pages) face parte din familia Java si reprezinta o
tehnologie care permite crearea de aplicatii Web independente de platforma. JSP separa interfata utilizator de continutul generat dinamic
permitand schimbarea ntregului sablon al site-ului WEB fara a altera informatiile asate. Tehnologia utilizeaza marcatori XML si scripturi scrise n limbajul de programare Java pentru a incapsula logica
aplicatiei care genereaza continutul paginilor WEB. JSP-urile sunt o
extensie a tehnologiei Java Servlet. Servlet-ele sunt independente de
platforma 100% si reprezinta module la nivel de server care se integreaza
n cadrul unei aplicatii Web si care pot utilizate pentru a extinde
capabilitatile unui server WEB. Tehnologia JSP si servlet-urile ofera
o alternativa pentru crearea aplicatiilor WEB fata de alte limbaje de
scripting/programare a aplicatiilor WEB, oferind independenta de platforma, performanta, separarea logicii aplicatiei de partea de interfata
utilizator, administrare usoara si extensibilitate.
Punctele de mai sus au n comun faptul ca serverul Web prezinta o
interfata de comunicare cu procese externe. Separarea software-ul n diferite
procese ofera avantajul de modularizare si usureaza procesul de integrare,
n acelasi timp extinzand functiile web server-ului. Aceste procese externe
realizeaza componenta logica a activitatii. Conguratia descrisa este redata
n gura 1.2.
Figura 1.3 arata modul n care Serverul IIS utilizeaza ASP.NET pentru a
servi pagini web dinamice; mai departe, codul ASP.NET este responsabil de
a lua legatura cu surse de date pentru a furniza continutul actual al paginilor
dinamice.
1.2.1
Comunicarea cu serverul
Paginile web sunt de obicei transmise si primite prin intermediul Internetului via HTTP2 (nesecurizat) sau HTTPS3 (securizat). Dezvoltarea protocolului HTTP a fost supervizata de catre World Wide Web Consortium,
versiunea actuala la care s-a ajuns este HTTP 1.1.
HTTP este un standard care permite crearea de cereri si raspunsuri ntre
un client si un server. Clientul - de regula un browser, dar poate sa e si un
robot de descarcare a paginilor sau o aplicatie utilizator - face o cerere catre
2
3
12
CAPITOLUL 1. APLICATII
WEB
Figura 1.3: Server IIS folosind ASP.NET pentru generarea de pagini Web
dinamice
WEB 13
un sever, folosind o adresa web. De regula, aceasta cerere HTTP (protocol la
nivelul aplicatie din stiva de protocoale TCP/IP) se foloseste de o conexiune
TCP; portul spre care se face cererea este 80, implicit folosit pentru HTTP.
Cand primeste cererea, serverul raspunde cu:
un cod de stare(de exemplu, HTTP/1.1 200 OK daca resursa ceruta
este disponibila); o lista a codurilor este data n [1], [4].
un mesaj care este resursa ceruta (pagina web sau imagine sau document etc), sau un mesaj de eroare sau alta informatie
Browserul primeste aceste raspunsul de la server si l aseaza; e de la sine
nteles ca browserul trebuie sa implementeze cat mai del acest protocol.
Mai n detaliu, o cerere arata astfel:
linie de cerere, prevum GET /images/logo.gif HTTP/1.1, care cere o
resursa numita /images/logo.gif de pe server
antete, precum Accept-Language: en
o linie goala
un mesaj optional
Cele mai importante metode de cerere prin care un client solicita ceva de
la server sunt: get si post. Acestea vor exemplicate n sectiunea 1.3.
Un aspect esential al comunicaarii prin HTTP este nsa faptul ca HTTP
este un protocol fara stare. Asta n seamna ca ori de cate ori un client
efectueaza o cerere catre un server, acesta raspunde cererii dupa care uita
tot ceea ce a comunicat cu clientul; serverul nu mentine nicio legatura cu
browserul si nu mentine resursele necesare pentru a raspunde clientului (cu
o exceptie minora, mecansimul de keep-alive care permite reutilizarea unei
conexiuni pentru alte cereri); daca apar modicari ale paginii sau a surselor
de date pe baza carora s-a construit pagina, atunci browserul nu este notificat
n niciun fel.
In acest mod serverul, netinand resurse ocupate dupa efectuarea raspunsului,
poate sa e utilizat de cat mai multi clienti simultan. Trasatura mentionata
trebuie privita ca o caracteristica voita a protocolului si nu ca o lipsa.
Mentinerea starii dintre cereri consecutive venite de la acelasi client este
totusi dorita de catre utilizatori sau programatori n majoritatea cazurilor
si acest lucru se poate emula prin utilizarea de cookieuri, campuri ascunse,
sesiuni.
14
CAPITOLUL 1. APLICATII
WEB
1.2.2
Limbajul HTML
Limbajul HTML4 este limbajul predominant folosit pentru crearea paginilor Web. El descrie structura, continutul si modul de aparitie al unei
pagini; poate sa includa referinte catre imagini, legaturi catre alte pagini,
frame-uri, formulare etc. Un exemplu simplu este:
<html>
<head>
<title>Hello HTML</title>
</head>
<body>
<p>Hello World!!</p>
<a href="http://google.com" target="_blank">Google is
your friend</a>
</body>
</html>
Continutul unui document HTML care dupa cum se observa, este un
document de tip text se creeaza pe baza unor elemente (<p>, <a> etc)
care sunt denite de catre limbaj. Un element are de regula o eticheta de
deschidere si una de nchidere (dar n HTML acest lucru nu e ntotdeauna
cerut); elementele pot avea atribute specicate prin nume si carora li asociaza
valori:
<span id="anId" class="aClass" style="color:blue;"
title="Hypertext Markup Language">HTML</span>
Un tutorial bun pentru ncepatori se gaseste la W3Schools.com. De exemplu, pentru includerea unei imagini se foloseste secventa:
<img src="boat.gif" alt="Big Boat">
Browserul, dupa primirea sierului HTML va efectua o parsare a codului;
la ntalnirea elementului img se face o cerere de tip GET pentru a obtine
imaginea de pe server.
1.2.3
Limbajul XHTML
Una din criticile care sau adus lui HTML este ca permite combinarea
continutului efectiv al unei pagini cu indicatii despre cum sa arate acest
4
WEB 15
continut n pagina. Suplimentar, faptul ca n HTML nu se respecta niste
reguli de buna formare face parsarea continutului greoaie si poate duce la
diferente. S-a dorit obtinerea unui limbaj pentru care interpretarea sa e mai
usoara, sa se poata separa structura de continut si de asemenea sa semene
nca cu limbajul HTML cu care creatorii de pagini web erau obisnuiti. Prin
preluarea trasaturilor limbajului XML s-a ajuns la realizarea unui limbaj
hibrid XHTML5 . Chiar daca mai exista pagini scrise n limbaj HTML,
exista o presiune constanta de a produce numai continut XHTML; chiar si
uneltele de dezvoltare se conformeaza acestei tendinte.
Implicit, continutul generat de ASP.NET este de tip XHTML. Asta nseamna
ca elementele de marcare satisfac regulile:
etichetele si numele de atribute trebuie sa e scrise cu litere mici
toate elementele trebuie sa e nchise, e cu un tag (eticheta) de nchidere
dedicat (<p></p>) e folosind un tag gol care se nchide singur (<br />).
toate atributele trebuie sa aibe valorile incluse ntre ghilimele sau apostroafe (id="errorLabel").
atributul id trebuie sa e folosit n locul atributului name (dar controalele ASP.NET generate vor avea amandoua aceste atribute, din motive
de compatibilitate cu codul JavaScript existent).
elementele trebuie sa e imbricate corect: <p><a href="...">..</a></p>
si nu <p><a href="...">..</p></a>.
documentele XHTML trebuie sa aibe un unic element radacina; acesta
este dat de eticheta html.
XHTML de asemenea nlatura suportul pentru cateva mecanisme existente n HTML, precum frame-urile sau precizari stilistice care nu utilizeaza
CSS, sau folosirea atributului target pentru link-uri.
Orice document XHTML trebuie sa nceapa cu o declaratie de tip de document (vezi [3], sectiunea de DTD), care deneste tipul de XHTML folosit.
Pentru a specica varianta XHTML 1.1 se foloseste:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
iar elementul radacina are forma:
5
Extensible HTML
16
CAPITOLUL 1. APLICATII
WEB
1.3
Formulare
1.3. FORMULARE
7
8
9
10
11
17
id="txtParola" />
<br />
<input type="submit" name="butonTrimitere"
value="Trimite" id="butonTrimitere" />
</form>
18
CAPITOLUL 1. APLICATII
WEB
Figura 1.5: Eroare semnalata de serverul Web: URL-ul este prea lung.
Daca se specica metoda post, atunci setul de date din formular se include n corpul formularului si trimis mai departe la server; URL-ul nu va
modicat. Mai exista o diferenta semantica ntre get si post: get este
considerat idempotent, adica nu modica starea serverului la trimiteri repetate ale aceleiasi interogari (abstractie facand de cresterea unor contoare
sau nregistrarea acestor actiuni, sau orice alte efecte nereleavnte), pe cand
post e gandit pentru a produce efecte colaterale pe server tranzactii nanciare sau modicari de date.
In interiorul unui formular pot folosite urmatoarele elementele de tip
input:
text
password
6
1.3. FORMULARE
19
checkbox
radio
submit
reset
le
hidden
image
button
Se folosesc cu forma generala: <input type="..." .../>. Sunt prezentate
pe scurt n cele ce urmeaza. Pe langa acestea mai sunt disponibile:
textarea
select
1.3.1
Text
<html>
<body>
<form action="default.aspx">
First name:
<input type="text" name="firstname">
<br />
Last name:
<input type="text" name="lastname">
<br />
<input type="submit" />
</form>
</body>
</html>
20
CAPITOLUL 1. APLICATII
WEB
1.3.2
Password
1.3.3
Checkbox
<form>
I have
<input
<br />
I have
<input
<br />
I have
<input
a bike:
type="checkbox" name="vehicle" value="Bike">
a car:
type="checkbox" name="vehicle" value="Car">
an airplane:
type="checkbox" name="vehicle" value="Airplane">
1.3. FORMULARE
10
11
21
Iesirea este data n gura 1.7. Daca se bifeaza Car si Airplane atunci pe
server va ajunge un query string de forma vehicle=Car&vehicle=Airplane.
Documentatia completa se gaseste aici.
1.3.4
Butoane radio
Permite alegerea a cel mult una din mai mult optiuni. Codul HTML si
modul n care arata sunt date mai jos.
1
2
3
4
5
6
7
<form>
<input type="radio" name="sex" value="male">Male
<br />
<input type="radio" name="sex" value="female">Female
<br />
<input type="submit" />
</form>
1.3.5
Butonul de Submit
In exemplele anterioare formularele aveau un buton a carui apasare determina trimiterea formularului catre server. Acesta este creat cu:
22
1
2
3
4
CAPITOLUL 1. APLICATII
WEB
<form>
...
<input type="submit" />
</form>
1.3.6
Butonul de reset
1.3.7
File
Cu secventa:
1
2
3
4
5
<form action="default.aspx">
<input id="myFile" type="file"/>
<br />
<input type="submit" value="Incarca">
</form>
rezulta un formular de ncarcare de sier care arata precum cel din gura
1.9. Detalii se gasesc aici.
1.3.8
C
ampuri ascunse
23
1.3. FORMULARE
1.3.9
Image
Input-ul de tip imagine creeaza un control imagine care, atunci cand este
apasat trimite formularul catre server. Locatia imaginii este denita prin
atributul src:
1
2
3
4
5
6
<form action="default.aspx">
<input id="adresa" type="text" />
<br />
<input type="image" alt="text alternativ"
src="btn.png" height="20px"/>
</form>
cu iesirea data n gura 1.10
24
CAPITOLUL 1. APLICATII
WEB
1.3.10
Butoane
Exista un input de tip buton, care arata precum cel de Submit sau Reset,
a carui apasare va procesata exclusiv prin cod JavaScript, n browser. In
exemplul de mai jos la apasarea butonului se depune o valoare n textbox-ul
formularului, se aseaza o fereastra pe ecran si apoi se face submiterea formularului, totul prin cod JavaScript (dar oricare din actiuni este optionala):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<html>
<head>
<script type="text/javascript">
function myJSFunction() {
var hiddenElement = document.getElementById("adresa");
if (hiddenElement != null) {
hiddenElement.value = "valoare setata din myJSFunction";
}
window.alert("functia myJSFunction s-a terminat");
document.getElementById("formular").submit();
}
</script>
</head>
<body>
<form id="formular" action="HTMLPage.htm">
<input id="adresa" type="text" size="40" />
<br />
<input id="myButton" type="button" value="button"
onclick="myJSFunction();"/>
</form>
</body>
</html>
1.3.11
Textarea
Input-ul de tip text este convenit a contine o singura linie. Pentru cazul
n care se doreste existenta unei casute text cu mai multe linii se poate folosi
elementul textarea:
1
2
3
<form id="myForm">
<textarea id="zonaText" cols="20" rows="4"></textarea>
<br />
1.3. FORMULARE
25
Figura 1.11: Input de tip buton. Este aratata starea dupa apasarea butonului.
4
5
1.3.12
Select
26
6
7
8
9
10
CAPITOLUL 1. APLICATII
WEB
<option value="21">Teleorman</option>
</select>
<br />
<input type="submit"/>
</form>
Query string-ul asociat este judete=14, iar reprezentarea este data n gura
1.13.
Capitolul 2
ASP.NET
2.1
Generalit
ati
2.1.1
Spagetti code
Consideram urmatorul exemplu, n care un dropdown list HTML este
populat cu rezultatul unei interogari a unei baze de date:
27
28
CAPITOLUL 2. ASP.NET
<%
Set dbConn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
dbConn.Provider = "sqloledb"
dbConn.Open "Server=SERVER_NAME; Database=Pubs;
Trusted_Connection=yes"
%>
<select name="cboAuthors">
<%
rs.Open "SELECT * FROM Authors", dbConn, 3, 3
Do While Not rs.EOF
%>
<option value="<%=rs("au_id")%>">
<%=rs("au_lname") & ", " & rs("au_fname")%>
</option>
<%
rs.MoveNext
Loop
%>
</select>
Acest exemplu are nevoie de 19 linii de cod doar pentru a asa un control
HTML simplu. Dar ceea ce este mai grav e modul n care stilul de codicare
diminueaza performantele aplicatiei deoarece amesteca codul HTML cu cod
Visual Basic. Cand pagina este procesata de catre ASP ISAPI (Internet
Server Application Programming Interface), motorul de scripting de pe server
trebuie sa se activeze si sa se dezactiveze de mai multe ori pentru a gestiona
chiar si o singura cerere. Acest lucru creste cantitatea de timp necesara
pentru a procesa ntreaga pagina si a o trimite la client. Mai mult, paginile
web scrise n acest stil pot atinge foarte usor dimensiuni dicil de stapanit.
Daca se mai adauga si propriile componente COM (necesare pentru a furniza
functionalitatea pe care ASP nu o poate asigura) cosmarul managementului
codului creste.
Indiferent ce abordare se foloseste, codul devine ncurcat, lung si greu de
depanat. In ASP.NET, aceste probleme nu exista. Paginile de web sunt scrise
folosind conceptele programarii orientate pe obiecte traditionale. Paginile de
web ASP.NET contin controalele care pot programate n mod similar cu
aplicatiile desktop. Aceasta nseamna ca nu mai este nevoie de combinarea
unui set de marcaje HTML si cod inline. Daca se opteaza pentru abordarea
code behind atunci cand se creaza paginile ASP.NET, atunci codul si marcajul sunt de fapt plasate n doua siere diferite, ceea ce simplica ntretinerea
TI
2.1. GENERALITA
29
2.1.2
Ce aduce ASP.NET?
30
CAPITOLUL 2. ASP.NET
modul de programare este orientat pe obiecte; orice pagina este vazuta
ca un obiect, derivat din clasa pusa la dispozitie de .NET Framework;
are un mecanism ncorporat care permite pastrarea starii paginii (chiar
daca protocolul de comunicare HTTP este fara stare);
ASP.NET permite dezoltarea de aplicatii web bazate pe evenimente,
similar cu situatia ntalnita n cadrul aplicatiilor de tip forme Windows;
este senzitiv la browserul pentru care se face trimiterea codului HTML,
alegand automat codul optimizat pentru o colectie de browsere;
ASP.NET este gazduit de catre CLR; aceasta aduce benecii notabile
precum: managementul automat al memoriei prin garbage collection;
tipuri de date sigure, vericabile; manipularea structurata a erorilor;
re de executie - pentru ecare cerere facuta de catre un client, se
lanseaza un r de executie separat;
usor de distribuit2 si congurat.
2.2
2.3
31
32
CAPITOLUL 2. ASP.NET
global.asax sier global al aplicatiei; se foloseste pentru a implementa
cod de reactie la evenimente ale aplicatiei, precum pornirea sau oprirea
ei;
siere cu extensia cs (daca este vorba de o aplicatie ASP.NET cu
C#), este partea de codebehind care prelucreaza pe server evenimentele survenite pe partea de browser si ciclul de viata al paginilor.
Se obtine astfel separarea partii de interfata utilizator de cea de cod
executat pe server;
siere cu extensia ashx HTTP handlers, pentru returnarea de continut
care sa nu e pagina web;
siere cu extensia axd folosite pentru urmarirea aplicatiei (tracing);
siere cu extensia master pentru master pages;
siere cu extensia resx pentru internationalizarea si localizarea aplicatiilor
ASP.NET;
siere cu extensia sitemap pentru crearea structurii site-ului;
siere cu extensia skin pentru crearea de teme (skinuri).
2.4
Modelul de cod
33
Acest ultim cod este executat pe server (deci browserul nu trebuie sa aibe
niciun tip de suport pentru executarea de cod .NET); relativ la locatia n
care se poate depune acest cod, avem posibilitatile:
1. cod inline, adica scris n interiorul paginii aspx; utilizat pentru pagini
web simple;
2. cod n spate 3 , ntr-un document separat cu extensia cs (daca este cod
C#). Este modelul preferat pentru dezvoltarea de pagini.
Alegerea ntre aceste doua modalitati este posibila la crearea unei noi pagini
web, prin checkbox-ul Place code in separate file.
Pentru primul caz, codul paginii aspx este:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
34
28
CAPITOLUL 2. ASP.NET
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using
using
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
System.Web;
System.Web.UI;
System.Web.UI.WebControls;
35
15
16
17
18
19
Codul dat a fost preluat din locatia n care modulul de ASP.NET si depoziteaza aceste fisiere, %systemroot%\Microsoft.NET\Framework\v2.0.50727\Temporary
ASP.NET files\[nume aplicatie]. Fisierul din care s-a luat declaratia este o clasa partiala,
care completeaza clasa DemoCodeBehind.
36
CAPITOLUL 2. ASP.NET
myButton.Click += myButton_Click;
Se remarca de asemenea si metoda Page_Load care este mostenita din
clasa de baza System.Web.UI.Page. Apelul automat al metodei face parte
din ciclul de viata al unei pagini, subiect tratat ulterior.
2.5
2.6
37
Forme Web
O foma web (denumirea consacrata sub care sunt cunoscute paginile web
aspx) reprezinta partea centrala a unei aplicatii ASP.NET. Exista doua parti
ale unei astfel de forme web:
partea care se aseaza pe client cod HTML, rezultat prin executarea
codului ASP.NET
partea care se aa pe server, adica pagina aspx, clasa de code behind
si cod .NET apelat de catre programator
Evident, trebuie sa existe o comunicare ntre aceste doua parti. Spre exemplu, daca este vorba de o pagina care permite unui utilizator sa si faca
cont, datele specicate n pagina web sunt trimise prin formular (a se vedea 1.3) napoi catre server; acesta este numit n jargon postback; serverul
receptioneaza acest formular si poate sa execute o secventa de pasi: validarea datelor din formular, crearea contului. Pagina apelata va formula un
raspuns (cod HTML) pe care l va trimite browserului. Dupa aceasta, ciclul
se poate relua. Trimiterea formularului ete un mecanism de baza specicat
de protocolul HTTP; ASP.NET nu aduce nimic nou aici.
Unul din mecansimele esentiale pentru o usoara dezvoltare a unui formular este pastrarea starii. Desi foloseste mecanism clasic (campuri ascunse), modul transparent n care este integrat n framework duce la reducerea substantiala a codului. In lipsa acestui mecansim, n Java sau PHP
trebuie facuta o implementare manuala.
2.6.1
Postback
38
CAPITOLUL 2. ASP.NET
2. O data pagina trimisa catre browser, este randul utilizatorului sa produca actiunea de trimitere napoi a paginii, de exemplu prin apasarea
unui buton de tip Submit.
3. Formularul din pagina este trimis napoi la server, catre pagina default.aspx (acesta este comportamentul implicit pentru ASP.NET, dar se
poate modica). Motorul ASP.NET primeste iarasi cerere si recreeaza
pagina (deoarece pagina anterioara, de la pasul 1 a fost dealocata) de
pe server; aceasta refacere va restabili totusi valorile controalelor la
starea anterioara, prin mecansimul de viewstate sectiunea 2.6.2.
4. ASP.NET determina care a fost actiunea care a determinat trimiterea
napoi si executa event handlerele asociate (metoda myButton_Click,
de exemplu). Un asemenea event handler executa o operatie de modicare a continutului formei web (myLabel.Text=...), eventual apeland
la cod pentru extragere de date de pe un server de baze de date, etc.
5. Pagina default.aspx cu continutul astfel modicat este transformata
n cod HTML si trimisa serverului. Obiectele folosite pentru crearea
acestui raspuns sunt disponibilizate. Ciclul se reia de la pasul 2.
Postback-ul poate declansat si de o alta actiune decat apasarea unui buton de tip submit; de exemplu, la adaugarea de control web de tip dropdown
list, se poate specica n Visual Studio, prin proprietatea de tip boolean
AutoPostback daca modicarea itemului curent selectat duce la trimiterea
automata a formularului catre server. Acest mecanism este util pentru cazul
n care exista un dropdown list cu judete; alegerea unui anumit judet necesita
modicarea unui alt dropdown list care contine localitatile din judetul curent
selectat. Efectul se obtine prin cod JavaScript care actioneaza pe client, cod
este injectat automat de catre frameworkul ASP.NET, sub forma:
1
2
3
4
5
6
7
8
9
10
11
<script type="text/javascript">
//<![CDATA[
var theForm = document.forms[form1];
if (!theForm) {
theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
39
}
}
//]]>
</script>
<select name="DropDownList2"
onchange="javascript:setTimeout
(__doPostBack(\DropDownList2\,\\), 0)"
id="DropDownList2">
In alte cadre de lucru pentru crearea de pagini web dinamice (Java, ASP,
PHP) un astfel de cod cade n sarcina programatorului. Trebuie nsa zis ca
postback-ul este disponbil doar pentru controale web.
Pentru a determina pe parte de code behind daca cererea e postback sau
nu, se poate folosi proprietatea de tip boolean Page.IsPostBack; aceasta
are valoarea true daca este un postback, false altfel. Mecanismul este util
pentru ca de regula la postback se face umplerea controalelor cu valori dintro sursa de date, n timp ce la postback acest lucru (de regula costisitor) se
poate evita daca se foloseste mecanismul de viewstate.
2.6.2
Mentinerea st
arii prin Viewstate
40
CAPITOLUL 2. ASP.NET
41
2.6.3
42
CAPITOLUL 2. ASP.NET
<div>
<asp:Label ID="Lable1" runat="server" Text="Nume">
</asp:Label>
<asp:TextBox ID="txtName" runat="server">
</asp:TextBox>
<br />
<asp:CheckBox ID="chkApples" runat="server"
Text="Vreau mere" />
<br />
<asp:CheckBox ID="chkPears" runat="server"
Text="Vreau pere" />
<br />
<asp:Button ID="btnSend" runat="server"
onclick="btnSend_Click"
Text="Trimite" />
</div>
</form>
</body>
</html>
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
La trimiterea conform selectiei din gura 2.4, query string-ul arata astfel
(fragment, am omis viewstate-ul si alte campuri ascunse):
txtName=Rafael&chkApples=on&btnSend=Trimite
1
2
5
43
Este nsa mai natural a se interpreta cele doua casute de checkbox ca niste
componente care au o proprietate, Checked, de tip boolean; de asemenea,
casuta de text poate sa e accesata foarte usor:
1
2
3
4
5
1
2
3
4
5
1
2
3
4
2.6.4
Ciclul de viat
a al unei pagini (variant
a sumar
a)
44
CAPITOLUL 2. ASP.NET
Initializarea paginii
La acest pas se creeaza pagina ASP.NET (se instantiaza atat clasa corespunzatoare portiunii de codebehind, cat si cea corespunzatoare paginii
aspx); controalele sunt instantiate. Daca pagina nu este prima data ceruta de
catre acest browser (adica daca este un postback), atunci se face restaurarea
starii din viewstate. Aici se apeleaza de catre framework metoda Page.Init.
Initializarea codului utilizator
Este apelata metoda Page.Load (de regula ea este scrisa Page_Load n
code behind). Aici de regula se scrie cod care face ncarcarea datelor n
pagina.
Valid
arile
Uneori se cere ca valorile furnizate de catre utilizator n browser sa satisfaca anumite cerinte. Procesul de validare (care se poate efectua si de catre
codul JavaScript de pe client, dar nu obligatoriu) trebuie sa e ndeplinit pentru a se asigura ca valorile cu care urmeaza sa se lucreze au relevanta. In caz
contrar, pagina se poate retrimite pentru comletarea adecvata a intrarilor.
Procesarea de evenimente
Sunt executate metodele care functioneaza pe post de event handler-i.
Sunt doua feluri de procesaei:
raspuns imediat, daca este vorba de apasare de buton sau postback
automat
rspuns de tip schimbare: daca sa stabilit un event handler pentru un
anumit control, dar nu s-a precizat AutoPostback=true, si n plus se
detecteaza (prin comparatie cu valorile din viewstate) ca a aparut o
schimbare n starea controlului, atunci se exectua acest event handler.
Procesarea evenimentelor de tip schimbare se face nainte de procesarea evenimentelor de tip raspuns imediat.
Legare automat
a la date
Fenomenul se va detalia ntrun capitol ulterior. Este vorba de controale care se leaga la surse de date. Acestea si pot remprospata automat
continutul, dupa ce eventualele modicari / adaugari / stergeri de date.
45
Disponibilizarea resurselor
Se genereaza pagina HTML car eva trimisa catre browser. Obiectele
instantiate pentru aceasta cerere devin neutilizabile.
46
CAPITOLUL 2. ASP.NET
Capitolul 3
Forme Web, gestiunea st
arii
3.1
3.1.1
3.1.2
Request
CAPITOLUL 3. FORME WEB, GESTIUNEA STARII
48
3.1.3
Response
3.1.4
Server
Obiectul Server, de tip System.Web.HttpServerUtility da acces la metode auxiliare pentru procesarea de cereri web. Deosebit de utile sunt metodele HtmlEncode si duala ei HtmlDecode. Daca codul ASP.NET posteaza
continut de tip sir de caractere n pagina, este obligatoriu a se face codicarea
lor conform canoanelor HTML, altfel caractere precum < sau > pot produce
ravagii n pagina; ele trebuie codicate ca ind < respectiv >.
Similar, substituirea corecta a caracterelor n adree, se folosesc metodele
UrlEncode si UrlDecode. Pentru determinarea caii zice corespunzatoare
49
3.2
Exista doua tipuri majore de controale, asa cum s-a specicat si n 2.5:
controale server HTML si controale server Web. Acestea din urma cunosc
specializarile: controale bogate, de validare, de date, de navigare, de login,
parti Web, pentru ASP.NET AJAX si de tip ASP.NET mobil.
Toate controalele de tip server au ca principala trasatura faptul ca se pot
procesa ca obiecte pe server, avand deci un tip de date reprezentat pe platforma .NET. Clasa de baza pentru orice control este clasa System.Web.UI.Control,
care e derivata de clasa System.Web.UI.WebControls.WebControl, reprezentand baza pentru controalele de tip server si System.Web.UI.HtmlControls.HtmlControls,
baza pentru controalele server HTML. Clasa Control contine si transmite
derivatilor proprietatile si metodele:
ClientID proprietate ce returneaza identicatorul ecarui control din
pagina HTML; acesta va putea utilizat n JavaScript, prin functia
document.getElementById();
Controls proprietate care returneaza o colectie de controale copil ale
obiectului curent. De exemplu, un control declarat cu asp:TextBox
este copil al formularului;
EnableViewState returneaza sau seteaza o valoare logica specicand
daca ultima stare setata pentru un control va sau nu salvata n
ViewState (proprietate a paginii, care va transformata n campul
ascuns __VIEWSTATE).
ID este identicatoru controlului, adica numele de variabila cu care
se poate acces n code behind controlul respectiv;
Page obiectul pagina care contine controlul curent;
Parent controlul n care este copil controlul curent;
Visible proprietate cu valoare logica, specicand daca controlul este
vizibil sau nu;
DataBind() se face popularea controlului la surse de date;
CAPITOLUL 3. FORME WEB, GESTIUNEA STARII
50
3.2.1
Sunt din trei categorii mari: controale de tip input (e.g. butoane, checkbox, casute de text etc), controale de tip container (formular, tabel, textarea
etc) si grupul format din HtmlImage, HtmlLink, HtmlTitle. Clasa de baza
este HtmlControl, iar proprietatile expuse sunt:
Attributes proprietate care permite accesarea sau adaugarea de atribute;
Disabled returneaza sau seteaza starea de inhibare a controlului;
daca are valoarea true, va asat pe pagina, dar cu culoare gri deschis;
Style permite accesarea sai modicarea stilurilor CSS pentru controlul curent;
TagName returneaza numele controlului.
Un control de tip HtmlContainerControl reprezinta un control HTML
care are atat eticheta de deschidere, cat si de nchidere, cum ar a sau img.
Pe langa cele mostenite din HtmlControl, mai avem proprietatile:
InnerHtml returneaza sau seteaza textul HTML dintre etichetele de
deschidere si nchidere. Toate caracterele sunt lasate asau cum se dau;
facilitatea este folosita de regula pentru includerea de continut HTML;
InnerText ca mai sus, cu deosebirea ca textul setat sufera modicarea
caracterelor care au semnicatie HTML predenita (<, >, ghilimele etc)
sunt nlocuite cu codicari corespunatoare (<, >, " etc).
Clasa HtmlInputControl este folosita ca baza pentru controalele care permit interactiunea cu utilizatorul, cum ar <input type="text">, <input
type="submit">. Fata de cele mostenite din HtmlInputControl, se mai pun
la dispozitie proprietatile:
51
1
2
3
4
5
6
7
8
9
1
2
3
CAPITOLUL 3. FORME WEB, GESTIUNEA STARII
52
1
2
1
2
1
2
3
4
IN ASP.NET
3.3. GESTIUNEA STARII
3.2.2
53
<script type="text/javascript">
<!-WebForm_AutoFocus(myTextbox);// -->
</script>
unde functia JavaScript WebForm_AutoFocus provine dintr-un sier de resurse pus la dispozitie de catre ASP.NET, numit WebResource.axd.
Daca pe un formular sunt dispuse mai multe butoane, este posibila specicarea unui buton ca ind implicit adica apasarea lui tastei Enter sa e
interpretata ca apasarea pe acest buton. Specicarea lui se face prin intermediul formularului, care prin atributul DefaultButton poate specica ID-ul
butonului care va considerat ca implicit. De asemenea, daca se folosesc
panouri (<asp:Panel>), acestea putand grupa mai multe butoane, se poate
specica la nivel de panou care e butonul implicit.
3.3
Gestiunea st
arii n ASP.NET
CAPITOLUL 3. FORME WEB, GESTIUNEA STARII
54
multe ori, nsa, este nevoie ca ntre doua cereri succesive o anumita informatie
sa e pastrata si recuperata dace este nevoie de ea. Exemplul clasic este cosul
de cumparaturi pe care l pune la dispozitie un site de tip comert electronic:
vizitatorul poate sa adauge din pagini diferite obiectele pe care le cumpara;
la orice moment, acest cos este disponbibil pentru a inspectat sau modicat
de acel cumparator.
Managementul starii n ASP.NET se poate face cu:
1. ViewState
2. Query String
3. Cookie-uri
4. Sesiunea (Session)
5. Application
6. Prolul
7. Caching
Vom prezenta doar primele cinci metode. O comparatie a lor se gaseste n
tabelele 3.1 si 3.2.
Tabela 3.1: Optiuni de management al starilor (1).
View State
Tipuri de date Tot ce e
permise
serializabil
Stocare
Un camp ascuns
n pagina
Durata de
Permanent retinut
viata
la postback-uri
Vizibilitate
Pagina curenta
Securitate
Usor de citit,
relativ greu de modif.
poate criptat
Nu afecteaza serverul
dar poate ngreuna
comunicatia
Performanta
Query String
Un numar limitat
de caractere
Adresa URL din
browser
se pierde cand se
introduce o noua
adresa
Pagin tinta
Cookie-uri utilizator
S iruri de caractere
Memoria (RAM/HDD)
a calc. clientului
Setat de programator
Vizibil n clar,
usor de modicat
Intreaga aplicatie
ASP.NET
Nesigur, poate
modicat de utiliz.
Buna, deoarece
datele sunt putine
IN ASP.NET
3.3. GESTIUNEA STARII
55
In toata aplicatia,
Vizibilitate
In toata aplicatia,
n cadrul unei sesiuni
global
Securitate
Sigur, deoarece datele nu
Foarte sigure, deoarece datele nu
sunt trimise la client
sunt trimise la client
Performanta
Sesiuni mari server lent Multe date server lent
Utilizare
Stocare de cumparaturi
Variabile globale
3.3.1
ViewState
Stocheaza datele n interiorul paginii curente, sub forma unui camp ascuns. La orice trimitere de formular cu atre server, acest camp este proiectat
napoi. Este de regula folosit pentru a stoca ultima valoare a unui control (si
se include aici si setare privind stilul controlului, nu doar continutul); poate
de asemenea mbogatit cu perechi de forma cheievaloare, care ulterior
pot modicate sau sterse.
1
2
3
4
5
6
7
ViewState["Counter"] = 1;
...
int counter;
if (ViewState["Counter"] != null)
{
counter = (int)ViewState["Counter"];
}
Cheia este de tip sir de caractere; se poate folosi drept valoare orice tip de
date serializabile (care are atributul [Serializable] denit atat pentru el
cat si pentru clasele din care este wderivat, direct sau nu).
Exemplu: clasa Customer denita de programator precum:
1
2
3
[Serializable]
public class Customer
{
CAPITOLUL 3. FORME WEB, GESTIUNEA STARII
56
4
5
6
7
8
9
10
11
IN ASP.NET
3.3. GESTIUNEA STARII
57
3.3.2
Query String
Din adresa http://www.google.ro/search?q=data+mining&lang=ro, query string-ul este partea de dupa semnul de ntrebare. Reprezentarea se face
sub forma variabila=valoare, iar mai multe astfel de perechi pot separate
prin caracterul &.
Exista urmatoarele limitari ale unui query string:
Informatia este limitata la siruri de caractere, care trebuie sa contine
caractere valide pentru un URL.
Informatia este vizibila pentru oricine;
Pot aparea modicari neanutate ale componentelor din QS; de exemplu,
n loc de lang se poate decide sa se foloseasca doar l.
lungimea maxima a acestui URL este limitata; a se revedea 1.3.
Un QS poate folosit din partea de code behind astfel:
CAPITOLUL 3. FORME WEB, GESTIUNEA STARII
58
1
Response.Redirect("newpage.aspx?recordID=" + recordID.ToString());
Trebuie permanent avut grija ca adresa astfel formata sa contina mereu caracterel valide pentru un URL, adica un set destul de redus. Acest lucru se
obtine prin apelul metodei Server.UrlEncode(detaliu).
3.3.3
3.3.4
Cookies
cookie.Expires = DateTime.Now.AddYears(1);
Redobandirea unui cookie se face prin:
1
2
3
4
5
6
IN ASP.NET
3.3. GESTIUNEA STARII
3.3.5
59
Sesiunea
Session["ProductsDataSet"] = dsProducts;
dsProducts = Session["ProductsDataSet"] as DataSet;
Sesiunea este pierduta ntruna din urmatoarele situatii:
utilizatorul nchide browserul; aceasta duce la pierderea cookie-ului care
contine indenticatorul de sesiune;
sesiunea expira; implicit, n ASP.NET dupa 20 de minute de la ultima
accesare dinspre clientul care a determinat crearea sesiunii, se dealoca
automat aceasta sesiune de catre server, pentru a nu irosi resursele; valoarea de timeout se poate specica n sierul de congurare web.cong;
daca programatorul apeleaza n code behind Session.Abandon().
Daca cineva urmaresste comunicatia pe retea, poate sa obtina acest cookie, si deci acces la sesiune. Pentru aceasta se poate folosi Secure Socket
Layer (SSL).
3.3.6
Application
Obiectul Application este unic pentru toata lumea, deci poate sa contina
niste valori care sunt de interes general: contoare de exemplu numarul de
60
Capitolul 4
Validatoare, manipulatoare de
HTTP, controale utilizator
4.1
4.1.1
Pasii de validare
4.1.2
Clasa BaseValidator
4.1. CONTROALE DE VALIDARE A INTRARII
63
4.1.3
Validatorul RequiredFieldValidator
4.1.4
Validatorul RangeValidator
Se foloseste pentru a verica daca o valoare specicata este intr-un interval specicat prin intermediul proprietatilor MinimumValue si MaximumValue;
tipul de date pentru care se face comparatie este specicat n proprietatea
Type. Se pot specica tipurile:
Currency
4.1. CONTROALE DE VALIDARE A INTRARII
65
Date
Double
Integer
String
1
2
3
4
5
6
4.1.5
Validatorul CompareValidator
1
2
3
4
5
6
7
8
4.1.6
Validatorul RegularExpressionValidator
1
2
3
4
5
6
7
4.1.7
Controlul CustomValidator
1
2
1
4.1. CONTROALE DE VALIDARE A INTRARII
67
3
4
5
}
</script>
iar pe partea de code-behind:
1
2
3
4
5
6
7
8
9
10
11
12
4.1.8
Controlul ValidationSummary
4.1.9
Grupuri de validare
4.2
Manipulatoare HTTP
using System;
using System.Web;
namespace TestHTTPHandler
{
public class SimpleHandler : IHttpHandler
{
public void ProcessRequest(System.Web.HttpContext context)
{
HttpResponse response = context.Response;
response.Write("<html><body><h1>Rendered by the SimpleHandler");
response.Write("</h1></body></html>") ;
}
public bool IsReusable
{
get {return true;}
69
}
}
}
In sierul web.cong, n sectiunea httpHandlers se adauga intrarea:
1
2
3
4
5
6
using
using
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
System.Web;
System.IO;
System.Web.Services;
namespace AlbumFoto
{
/// <summary>
/// loads an image from the disk
/// </summary>
[WebService(Namespace = "http://cs.unitbv.ro/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class ImageLoader : IHttpHandler
{
/// <summary>
/// Enables processing of HTTP Web requests by a custom
/// HttpHandler that implements the
/// <see cref="T:System.Web.IHttpHandler"/> interface.
/// </summary>
/// <param name="context">An
/// <see cref="T:System.Web.HttpContext"/>
/// object that provides references to the intrinsic
/// server objects
/// (for example, Request, Response, Session, and Server)
/// used to service HTTP requests.</param>
public void ProcessRequest(HttpContext context)
{
string fileFullPath = context.Request.QueryString["fp"];
if (String.IsNullOrEmpty(fileFullPath))
{
return;
}
int posLasDot = fileFullPath.LastIndexOf(".");
string fileType = fileFullPath.Substring(posLasDot + 1)
.ToLower().Trim();
if (fileType == "jpg")
{
fileType = "jpeg";
}
context.Response.ContentType = "image/" + fileType;
BinaryReader br = new BinaryReader(
File.OpenRead(fileFullPath));
int bufferLength = 1024;
71
byte[] buffer;
while ((buffer = br.ReadBytes(bufferLength)).Length > 0)
{
context.Response.OutputStream.Write(
buffer, 0, buffer.Length);
}
br.Close();
}
public bool IsReusable
{
get
{
return true;
}
}
}
}
4.3
Controale utilizator
Va urma...
Capitolul 5
Teme, pagini master, navigare
Temele permit specicarea de detalii vizuale pentru paginile web. Se
permite astfel completarea facilitatilor CSS. Pentru un site se pot deni mai
multe teme, care se pot aplica individual, pentru ecare utilizator in parte.
5.1
1
2
3
4
5
73
74
.heading1
{
font-weight: bold;
font-size: large;
color: lime;
font-family: Verdana, Arial, Sans-Serif;
}
O foaie de stiluri un sier CSS poate specica un set de reguli, care
sunt invocate n pagina HTML prin intermediul unui link din cadrul elementului head:
1
2
5.2
Teme
Stilurile CSS se pot aplica usor elementelor de tip HTML sau controalelor,
dar ele vin cu un continut x, specic HTML-ului: dimensiunea fontului,
culoarea fundalului etc. Se pune ntrebarea: cum anume se poate aplica ideea
de stil si pentru proprietatile unui control ASP.NET? avand n vedere ca un
asemenea control poate veni cu proprietati al caror nume nu se regaseste n
ceea ce pune la dispozitie CSSul, avem nevoie de o modalitate de a completa
facilitatile acestuia din urma. Spre exemplu ne propunem sa setam stilul unui
control de tip Calendar; avand n vedere ca acest control este particularizat
prin proprietati specice claselor ASP.NET, vrem sa completam facilitatile
CSSului.
Diferentele ntre stilurile CSS si temele ASP.NET sunt:
1. Temele sunt asociate controalelor, nu CSS-uluil; dar temele preiau ideea
de baza a CSS-ului, denirea de stil si reutilizarea lui pentru obtinerea
unui layout unitar;
2. Temele sunt aplicate de catre server; sierul CSS mentionat pentru o
pagina HTML este descarcat de catre browser si interpretat tot de catre
el;
5.2. TEME
75
1
2
3
1
2
3
4
76
77
1
2
3
4
5
Daca o pagina are specicata tema, atunci aceasta din urma specicare are
prioritate fata de ceea ce apare n sierul web.cong.
Dupa cum sa aratat mai sus, temele pot aplicate dinamic, prin interventie
din code behind:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
unde depunerea n sesiune sar face prin alegerea dintr-o lista de optiuni (un
control de tip DropdownList).
5.3
Pagini master
Pentru crearea unei structuri unitare a unui site, se pot folosi variantele:
controale utilizator; pot utilizate pentru a implementa principiul
dont repeat yourself, dar nimeni nu poate sa sa garanteze ca acest
continut, chiar daca e identic, este si dispus identic;
78
O pagina master permite crearea unui sablon care va aplicat peste niste
pagini de tip continut. Utilizarea unei pagini master pentru tot site-ul
determina o aparitie consistenta a acestor pagini. Folosind pagini master,
sa raspuns urmatoarelor probleme:
se deneste o singura data o portiune de pagina care poate reutilizata
ori de cate ori se doreste
se denesc regiunile editabile, adica acele zone n care o pagina ce
foloseste sablonul are voie sa adauge continut;
suport din partea unei unelte precum Visual Studio
se permite particularizarea unor aspecte din pagina master, din pagini
de continut
O pagina master este un sier cu extensia master. Foloseste un model
de declarare similar cu cel al paginilor aspx, adica pagina pe care se pot
depune controale si parte de code-behind. Adaugarea unei pagini master se
face asemanator cu adaugarea unei pagini obisnuite de tip aspx. Rezultatul
va :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
79
<div>
<asp:ContentPlaceHolder ID="ContentPlaceHolder1"
runat="server">
</asp:ContentPlaceHolder>
</div>
</form>
</body>
</html>
1
2
3
4
5
6
7
80
8
9
.leftPanel
{
position: absolute;
top: 70px;
left: 10px;
width: 150px;
}
.rightPanel
{
position: absolute;
top: 70px;
right: 10px;
width: 150px;
}
.centerPanel
{
margin-left: 151px;
margin-right: 151px;
padding-left: 12px;
padding-right: 12px;
}
<div class="leftPanel">...</div>
<div class="centerPanel">
<asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</div>
<div class="rightPanel">...</div>
O porblema care poate aparea este calea relativa catre diferite resurse
(imagini, siere cod JavaScript) invocata n master page. De exemplu, daca
81
82
page, apoi Page.Load din content page; astfel se asigura faptul ca codul din
pagina continut are ultimul cuvant.
Exista situatii n care din pagina de continut se doreste accesarea paginii
master, de exemplu penqtru a accede la ceva publicat de catre pagina master:
1
2
3
4
5
1
2
3
4
5
6
1
2
3
4
5
5.4. NAVIGARE
5.4
Navigare
Va urma...
83
84
Capitolul 6
Legarea la date
Legarea la date1 reprezinta capacitatea unui control ASP.NET de a-si
prelua continutul din diverse surse: baze de date clasice, proprietati, metode,
servicii web etc. Dupa ce continutul este preluat, e asat conform specicului
controlului.
Un rol la fel de important l au sursele de date, controale prin intermediul
carora se determina care este provenienta datelor; ele actioneaza ca o punte
de legatura ntre datele asate si controalele ASP.NET; suplimentar, mai
permit si specicarea modului de manipulare a lor: datele se sterg, se adauga,
se modica. Este remarcabila exibilitatea de utilizare a lor, permitand
specicarea legaturii ntre controale si date e exclusiv declarativ (fara sau
cu foarte putin cod pe parte de codebehind), e prin cod, daca se doreste
personalizare.
Modul n care functioneaza acest mecanism este declarativ, folosind cod
scris n pagina aspx, acolo unde se precizeaza care e controlul de asare. Se
separa partea de codebehind de cea de specicare a sursei de date.
Exista doua feluri de legari de date: pentru date simple (unice) si pentru
date multiple. In primul caz este vorba de controale de tip eticheta, buton,
LinkButton, Image pentru care se poate specica o singura valoare care va
folosita. Se folosesc aici expresiile de legare.
Alte controale suporta asarea de mai multe valori sau legarea cu valori
repetate. De exemplu, putem avea o lista de butoane radio, un tabel, sau
combobox-uri. Toate acestea expun o proprietate DataSource, care accepta
un obiect de sursa de date. Cand se specica valoare pentru aceasta proprietate (e declarativ, adica n pagina aspx, e prin codebehind), se creeaza
o legatura de la controlul de asare la datele ce urmeaza a prezentate; mai
trebuie apelata doar metoda DataBind() la nivel de control sau de pagina
1
85
86
6.1
Pentru controalele care suporta legarea la date simple adica date care
au o singura valoare si nu o multime de valori se foloseste o expresie de
legare. Expresia apare n partea de cod aspx; este delimitata de portiunile
<%# si %>:
<%# expresie %>
1
2
3
4
GetUserName() %>
1 + (2 * 20) %>
"John " + "Smith" %>
Request.Browser.Browser %>
87
<appSettings>
<add key="numeSetare" value="valoare din fisierul de configurare"/>
</appSettings>
Un exemplu de utilizare este:
88
<asp:SqlDataSource
ConnectionString="<%$ ConnectionStrings:Northwind %>" ... />
6.2
Sunt cazuri n care un control este conceput nu pentru asarea unei date
simple, ci a unei ntregi colectii; colectia poate sa e un vector de elemente,
set de nregistrari din baza de date etc. Controalele care pot asa colectii de
elemente sunt:
HtmlSelect, ListBox, DropDownList
CheckBoxList si RadioButtonList
BulletedList care creeaza o lista cu buline sau numerotata
Fiecare va asa o singura valoare care provine dintr-o proprietate a unui
element ce se aseaza. Proprietatile care se specica la nivelul controalor de
asare sunt:
DataSource se refera la un obiect de date care contine o colectie de
date ce se vor asate;
DataSourceID reprezinta identicatorul unui control de tip sursa de
date; se specica e valoare pentru ea, e pentru DataSource;
DataTextField reprezinta numele proprietatii din ecare element care
se vrea a asat, ce va aparea vizibil n pagina HTML;
DataTextFormatString specica modul de formatare pentru ceea ce
se va asa;
DataValueField - reprezinta un nume de proprietate, a carui valoare
se evalueaza pentru ecare element care va asat; deosebirea fata
de DataTextField este ca valoarea nu se afseaza n browser, ci este
transmisa prin formular; de regula, reprezinta o cheie de identicare a
ecarui element.
89
90
12
13
Page.DataBind();
Determinarea pe partea de code-behind a elementelor selectate din controale se face folosind proprietatea SelectedIndex pentru ecare control n
parte.
Legarea la date multiple poate avea ca sursa orice tip de date care implementeaza interfata ICollection, exemplele notabile ind: colectii ArrayList,
Hashtable, Collection si clase din ADO.NET DataReader sau DataView.
6.3
Pe langa listele pomenite mai exista posibilitatea de a folosi niste controale de date de tip tabelar, anume introduse pentru asarea de date. Ele
permit asarea mai multor proprietati din ecare element, de exemplu lista
tuturor valorilor campurilor dintro nregistrare. Controalele sunt:
GridView: folosite pentru a arata tabele mari cu date; permit paginare,
selectare, editare, stergere de date;
DetailsView: arata un singur element la un moment dat, ntr-o tabela
cu o linie pentru ecare camp asat; permite editarea
FormView: ca precedentul, dar permite denirea unor sabloane ce ofera
mai multa exibilitate
Pentru un GridView, o declaratie sucient de buna este:
1
91
iar legarea de date se face prin specicarea unei valori adecvate pentru proprietatea DataSource, ce se leaga la un obiect de tip DataReader sau de tip
DataTable.
Legarea la un obiect DataReader duce la un consum mic de memorie, dar
este inecienta pentru multe scenarii, deoarece nu permite ltrare pe serverul
de aplicatii, sau sortare. De asemenea, nu poate folosit pentru legare la mai
multe controale, simultan. Se poate folosi un set de date deconectat (clasa
DataSet), care n plus are si avantajul de a agnostica relativ la tipul de
server de date folosit.
Aceste aspecte vor prezentate ntrun curs urmator.
6.4
6.5
Ciclul de viata
al unei pagini Web
92
6.6
93
6.6.1
Selectarea de nregistr
ari
Pentru un control SqlDataSource trebuie sa se specice care este comanda ce aduce elementele selectate. Suplimentar, se pot seta comenzi
de stergere, modicare, inserare. Proprietatile se numesc: SelectCommand,
InsertCommand, UpdateCommand, DeleteCommand, toate de tip string. Valorile lor pot fraze SQL sau denumiri de proceduri stocate aate pe server.
Crearea unui control care aduce setul tuturor angajatilor - a se arata la
curs;
De aratat:
crearea de comenzi parametrizate de tip select; alegerea valorii se face
dintr-un dropdownlist
ca mai sus, cu alegerea din QueryString (2 pagini aspx); varianta: la
Selecting se seteaza valoarea parametrului din clauza where;
update pe gridview; atentie la numele de parametri;
optimistic lock;
stergere pentru tabela; de precizat rolul proprietatii DataKeyNames
pentru gridview; de procesat exceptie, de aratat pe o tabela nelegata
de altele;
inserare folosind DetailsView
94
6.6.2
Desi usor de utilizat, exista cateva probleme care fac folosirea lui SqlDataSource
neinspirata pentru proiecte de anvergura mare:
1. logica de acces la date este continuta n pagina ASP.NET; este greu
de facut calibrare pentru aceste interogari, proling-ul e greu de implementat;
2. mentenanta dicila: ecare pagina care foloseste legarea la date ar
trebui sa aibe propriul set de date; reutilizarea este inexistenta; daca
trebuie modicata o interogare scrisa ca si cod SQL direct n pagina,
atunci trebuie schimbat peste tot la fel; problema are o mbunatatire
usoara (dar nu totala) prin folosirea de proceduri stocate, care duc nsa
la o alta problema - scrierea logicii de business n codul SQL;
3. lipsa de exibilitate - ecare control care se populeaza ar avea nevoie
de propriul control de date; daca pentru o pagina se prevad mai multe
variante de asare a datelor, atunci pagina se va umple rapiud de controale de date;
4. daca se iese din scenariul interogare/update-delete-insert pe aceeasi
baza de date, codul devine incurcat si greu de mentinut; o biblioteca
de implementare a logicii aplicatiei sau chiar si numai de acces la date
simplica enorm codul.
6.7
95
96
Capitolul 7
Controale de lucru cu datele
7.1
Controlul GridView
Pasi:
1. denirea coloanelor; tipuri de coloane:
(a) BoundField
(b) ButtonField
(c) CheckBoxField
(d) CommandField
(e) HyperLinkField
(f) ImageField
(g) TemplateField
2. ascunderea, schimbarea ordinii coloanelor - declarativ si din code-behind
3. proprietati: DataField, DataFormatString, HeaderText, FooterText,
HeaderImageUrl, ReadOnly, InsertVisible, Visible, SortExpression, HtmlEncode, NullDisplayText, ConvertEmptyStringToNull
7.1.1
Formatare
Exemplu: {0:C} - parametrul este formatat sub forma de valoare monetara, in functie de setarile serverului web sau de partea de globalizare;
{0:MM/dd/yy} - Month, day, year.
97
98
7.1.2
Stiluri
7.1.3
7.1.4
Sortare
7.1.5
99
Paginare
7.1.6
Template-uri
Demo:
adaugare de campuri template; creare de coloana cu valoare compusa:
TemplateCampCompus.aspx
template-uri de editare - se pot adauga validatoare; se pot alege campurile care se editeaza; se poate modica modul in care arata controlul de
editare - e.g. control dropdown; demo: EditTemplate1.aspx; data binding bidirectional = metoda Bind(); folosire de dropdownlist pentru
TitleOfCourtesy = EditTemplate2.aspx;
7.2
100
Capitolul 8
JavaScript si Ajax
Factorul esential ce faciliteaza comunicarea dintre client (browser) si server (codul ASP.NET) este trimiterea formularului dispre browser catre server, de regula catre aceeasi pagina postback. Evident, acest postback este
dependent de existenta unui cod de reactie pe server, cod care sa produca o
modicare a starii paginii.
Exista nsa destule situatii n care reactia poate avea loc doar pe client,
fara a nevoie sa se faca trimiterea formularului catre server. Se scuteste astfel o deplasare catre si dinspre server, ceea ce creeaza impresia unei interfete
utilizator care raspunde rapid clientului. De exemplu, expandarea elementelor dintr-un meniu sau expandarea nodurilor dintr-un arbore, sau ascunderea
unor elemente de pe ecran (tabele, randuri, imagini) se poate efectua de regula doar cu resurse locale se actioneaza asupra portiuni din pagina. Toate
aceste efecte sunt obtinute prin utilizarea codului JavaScript care este executat de catre browserul clientului.
Cursul prezinta tehnici de integrare a codului JavaScript cu ASP.NET.
8.1
Elemente de baz
a JavaScript
101
102
<form>
<input id="myText" type="text"
onmouseover="window.alert(mouse over);"/>
<input type="button"
onclick="window.confirm(esti sigur(a)?);"); />
</form>
In cazul n care este vorba de un buton denit ca Web server control,
numele onclick este deja utilizat pentru a face corespondenta cu metoda din
code-behind care face procesarea evenimentului pe server; ca atare, numele
de eveniment de pe client se deneste folosesind OnClientClick. Tratarea
evenimentelor poate specicata si din code-behind, folosind proprietatea
Attributes; de exemplu:
103
8.2
Blocuri de script
<script type="text/javascript">
<!-var i = 7;
window.alert(Mesaj afisat cand browserul ajunge
cu incarcarea in acest loc);
//-->
</script>
Comentariile sunt necesare pentru browserele care nu inteleg codul JavaScript,
iar comentariul // era util pentru cazul in care se folosea anumite versiuni de
Netscape. Cele mai multe browsere actuale nteleg codul JavaScript, chiar
daca unele sunt setate sa nu l execute.
Dupa cum da de nteles codul de mai sus, se declara o variabila numita i
careia i se da valoarea 7; ea va vizibila n ntreaga pagina. Apoi browserul
executa instructiunea de asare a unei ferestre de mesaj. Comportamentul
este util pentru cazul n care la o anumita portiune din pagina html este
nevoie sa se execute un anumit cod.
104
<script type="text/javascript">
function showMessage(message){
window.alert(message);
}
</script>
Un loc des folosit pentru scrierea de functii este sectiunea <head> a paginii
web, ceea ce permite o regasire mai usoara. Apelarea functiei denite anterior
este posibila prin:
1
2
3
8.3
105
Schimbarea continutului paginii se face prin identicarea elementului/elementelor de pagina ce trebuie schimbat/schimbate; n cazul unui element al
carui id se cunoaste, ind specicat ca valoare a atributului id, identicarea
se face prin intermediul metodei document.getElementById():
1
8.4
106
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Accentul cade pe ultimul camp de pe ecare linie, care este n prima faza o
referinta catre o imagine neutra, aata n aplicatia web, iar cand se termina
de ncarcat (lucru de altminteri rapid), se face apel de functie JavaScript care
va cere ncarcarea imaginii aferente ecarui ISBN. Aceasta a doua ncarcare
poate lenta, motivul pentru care se foloseste mecanismul prezentat.
Functia GetBookImage este:
1
2
3
4
5
6
7
8
9
10
A PAGINILOR107
8.4. UTILIZARE DE JAVASCRIPT PENTRU INCARCARE
ASINCRONA
108
8.5
Uneori este mai exibil ca includerea de cod JavaScript sa se faca la rulare, daca se ndeplinesc anumite condtii. Pentru aceasta se poate folosi proprietatea Page.ClientScript care expune cateva metode pentru gestiunea
blocurilor de script. Metodele sunt:
1. RegisterClientScriptBlock() - scrie un bloc de script la nceputul
formularului web, chiar dupa <form runat="server">;
2. RegisterStartupScript() - scrie un bloc la sfarsitul formularului web,
chiar nainte de </form>.
Ca un argument al functiilor se specica un nume de script; acesta trebuie
sa e un string unic, rolul lui este de a se asigura ca nu se adauga acelasi
script de doua ori. De exemplu, pentru includerea repetata de controale care
folosesc JavaScript, mecanismul duce la inserarea doar a unui singur script.
De exemplu, codul de mai jos produce includerea unui script care aseaza
o fereastra de conrmare la trimiterea formularului - vezi si gura 8.4:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Mecanismul este util n situatia n care exista controale utilizator care folosesc
JavaScript.
O alta varianta este includerea unui bloc de script care face referinta catre
un sier JavaScript:
1
2
3
109
8.6
Unul din fenomenele la care este vulnerabila o pagina web este atasarea
de cod JavaScript de catre utilizator. De exemplu, n interiorul unui textbox
se poate scrie cod JavaScript, ceea ce duce la executarea lui pe client; sau
folosirea de elemente HTML n text poate duce la modicarea asarii n
pagina. Daca datele sunt preluate pur si simplu de la utilizator si introduse
n baza de date, la reasarea lor pentru un alt utilizator, executandse pe
client, pot afecta pe toti ceilalti utilizatori.
Aceste script-uri se pot trimite via elementele <script>, <object>, <applet>,
<embed>. O varianta simpla de rezovare este de a face codicarea caracterelor
folosind metoda Server.HtmlEncode.
Implicit, ASP.NET poate sa determine daca continutul unei casute de
text are potential de injectare de script. Pentru o pagina cu un textbox si
un buton ce produce postback - gura 8.5, comportamentul dictat de server
este cel dat n gura 8.6 - adica frameworkul ASP.NET depisteaza automat
introducerea de elemente HTML si reactioneaza prin respingere:
Se poate inhiba comportamentul de respingere al ASP.NET-ului, prin
specicarea proprietatii ValidateRequest din cadrul directivei Page, de la
nceputul paginii aspx:
1
110
111
<configuration>
<system.web>
<pages validateRequest="false" />
</system.web>
</configuration>
Pentru a preveni executarea de cod JavaScript pentru pagini care au specicata inhibarea validarii cererilor, se poate folosi metoda de codicare a stringurilor HTML data de Server.HtmlEncode sau de HttpUtility.HtmlEncode:
1
2
3
4
8.7
In cazul dezvoltarii de controale utilizator, este indicat ca produsul realizat sa poata folosit ca un modul n pagina, fara a nevoie sa se cunoasca
detaliile de implementare; implicit, toata partea de cod JavaScript necesara
functionarii controlului trebuie sa e ascunsa n control. Exemplicarea ce
urmeaza este preluata din [2].
Sa peresupunem ca se vrea crearea de ferestre popup pentru incarcarea
diferitelor mesaje (reclame sau ajutor contextual). Acest lucru se face prin
JavaScript, pe baza codului:
1
2
3
4
5
<script type="text/javascript">
window.open(http://www.apress.com, myWindow,
toolbar=0, height=500, width=800, resizable=1, scrollbars=1);
window.focus();
</script>
Metoda JavaScript Open primeste ca prim parametru adresa paginii care
trebuie deschisa, numele ferestrei care se deschide util daca se doreste reutilizarea ferestrei popup, pentru incarcarea de continut nou apoi un sir
de perechi de forma nume=valoare, specicand diferite aspecte vizuale ale
ferestrei de popup: dimensiuni, daca este sau nu redimensionabila, daca sa
112
arate sau nu barele de derulare, sau daca se aseaza n prim plan sau n
fundal.
Putem crea un control ascx care sa poata inclus n orice pagina; aspectele vizuale pot setate prin proprietati. Controlul va putea utilizat
ntro pagina web precum cele uzuale - etichete, casute de text etc. Avantajul controlului este ca permite reutilizarea usoara a codului, ntr-o maniera
declarativa.
Codul pentru pagina de popup (controlul ascx) este:
1
using
using
using
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
System.Web;
System.Web.UI;
System.Web.UI.WebControls;
System.Text;
namespace DemoCurs8
{
public partial class CustomPopup : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
if (Page.Request.Browser.EcmaScriptVersion.Major >= 1)
{
StringBuilder javaScriptString = new StringBuilder();
javaScriptString.Append("<script type=text/javascript>");
javaScriptString.Append("\n<!-- ");
javaScriptString.Append("\nvar popupWindow" + ID +
"= window.open(");
javaScriptString.Append(Url + ", " + ID);
javaScriptString.Append(",toolbar=0,");
javaScriptString.Append("height=" + WindowHeight + ",");
javaScriptString.Append("width=" + WindowWidth + ",");
javaScriptString.Append("resizable=" +
Convert.ToInt16(Resizable).ToString() + ",");
javaScriptString.Append("scrollbars=" +
Convert.ToInt16(ScrollBars).ToString());
javaScriptString.Append(");\n");
if (PopUnder) javaScriptString.Append("popupWindow" + ID +
".blur(); ");
113
javaScriptString.Append("\n-->\n");
javaScriptString.Append("</script>\n");
Literal1.Text = javaScriptString.ToString();
}
}
public bool PopUnder
{
get
{
return (bool)ViewState["PopUnder"];
}
set
{
ViewState["PopUnder"] = value;
}
}
public string Url
{
get
{
return (string)ViewState["Url"];
}
set
{
ViewState["Url"] = value;
}
}
public int WindowHeight
{
get
{
return (int)ViewState["WindowHeight"];
}
set
{
if (value < 1)
{
throw new ArgumentException(@"WindowHeight must be
114
115
set
{
ViewState["ScrollBars"] = value;
}
}
public CustomPopup()
{
PopUnder = true;
Url = "about:blank";
WindowHeight = 300;
WindowWidth = 300;
Resizable = false;
ScrollBars = false;
}
}
}
O pagina aspx care utilizeaza controlul ar :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
116
23
24
8.8
Ajax
Pana acum, orice cerere de date dinspre server nseamna trimiterea formularului catre server si reasarea paginii. Ca efect, se observa activitatea
sacadata "click si asteapta", precum si faptul ca pagina este rencarcata, cu
saltul la nceputul ei. Desi pentru ASP.NET exista posibilitatea de a specica atributul MaintainScrollPositionOnPostback cu valoarea true n
cazul directivei de pagina, comportamentul vizual este acceptabil pe Internet Explorer, dar nesatisfacator pe Mozilla Firefox.
Ajax = Asynchronous JavaScript and XML este un grup de tehnici web
inter-relationate care permit dezvoltarea de aplicatii web interactive sau cu
un aspect asemanator cu cel al aplicatiilor ce ruleaza folosind doar resurse
locale. Prin Ajax se pot aduce date de la server, n mod asincron, fara a
necesara trimiterea propriu-zisa a formularului catre server; pagina ramane
ncarcata n browser, dar anumite portiuni din ea sufera modicari pe baza
continutului adus de la server.
JavaScript este de ajutor aici deoarece, presupunand problema preluarii
asincrone a datelor rezolvata, permite identicarea fragmentelor de document care trebuie sa e modicate si permite schimbarea lor. Totusi, doar
JavaScript nu este sucient, deoarece el se descurca cu resurse locale, n timp
ce pentru anumite actiuni utilizator este nevoie de preluare de date pe care
doar un server le poate furniza. Paginile care utilizeaza Ajax comunica n
fundal cu serverul; de ndata ce raspunsul este primit n ntregime, se efectueaza activitati aditionale. Din cauza caracterului asincron al comunicarii,
pagina nu este ntrerupta, iar utilizatorul poate sa efectueze si alte actiuni
n ea. Raspunsul poate furnizat sub forma unui document XML sau ca
un simplu text. Este responsabilitatea codului Ajax scris de programator sa
parcurga raspunsul si sa actioneze n consecinta.
Un aspect neplacut al programarii cu Ajax este faptul ca exista diferente
mari ntre browsere, ncepand chiar de la formularea cererii. Exista biblioteci
cross-browser care pot folosite n acest sens.
2
8.8. AJAX
8.8.1
117
Obiectul XMLHttpRequest
Pentru a face comunicarea cu serverul dinspre pagina web, trebuie formulata o cerere catre server iar raspunsul trebuie sa e preluat. Ambele actiuni
sunt efectuate de obiectul XMLHttpRequest. Obtinerea lui se face diferentiat,
dupa browser: Internet Explorer 5 sau 6 foloseste ActiveX, iar IE7 si Mozilla
Firefox folosesc un obiect JavaScript nativ. Ca atare, codul de instantiere
a obiectului XMLHttpRequest trebuie sa e scris luand n considerare toate
variantele, deoarece nu se poate sti ce browser este folosit de catre client.
Codul este:
1
2
3
4
5
6
7
8
9
10
11
12
var xmlRequest;
try
{
// Asta merge daca XMLHttpRequest face parte din JavaScript.
xmlRequest = new XMLHttpRequest();
}
catch(err)
{
// altfel, se cere serviciu de la ActiveX
xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
//in acest punct obiectul XMLHttpRequest este instantiat
8.8.2
Trimiterea cererii
xmlRequest.open("GET" , myURL);
URL-ul apelat poate sa contina un query string cu perechi de atribute si valori; ceea ce se aa la adresa referita trebuie sa poata prelua acesti parametri
si sa formuleze raspunsul n consecinta.
Se mai poate da un parametru optional care specica daca cererea trebuie sa e trimisa asincron (implicit) si nca doi care dau numele si parola
utilizatorului (nerecomandat).
Metoda send() trimite efectiv comanda catre server:
1
xmlRequest.send(null);
118
8.8.3
Procesarea r
aspunsului
8.9
Un exemplu Ajax
1
2
3
4
3
System;
System.Collections.Generic;
System.Linq;
System.Web;
119
using System.Web.Services;
namespace DemoCurs8
{
/// <summary>
/// Summary description for $codebehindclassname$
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class HandlerCalculator : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
HttpResponse response = context.Response;
HttpRequest request = context.Request;
//tipul de raspuns este text simplu
response.ContentType = "text/plain";
int value1, value2;
if (
int.TryParse(request.QueryString["value1"], out value1) &&
int.TryParse(request.QueryString["value2"], out value2)
)
{
int sum = value1 + value2;
response.Write(sum.ToString());
response.Write(",");
response.Write(DateTime.Now.ToString());
}
else
{
response.Write("-");
}
}
public bool IsReusable
{
get
{
return true;
}
120
46
47
48
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
121
122
Capitolul 9
ASP.NET membership
ASP.NET pune la dispozitie un API pentru gestiunea utilizatorilor care
pot sa acceseze o aplicatie. Se ofera suport pentru urmatoarele operatii, care
n mod normal ar trebuie implementate de ecare data n cadrul unei aplicatii
web:
crearea si stergerea de utilizatori programatic sau prin interfata pusa
la dispozitie automat;
abilitatea de a reseta parole, cu posibilitatea de a trimite noua parola
prin email, daca a fost specicata o adresa;
posibilitatea de a se crea parole n mod automat, daca se foloseste
crearea programatica a utilizatorilor;
determinarea listei de utilizatori, mpreuna cu detaliile asociate;
controale predenite pentru loginare, creare de utilizator, resetare de
parola;
O ierarhizare a acestor functionalitati este data n gura 9.1.
Exemplicarea mecanismului se va face cu referire la serverul de baze
de date SQL Server 2005 Express Edition, pentru care exista suport nativ;
trebuie zis nsa ca daca se doreste personalizarea sursei de date care gestioneaza utilizatorii, acest lucru este posibil prin implementarea unui furnizor de
membership. API-ul furnizat este insenzitiv la modul de stocare al detaliilor legate de utilizator - particularitatile de accesare a datelor sunt rezolvate
la nivelul implementarii de furnizor de membership.
Pasii ce trebuie urmati pentru utilizarea unui API-ului de membership
sunt:
1. congurarea modului de autenticare n sierul web.cong;
123
124
9.1. CONFIGURAREA AUTENTIFICARII
PRIN FORME
125
9.1
Configurarea autentific
arii prin forme
126
9.2
9.3
128
130
131
9.4
Crearea de utilizatori
132
}
}
cu sanse de autenticare reusita pentru numele de utilizator si parola salvate
n baza de date.
9.5
9.5.1
Controlul Login
-demo live
Fata de setarile implicite ale controlului, se mai poate interveni asupra
proprietatilor:
CreateUserText - arata textul de pe un link care va folosit pentru
redirectare catre o pagina care da posibilitatea de a crea un nou cont
de utilizator;
133
9.5.2
Controlul LoginStatus
-demo live
9.5.3
Controlul LoginView
Permite asarea unor seturi diferite de controale, n functie de autenticarea utilizatorului: autenticat sau nu; mai departe, se pot face particularizari
n functie de rolul pe care l are utilizatorul. Controlul consta din templateuri, ecare avand un anumit continut.
-demo live
9.5.4
Controlul PasswordRecovery
-demo live
134
9.5.5
Controlul ChangePassword
-demo live
9.6
9.6.1
Sa presupunem ca vom aduce lista de utilizatori ntr-un grid, avand coloanele: username, email si nca o coloana ce contine link de selectare. Codul
pentru crearea de grid n pagina aspx este:
<asp : GridView ID=" GridView1 " runat=" s e r v e r "
AutoGenerateColumns=" F a l s e " DataKeyNames="UserName">
<Columns>
<asp : CommandField ShowSelectButton=" t r u e " />
<asp : BoundField D a t a F i e l d="UserName"
HeaderText=" username " />
<asp : BoundField D a t a F i e l d=" Email "
HeaderText=" e m a i l a d d r e s s " />
</Columns>
</asp : GridView>
Legarea la date se poate face din partea de code-behind astfel:
9.6.2
9.6.3
9.6.4
136
9.6.5
Validarea utilizatorului vizavi de sursa de date folosite se face prin in termediul metodei statice Membership.ValidateUser(string username, string
password).
Bibliografie
[1] D. Gourley, B. Totty, M. Sayer, S. Reddy, and A. Aggarwal. HTTP: The
Definitive Guide. OReilly, 2002.
[2] M. MacDonald and M. Szpuszta. Pro ASP.NET 3.5 in C# 2008. Apress,
2008.
[3] L. Sasu. Tehnologii XML. Note de curs, Facultatea de Matematica si
Informatica, Universitatea Transilvania din Brasov, 2007.
[4] C. Wong. HTTP Pocket Reference. OReilly, 2000.
137