aspnet curs microsoft

Download ASPNET curs microsoft

If you can't read please download the document

Upload: morar-ioan

Post on 15-Sep-2015

230 views

Category:

Documents


0 download

DESCRIPTION

ASPNET curs microsoft

TRANSCRIPT

  • Site-uri web dinamice folosindASP.NET

    PhD. Lucian Sasu

    25 mai 2009

  • 2

  • Cuprins

    1 Aplicatii Web 71.1 Pagini Web. Servere Web. Aplicatii Web . . . . . . . . . . . . 71.2 Modele clasice de realizare a aplicatiilor Web . . . . . . . . . . 10

    1.2.1 Comunicarea cu serverul . . . . . . . . . . . . . . . . . 111.2.2 Limbajul HTML . . . . . . . . . . . . . . . . . . . . . 141.2.3 Limbajul XHTML . . . . . . . . . . . . . . . . . . . . 14

    1.3 Formulare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161.3.1 Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191.3.2 Password . . . . . . . . . . . . . . . . . . . . . . . . . 201.3.3 Checkbox . . . . . . . . . . . . . . . . . . . . . . . . . 201.3.4 Butoane radio . . . . . . . . . . . . . . . . . . . . . . . 211.3.5 Butonul de Submit . . . . . . . . . . . . . . . . . . . . 211.3.6 Butonul de reset . . . . . . . . . . . . . . . . . . . . . 221.3.7 File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221.3.8 Campuri ascunse . . . . . . . . . . . . . . . . . . . . . 221.3.9 Image . . . . . . . . . . . . . . . . . . . . . . . . . . . 231.3.10 Butoane . . . . . . . . . . . . . . . . . . . . . . . . . . 241.3.11 Textarea . . . . . . . . . . . . . . . . . . . . . . . . . . 241.3.12 Select . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

    2 ASP.NET 272.1 Generalitati . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

    2.1.1 Ce e gresit la ASP-ul clasic? . . . . . . . . . . . . . . . 272.1.2 Ce aduce ASP.NET? . . . . . . . . . . . . . . . . . . . 29

    2.2 Despre ASP.NET 3.5 . . . . . . . . . . . . . . . . . . . . . . . 302.3 Tipuri de fisiere n ASP.NET . . . . . . . . . . . . . . . . . . 302.4 Modelul de cod . . . . . . . . . . . . . . . . . . . . . . . . . . 322.5 Controale Web si controale HTML . . . . . . . . . . . . . . . 362.6 Forme Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

    2.6.1 Postback . . . . . . . . . . . . . . . . . . . . . . . . . . 372.6.2 Mentinerea starii prin Viewstate . . . . . . . . . . . . . 39

    3

  • 4 CUPRINS

    2.6.3 Utilitatea conceptului de controale . . . . . . . . . . . 412.6.4 Ciclul de viata al unei pagini (varianta sumara) . . . . 43

    3 Forme Web, gestiunea starii 473.1 Forme Web (continuare) . . . . . . . . . . . . . . . . . . . . . 47

    3.1.1 Colectia de controale din pagina . . . . . . . . . . . . . 473.1.2 Request . . . . . . . . . . . . . . . . . . . . . . . . . . 473.1.3 Response . . . . . . . . . . . . . . . . . . . . . . . . . 483.1.4 Server . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

    3.2 Tipuri de controale server . . . . . . . . . . . . . . . . . . . . 493.2.1 Controale server HTML . . . . . . . . . . . . . . . . . 503.2.2 Controale Web server . . . . . . . . . . . . . . . . . . . 53

    3.3 Gestiunea starii n ASP.NET . . . . . . . . . . . . . . . . . . . 533.3.1 ViewState . . . . . . . . . . . . . . . . . . . . . . . . . 553.3.2 Query String . . . . . . . . . . . . . . . . . . . . . . . 573.3.3 Cross page posting . . . . . . . . . . . . . . . . . . . . 583.3.4 Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . 583.3.5 Sesiunea . . . . . . . . . . . . . . . . . . . . . . . . . . 593.3.6 Application . . . . . . . . . . . . . . . . . . . . . . . . 59

    4 Validatoare, manipulatoare, controale 614.1 Controale de validare a intrarii . . . . . . . . . . . . . . . . . . 61

    4.1.1 Pasii de validare . . . . . . . . . . . . . . . . . . . . . . 624.1.2 Clasa BaseValidator . . . . . . . . . . . . . . . . . . 624.1.3 Validatorul RequiredFieldValidator . . . . . . . . . 634.1.4 Validatorul RangeValidator . . . . . . . . . . . . . . . 644.1.5 Validatorul CompareValidator . . . . . . . . . . . . . 654.1.6 Validatorul RegularExpressionValidator . . . . . . . 664.1.7 Controlul CustomValidator . . . . . . . . . . . . . . . 664.1.8 Controlul ValidationSummary . . . . . . . . . . . . . . 674.1.9 Grupuri de validare . . . . . . . . . . . . . . . . . . . . 67

    4.2 Manipulatoare HTTP . . . . . . . . . . . . . . . . . . . . . . . 684.3 Controale utilizator . . . . . . . . . . . . . . . . . . . . . . . . 71

    5 Teme, pagini master, navigare 735.1 Cascading Style Sheets . . . . . . . . . . . . . . . . . . . . . . 735.2 Teme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745.3 Pagini master . . . . . . . . . . . . . . . . . . . . . . . . . . . 775.4 Navigare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

  • CUPRINS 5

    6 Legarea la date 856.1 Legarea la date simple . . . . . . . . . . . . . . . . . . . . . . 866.2 Legarea la date multiple . . . . . . . . . . . . . . . . . . . . . 886.3 Controale de date bogate . . . . . . . . . . . . . . . . . . . . 906.4 Controale de surse de date . . . . . . . . . . . . . . . . . . . . 916.5 Ciclul de viata al unei pagini Web . . . . . . . . . . . . . . . . 916.6 Sursa de date SqlDataSource . . . . . . . . . . . . . . . . . . . 93

    6.6.1 Selectarea de nregistrari . . . . . . . . . . . . . . . . . 936.6.2 Dezavantaje ale SqlDataSource . . . . . . . . . . . . . 94

    6.7 Sursa de date ObjectDataSource . . . . . . . . . . . . . . . . . 94

    7 Controale de lucru cu datele 977.1 Controlul GridView . . . . . . . . . . . . . . . . . . . . . . . . 97

    7.1.1 Formatare . . . . . . . . . . . . . . . . . . . . . . . . . 977.1.2 Stiluri . . . . . . . . . . . . . . . . . . . . . . . . . . . 987.1.3 Selectarea de linie din GridView . . . . . . . . . . . . . 987.1.4 Sortare . . . . . . . . . . . . . . . . . . . . . . . . . . . 987.1.5 Paginare . . . . . . . . . . . . . . . . . . . . . . . . . . 997.1.6 Template-uri . . . . . . . . . . . . . . . . . . . . . . . 99

    7.2 Controalele FormView, DetailsView . . . . . . . . . . . . . . . 99

    8 JavaScript si Ajax 1018.1 Elemente de baza JavaScript . . . . . . . . . . . . . . . . . . . 1018.2 Blocuri de script . . . . . . . . . . . . . . . . . . . . . . . . . 1038.3 Manipularea elementelor HTML . . . . . . . . . . . . . . . . . 1058.4 Utilizare de JavaScript pentru ncarcare asincrona a paginilor . 1058.5 Includerea blocurilor JavaScript din code-behind . . . . . . . . 1088.6 Atacuri de injectare de script . . . . . . . . . . . . . . . . . . 1098.7 JavaScript pentru controale utilizator . . . . . . . . . . . . . . 1118.8 Ajax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

    8.8.1 Obiectul XMLHttpRequest . . . . . . . . . . . . . . . . 1178.8.2 Trimiterea cererii . . . . . . . . . . . . . . . . . . . . . 1178.8.3 Procesarea raspunsului . . . . . . . . . . . . . . . . . . 118

    8.9 Un exemplu Ajax . . . . . . . . . . . . . . . . . . . . . . . . . 118

    9 ASP.NET membership 1239.1 Configurarea autentificarii prin forme . . . . . . . . . . . . . . 1259.2 Crearea sursei de date . . . . . . . . . . . . . . . . . . . . . . 1269.3 Configurarea stringului de conexiune si a furnizorului de membership 1269.4 Crearea de utilizatori . . . . . . . . . . . . . . . . . . . . . . . 1319.5 Crearea unei pagini de login . . . . . . . . . . . . . . . . . . . 132

  • 6 CUPRINS

    9.5.1 Controlul Login . . . . . . . . . . . . . . . . . . . . . . 1329.5.2 Controlul LoginStatus . . . . . . . . . . . . . . . . . . 1339.5.3 Controlul LoginView . . . . . . . . . . . . . . . . . . . 1339.5.4 Controlul PasswordRecovery . . . . . . . . . . . . . . 1339.5.5 Controlul ChangePassword . . . . . . . . . . . . . . . . 134

    9.6 Gestiunea utilizatorilor prin API-ul de membership . . . . . 1349.6.1 Aducerea listei de utilizatori . . . . . . . . . . . . . . . 1349.6.2 Obtinerea detaliilor despre un utilizator . . . . . . . . 1359.6.3 Modificarea datelor unui utilizator . . . . . . . . . . . 1359.6.4 Crearea si stergerea unui utilizator . . . . . . . . . . . 1359.6.5 Validarea unui utilizator . . . . . . . . . . . . . . . . . 136

  • Capitolul 1

    Aplicatii Web

    1.1 Pagini Web. Servere Web. Aplicatii Web

    In ingineria softului, o aplicatie Web1 este un program care este stocatpe un server Web si accesat prin intermediul unui browser folosind reteaua.

    La un capat al acestei comunicatii se afla un server (program dedicat)care accepta interogari, formulate prin protocolul HTTP; serverul poate saserveasca pagini web statice (ficsiere scrise n limbaj HTML) sau resursestatice (imagini, fisiere PDF etc). Exemple de servere folosite n prezent:

    Apache - cel mai larg raspandit, la ora actuala; poate rula pe o multitu-dine de sisteme de operare; conform Netcraft, n ianuarie 2009, 50.33%din site-uri rulau Apache

    IIS = Internet Information Services, creat de catre Microsoft pentrua fi folosit pe sistemele de operare Windows; disponibil pe Windows2000 (IIS 5), Windows XP Professional (IIS 5.1), Windows Server 2003(IIS 6), Windows 2008 (IIS 7.0 si 7.5), Windows Vista anumite versiuni(IIS 7.0). IIS este folosit n dezvoltarea aplicatiilor ASP.NET. ConformNetcraft, n luna precizata mai sus 31.61% din site-uri rulau o variantade IIS.

    Varianta cea mai simpla este aceea n care se servesc doar resurse statice- cum ar fi un site de prezentare a unei institutii, prezentari de rezultatesau statistici etc, deci situatii n care continutul se schimba relativ rar. Pa-ginile Web sunt scrise ntrun limbaj numit HTML. Figura 1.1 ilustreazaarhitectura unui web server si legatura cu browserul.

    Exista nsa situatii n care continutul se modifica foarte des de exemplupentru pagina unui magazin de carti, n care apar permanent noi carti, altele

    1In original: Web application sau webapp.

    7

    http://news.netcraft.com/archives/2009/01/16/january_2009_web_server_survey.htmlhttp://www.iis.net/
  • 8 CAPITOLUL 1. APLICATII WEB

    Figura 1.1: Arhitectura unui server web simplu

    se epuizeaza, noi categorii de literatura, preturi etc. A crea pagini web staticenu este o solutie, deoarece atat de multe modificari nu pot fi operate n timpreal de catre o persoana. Ca atare, serverul de Web poate de asemenea sagazduiasca o aplicatie scrisa ntr-un limbaj (alegeri populare: PHP, Java,ASP.NET cu C#/VB.NET etc) care produce pagini Web dinamice; aceastaaplicatie poate sa preia date dintr-o sursa de date - de regula, o baza de daterelationala - si sa produca pagini HTML actualizate. Modificarea dateloreste reflectata instantaneu ntr-o pagina ceruta dupa ce aceasta modificares-a facut. Intrucat continutul paginilor se genereaza dinamic, paginile se mainumesc si dinamice.

    Exemple clasice de aplicatii Web sunt:

    webmail permite citirea postei electronice folosind o interfata web;exemple: Yahoo! Mail, Google Mail;

    magazine electronice, site-uri de licitatii permit prezentarea de pro-duse; utilizatorul poate sa cumpere, daca acest serviciu este prezentat;exemplu: Amazon, eBay;

    forumuri permit membrilor unei comunitati sa comunice; mesajelesunt vizibile de catre totti membrii comunitatii si pot sa primeascaraspuns, de asemenea tot pe forum; exemplu: Comunitatea SQL Server;

    motoare de cautare: Google, Clusty;

    site-uri ce ofera informatii sau predictii: mersul trenurilor, predictiidespre evolutia pretului la bilete de avion.

    http://www.amazon.com/http://www.ebay.com/http://sqlserver.rohttp://www.google.comhttp://clusty.com/http://www.infofer.ro/http://farecast.live.com/?
  • 1.1. PAGINI WEB. SERVERE WEB. APLICATII WEB 9

    La celalalt capat se afla un browser (fie el Internet Explorer, MozillaFirefox, Safari, Opera sau Google Chrome - cele mai utilizate la ora actuala).Tot ceea ce trebuie sa faca utilizatorul este sa indice care este adresa de Webla care se afla pagina de interes.

    Acest tip de comunicare este numit clientserver: clientul este browse-rul, serverul este cel care raspunde prin furnizarea unei pagini web (dacase poate). Browserul este de fapt un asa numit thin client (client subtire);el nu necesita instalare locala a unor componente (cu exceptia browserului,utilizabil pentru toatre site-urile), nici drepturi de administrator pe masinape care lucreaza; tot ceea ce trebuie sa faca este sa formuleze cereri catreserver, pe baza actiunilor utilizatorului uman si sa primeasca raspunsul dela server, pentru a-l nfatisa sub forma unei pagini. Simplitatea modului deoperare precum si lipsa unor manevre complicate de instalare de catre utili-zator fac aceast tip de aplicatii extrem de populare. Se mai considera aici siomniprezenta browserelor un aspect care a contribuit decisiv la acceptareape scara larga a aplicatiilor web.

    Tot ca un avantaj al acestor aplicatii web ar fi faptul ca daca se doresteschimbarea unei parti din aplicatii, aceasta modificare se face ntr-un singurloc pe server. Clientul (browserul) este insensibil la aceasta manevra sinu trebuie actualizat n niciun fel. Este o uriasa diferenta fata de tehnolo-gia thick client (client gras) prin care utilizatorul primea un kit de instalarepentru calculatorul lui, iar aplicatia nou instalata se conecta la sever; modi-ficarea aplicatiei putea sa nsemne dezinstalarea versiunii vechi si instalareacelei noi, cu potentiale pericole: versiuni incorecte de fisiere DLL (asa numi-tul DLL hell).

    In sfarsit, trebuie spus ca nu conteaza pe ce fel de platforma sau sistem deoperare ruleaza browserul, deoarece paginile Web reprezinta doar text caresunt ntelese de catre orice sistem. In paranteza fie spus, exista totusi micidiferente ntre modul n care browserele deseneaza pagina pe ecran, datoritafaptului ca HTML reprezinta niste specificatii despre cum ar trebui sa fiedesenat un anumit cod HTML, dar nu poate obliga pe nimeni.

    Ca un neajuns al acestui tip de aplicatii: daca reteaua devine nedispo-nibila, aplicatia web nu poate fi accesata. Rezolvarea acestei situatii se faceprintr-ul al treilea tip de aplicatii (pe langa cele thin si thick): smart applica-tions. De exemplu, un client de email de tipul Outlook sau Mozilla Thunderbirdcare poate sa lucreze si deconectat de la retea (citire de emailuri, stergere,pregatire de emailuri pentru a fi trimise, catare etc). Subiectul nu este tratatn acest curs.

    http://marketshare.hitslink.com/browser-market-share.aspx?qprid=0http://en.wikipedia.org/wiki/Dll_hellhttp://www.mozilla.com/en-US/products/thunderbird/
  • 10 CAPITOLUL 1. APLICATII WEB

    1.2 Modele clasice de realizare a aplicatiilor Web

    Modelul de realizare a aplicatiior Web a cunoscut o intreaga evolutie atehnologiilor de programare la nivel de server. Putem enumera astfel:

    1. solutia CGI (Common Gateway Interface) reprezinta o serie de script-uri executate pe serverul web. Acestea pot fi scrise n orice limbajde programare (interpretat sau compilat) cu respectarea urmatoarelorrestrictii: programul scrie datele la iesirea standard si genereaza an-tete care permit browserului sa interpreteze corect iesirea scriptului,conform specificatiilor HTTP. Se pot folosi limbaje precum bash, Perl,C/C++, Delphi. Neajunsul CGI-urilor l reprezinta faptul crearii unuinou proces pe serverul Web pentru fiecare cerere, ceea ce la un numarmare de cereri este prohibitiv.

    2. solutia ISAPI (Internet Server API) reprezinta o alternativa CGI peplatforma Windows. Dezvoltatorii Win32 pot scrie un program care sacomunice direct cu aceasta interfata pentru a face orice lucru posibil cuCGI, pot folosi ISAPI pentru a obtine date din formulare si pentru atrimite continut HTML la client. Codul la nivel de server poate fi scrisn oricare limbaj cu suport pentru DLL-uri Windows, precum C/C++,Visual Basic, rezultatul compilarii fiind un fisier .dll. Fata de CGI,ISAPI ruleaza n acelasi spatiu de adrese cu serverul HTTP, are accesla toate resursele serverului HTTP, pot fi incluse mai multe task-urintr-un .dll si nu creeaza procese aditionale pentru rezolvarea cererilorclientilor Web.

    3. solutia PHP (1994) sau ASP (1996) marcheaza un salt n dezvoltareaaplicatiilor Web. Desi difera din punct de vedere al sintaxei, ambelelimbaje sunt interpretate, codul lor fiind stocat n fisiere externe cuextensia .php/.asp. De fapt, ASP nu ofera un limbaj nou, ci se ba-zeaza pe limbajele VBScript si JScript. Un fisier PHP/ASP poate ficombinat cu date de tip text, marcatori HTML si comenzi script, nmomentul executiei, n urma cererii unui client Web, fisierul este pro-cesat, fiecare script din cadrul lui este interpretat si rezultatul executieieste ntrodus napoi n fisierul static HTML nainte ca rezultatul sa fietrimis catre browser. Mai mult, n sprijinul programatorului, limbajelepun la dispozitia acestuia o serie de metode si obiecte care usureaza lu-crul cu cookie-uri, cu bazele de date, care preiau elegant intrarile unuiformular HTML si le proceseaza pe server, care preiau informatii des-pre utilizator (clientul Web), care trimit informatii la utilizator, care

  • 1.2. MODELE CLASICE DE REALIZARE A APLICATIILOR WEB 11

    stocheaza informatii despre sesiunea unui utilizator, care partajeazainformatii ntre utilizatorii unei aplicatii etc.

    4. JSP (Java Server Pages) face parte din familia Java si reprezinta otehnologie care permite crearea de aplicatii Web independente de plat-forma. JSP separa interfata utilizator de continutul generat dinamicpermitand schimbarea ntregului sablon al site-ului WEB fara a al-tera informatiile afisate. Tehnologia utilizeaza marcatori XML si scrip-turi scrise n limbajul de programare Java pentru a incapsula logicaaplicatiei care genereaza continutul paginilor WEB. JSP-urile sunt oextensie a tehnologiei Java Servlet. Servlet-ele sunt independente deplatforma 100% si reprezinta module la nivel de server care se integreazan cadrul unei aplicatii Web si care pot fi utilizate pentru a extindecapabilitatile unui server WEB. Tehnologia JSP si servlet-urile oferao alternativa pentru crearea aplicatiilor WEB fata de alte limbaje descripting/programare a aplicatiilor WEB, oferind independenta de plat-forma, performanta, separarea logicii aplicatiei de partea de interfatautilizator, administrare usoara si extensibilitate.

    Punctele de mai sus au n comun faptul ca serverul Web prezinta ointerfata de comunicare cu procese externe. Separarea software-ul n diferiteprocese ofera avantajul de modularizare si usureaza procesul de integrare,n acelasi timp extinzand functiile web server-ului. Aceste procese externerealizeaza componenta logica a activitatii. Configuratia descrisa este redatan figura 1.2.

    Figura 1.3 arata modul n care Serverul IIS utilizeaza ASP.NET pentru aservi pagini web dinamice; mai departe, codul ASP.NET este responsabil dea lua legatura cu surse de date pentru a furniza continutul actual al paginilordinamice.

    1.2.1 Comunicarea cu serverul

    Paginile web sunt de obicei transmise si primite prin intermediul Inter-netului via HTTP2 (nesecurizat) sau HTTPS3 (securizat). Dezvoltarea pro-tocolului 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 ntreun client si un server. Clientul - de regula un browser, dar poate sa fie si unrobot de descarcare a paginilor sau o aplicatie utilizator - face o cerere catre

    2Hypertext Transfer Protocol.3Secure HTTP.

    http://www.w3.org/
  • 12 CAPITOLUL 1. APLICATII WEB

    Figura 1.2: Server Web cu interfata spre procese externe.

    Figura 1.3: Server IIS folosind ASP.NET pentru generarea de pagini Webdinamice

  • 1.2. MODELE CLASICE DE REALIZARE A APLICATIILOR WEB 13

    un sever, folosind o adresa web. De regula, aceasta cerere HTTP (protocol lanivelul aplicatie din stiva de protocoale TCP/IP) se foloseste de o conexiuneTCP; 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 cerutaeste disponibila); o lista a codurilor este data n [1], [4].

    un mesaj care este resursa ceruta (pagina web sau imagine sau docu-ment etc), sau un mesaj de eroare sau alta informatie

    Browserul primeste aceste raspunsul de la server si l afiseaza; e de la sinenteles ca browserul trebuie sa implementeze cat mai fidel acest protocol.

    Mai n detaliu, o cerere arata astfel:

    linie de cerere, prevum GET /images/logo.gif HTTP/1.1, care cere oresursa 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 dela server sunt: get si post. Acestea vor fi exemplificate n sectiunea 1.3.

    Un aspect esential al comunicaarii prin HTTP este nsa faptul ca HTTPeste un protocol fara stare. Asta n seamna ca ori de cate ori un clientefectueaza o cerere catre un server, acesta raspunde cererii dupa care uitatot ceea ce a comunicat cu clientul; serverul nu mentine nicio legatura cubrowserul si nu mentine resursele necesare pentru a raspunde clientului (cuo exceptie minora, mecansimul de keep-alive care permite reutilizarea uneiconexiuni pentru alte cereri); daca apar modificari ale paginii sau a surselorde date pe baza carora s-a construit pagina, atunci browserul nu este notificatn niciun fel.

    In acest mod serverul, netinand resurse ocupate dupa efectuarea raspunsului,poate sa fie utilizat de cat mai multi clienti simultan. Trasatura mentionatatrebuie privita ca o caracteristica voita a protocolului si nu ca o lipsa.

    Mentinerea starii dintre cereri consecutive venite de la acelasi client estetotusi dorita de catre utilizatori sau programatori n majoritatea cazurilorsi 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 pa-ginilor Web. El descrie structura, continutul si modul de aparitie al uneipagini; poate sa includa referinte catre imagini, legaturi catre alte pagini,frame-uri, formulare etc. Un exemplu simplu este:

    Hello HTML

    Hello World!!

    Google isyour friend

    Continutul unui document HTML care dupa cum se observa, este undocument de tip text se creeaza pe baza unor elemente (

    , etc)care sunt definite de catre limbaj. Un element are de regula o eticheta dedeschidere si una de nchidere (dar n HTML acest lucru nu e ntotdeaunacerut); elementele pot avea atribute specificate prin nume si carora li asociazavalori:

    HTML

    Un tutorial bun pentru ncepatori se gaseste la W3Schools.com. De exem-plu, pentru includerea unei imagini se foloseste secventa:

    Browserul, dupa primirea fisierului HTML va efectua o parsare a codului;la ntalnirea elementului img se face o cerere de tip GET pentru a obtineimaginea de pe server.

    1.2.3 Limbajul XHTML

    Una din criticile care sau adus lui HTML este ca permite combinareacontinutului efectiv al unei pagini cu indicatii despre cum sa arate acest

    4Hypertext Markup Language

    http://w3schools.com/html/default.asp
  • 1.2. MODELE CLASICE DE REALIZARE A APLICATIILOR WEB 15

    continut n pagina. Suplimentar, faptul ca n HTML nu se respecta nistereguli de buna formare face parsarea continutului greoaie si poate duce ladiferente. S-a dorit obtinerea unui limbaj pentru care interpretarea sa fie maiusoara, sa se poata separa structura de continut si de asemenea sa semenenca cu limbajul HTML cu care creatorii de pagini web erau obisnuiti. Prinpreluarea trasaturilor limbajului XML s-a ajuns la realizarea unui limbajhibrid XHTML5. Chiar daca mai exista pagini scrise n limbaj HTML,exista o presiune constanta de a produce numai continut XHTML; chiar siuneltele de dezvoltare se conformeaza acestei tendinte.

    Implicit, continutul generat de ASP.NET este de tip XHTML. Asta nseamnaca elementele de marcare satisfac regulile:

    etichetele si numele de atribute trebuie sa fie scrise cu litere mici

    toate elementele trebuie sa fie nchise, fie cu un tag (eticheta) de nchiderededicat (

    ) fie folosind un tag gol care se nchide singur (
    ).

    toate atributele trebuie sa aibe valorile incluse ntre ghilimele sau apos-troafe (id="errorLabel").

    atributul id trebuie sa fie folosit n locul atributului name (dar controa-lele ASP.NET generate vor avea amandoua aceste atribute, din motivede compatibilitate cu codul JavaScript existent).

    elementele trebuie sa fie imbricate corect:

    ..

    si nu

    ..

    .

    documentele XHTML trebuie sa aibe un unic element radacina; acestaeste dat de eticheta html.

    XHTML de asemenea nlatura suportul pentru cateva mecanisme exis-tente n HTML, precum frame-urile sau precizari stilistice care nu utilizeazaCSS, sau folosirea atributului target pentru link-uri.

    Orice document XHTML trebuie sa nceapa cu o declaratie de tip de do-cument (vezi [3], sectiunea de DTD), care defineste tipul de XHTML folosit.Pentru a specifica varianta XHTML 1.1 se foloseste:

    iar elementul radacina are forma:5Extensible HTML

  • 16 CAPITOLUL 1. APLICATII WEB

    ...

    adica se cere declararea unui spatiu de nume.Exista posibilitatea de a nu urma specificatiile stricte ale lui XHTML 1.1

    si a folosi n schimb niste canoane mai relaxate. de exemplu, se poate utilizaXHTML 1.0 tranzitional care impune regulile structurale din XHTML dar deasemenea permite folosirea mecanismelor de formatare care au fost nlocuiten XHTML 1.1 cu stiluri CSS. Declaratia de tip de document arata astfel:

    Chiar si aceasta varianta poate parea prea stricta, deoarece mpiedicautilizarea frame-urilor. Daca se doreste utilizarea acestora cu regulile datede XHTML atunci se poate folosi XHTML 1.0 frameset declarat ca:

    Modul n care se genereaza continutul unei de catre ASP.NET este de-pendent de facilitatile pe care le are browserul care a facut cererea.

    1.3 Formulare

    Formularul reprezinta modalitatea cea mai utilizata de trimitere de informatiidinspre browser spre server. Formularul contine elemente care de regula su-porta specificarea de valori de catre utilizator (cum ar fi numele si parola peun formular de loginare, sau raspunsurile la un test grila). In momentul ncare se doreste, formularul adica setul de input-uri utilizator este trimiscatre server. Demn de mentionat este ca daca formularul contine si alte ele-mente (imagini, link=uri, text etc) acestea nu sunt trimise la server, deoareceele nu poarta informatie de la utilizator ci au ramas nemodificate.

    Un formular este definit cu eticheta form:

    1 3 Nume: 5
    6 Parola:

  • 1.3. FORMULARE 17

    7 id="txtParola" />8
    9 11

    (elementele de tip input sunt prezentate n cele ce urmeaza).Pagina desenata n browser arata ca n figura 1.4.

    Figura 1.4: Pagina web cu formular

    Atributul action arata care este pagina catre care se va trimite continutulformularului. In exemplul de mai sus este vorba de pagina default.aspxaflata pe acelasi server.

    Atributul method arata care din metodele GET (implicita) si POST suntfolosite pentru a trimite datele catre server. Valorile posibile sunt get sipost (nu conteaza litere mari sau mici). Cu get toate datele din formularsunt adaugate la URL-ul specificat de atributul action, astfel ca la apasareabutonului de trimitere n adresa va aparea (fragment):

    http://localhost:61561/TestGet/default.aspx?txtNume=lmsasu&txtParola=myPassword&butonTrimitere=Trimite

    Se observa ca continutul formularului care poarta datele introduse deutilizator sunt trimise n clar. Acelasi mecanism este folosit de exemplu decatre pagina prin care se acceseaza motorul de cautare Google. Avantajulacestei metode este ca se poate pune un bookmark, sau poate fi folosit calink ntr-un document.

    http://www.google.ro/search?hl=ro&q=data+mining&btnG=C%C4%83utare+Google&meta=

    http://www.google.ro/search?num=100\&hl=ro\&newwindow=1\&q=machine+learning&btnG=C%C4%83utare\&meta=
  • 18 CAPITOLUL 1. APLICATII WEB

    Partea de dupa semn de ntrebare din URL se numeste query string.Trebuie spus aici ca exista situatii n care folosirea metodei get este con-

    traindicata; lungimea maxima a URL-ului este limitata de catre browsere, nprincipal6. De exemplu, pentru Internet Explorer lungimea maxima a URL-ului este de 2083 caractere, iar lungimea maxima a caii (http://www.site.com/asta/este/in/cale) este de 2048 caractere; de asemenea, serverul sau proxy-uri intermediare pot sa limiteze lungimea maxima a unui URL vezi figura1.5; detalii suplimentare si teste - aici.

    Figura 1.5: Eroare semnalata de serverul Web: URL-ul este prea lung.

    Daca se specifica metoda post, atunci setul de date din formular se in-clude n corpul formularului si trimis mai departe la server; URL-ul nu vafi modificat. Mai exista o diferenta semantica ntre get si post: get esteconsiderat idempotent, adica nu modifica starea serverului la trimiteri re-petate ale aceleiasi interogari (abstractie facand de cresterea unor contoaresau nregistrarea acestor actiuni, sau orice alte efecte nereleavnte), pe candpost e gandit pentru a produce efecte colaterale pe server tranzactii finan-ciare sau modificari de date.

    In interiorul unui formular pot fi folosite urmatoarele elementele de tipinput:

    text

    password6Specificatia nu impune o lungime maxima pentru un URL

    http://www.boutell.com/newfaq/misc/urllength.htmlhttp://tools.ietf.org/html/rfc3986
  • 1.3. FORMULARE 19

    checkbox

    radio

    submit

    reset

    file

    hidden

    image

    button

    Se folosesc cu forma generala: . Sunt prezentatepe scurt n cele ce urmeaza. Pe langa acestea mai sunt disponibile:

    textarea

    select

    1.3.1 Text

    Se foloseste pentru crearea unor casute text, al caror continut va fi furnizatde utilizator:

    1 2 3 4 First name:5 6
    7 Last name:8 9

    10 11 12 13

  • 20 CAPITOLUL 1. APLICATII WEB

    Figura 1.6: Modul n care arata un input de tip text.

    Iesirea este data n figura 1.6. Query string-ul n acest caz arata astfel:firstname=Rafael&lastname=Popescu.

    Poate fi calificat ca fiind readonly (readonly="readonly") si i se poatespecifica lungimea maxima a sirului acceptat: maxlength="35". De aseme-nea poate sa reactioneze la evenimente. O lista completa a atributelor sievenimentelor poate fi gasita aici.

    1.3.2 Password

    Seamana cu cele de tip text, cu diferenta ca n momentul n care cinevascrie n interiorul lui, caracterele sunt suprascrise cu un caracter inert vezilistingul de la pagina 16 si figura 1.4. De retinut ca desi parola nu apare nclar pe ecran, ea este trimisa totusi asa cum este scrisa; o eventuala criptaresau folosire de protocol securizat (HTTPS) ramane sarcina celui care creeazaaplicatia.

    Asa cum sa spus la nceputul sectiunii 1.3, query string-ul asociat este:

    txtNume=lmsasu&txtParola=myPassword

    Documentatia completa despre acest tip se gaseste aici.

    1.3.3 Checkbox

    Checkbox-urile sunt folosite atunci cand utilizatorul trebuie sa specificedintr-un set de optiuni nemutual excluzive.

    1 2 I have a bike:3 4
    5 I have a car:6 7
    8 I have an airplane:9

    http://msdn.microsoft.com/en-us/library/bb415427.aspxhttp://msdn.microsoft.com/en-us/library/bb159824.aspx
  • 1.3. FORMULARE 21

    10 11

    Iesirea este data n figura 1.7. Daca se bifeaza Car si Airplane atunci peserver va ajunge un query string de forma vehicle=Car&vehicle=Airplane.Documentatia completa se gaseste aici.

    Figura 1.7: Modul n care arata un input de tip checkbox.

    1.3.4 Butoane radio

    Permite alegerea a cel mult una din mai mult optiuni. Codul HTML simodul n care arata sunt date mai jos.

    1 2 Male3
    4 Female5
    6 7

    Figura 1.8: Modul n care arata un input de tip buton radio.

    Mai multe butoane radio sunt considerate din acelasi grup daca au aceeasivaloare a atributului name. Daca se bifeaza una din ele, se trimite querystring-ul: sex=male. Documentatia completa se gaseste aici.

    1.3.5 Butonul de Submit

    In exemplele anterioare formularele aveau un buton a carui apasare de-termina trimiterea formularului catre server. Acesta este creat cu:

    http://msdn.microsoft.com/en-us/library/bb415523.aspxhttp://msdn.microsoft.com/en-us/library/bb159723.aspx
  • 22 CAPITOLUL 1. APLICATII WEB

    1 2 ...3 4

    Implicit, textul de pe el apare ca Submit Query. Daca se doreste, textul sepoate modifica folosind atributul value. Detalii se gasesc aici.

    1.3.6 Butonul de reset

    Se obtine cu input-ul de forma: si realizeazaun buton pe care (implicit) scrie textul Reset si care va repune valorile dinformular la cele cu care au venit de pe server; nu se face trimiterea formula-rului la server. Vizual, arata ca si un buton de tip Submit.

    1.3.7 File

    Cu secventa:

    1 2 3
    4 5

    rezulta un formular de ncarcare de fisier care arata precum cel din figura1.9. Detalii se gasesc aici.

    1.3.8 Campuri ascunse

    Deseori este nevoie ca n cadrul formularului sa existe niste date care savina de pe server si sa fie trimise napoi odata cu restul datelor din formular.Aceste campuri sunt ascunse, n sensul ca nu au o aparitie vizuala pe ecran.Ele se produc cu un input de forma:

    Acest mecanism este extrem de util pentru a emula starea n aplicatiile Web(HTTP este fara stare) sau pentru a putea fi modificat pe client (browser)prin cod JavaScript, fara a fi nevoie sa se faca o cerere catre server.

    Detalii se gasesc aici.

    http://msdn.microsoft.com/en-us/library/bb415402.aspxhttp://msdn.microsoft.com/en-us/library/bb159790.aspxhttp://msdn.microsoft.com/en-us/library/bb159862.aspx
  • 1.3. FORMULARE 23

    Figura 1.9: Input-ul de tip file, dupa apasarea butonului Browse.

    1.3.9 Image

    Input-ul de tip imagine creeaza un control imagine care, atunci cand esteapasat trimite formularul catre server. Locatia imaginii este definita prinatributul src:

    1 2 3
    4 6

    cu iesirea data n figura 1.10

    Figura 1.10: Input de tip imagine

    Detalii despre acest tip de input se gasesc aici.

    http://msdn.microsoft.com/en-us/library/bb159852.aspx
  • 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 fi procesata exclusiv prin cod JavaScript, n browser. Inexemplul de mai jos la apasarea butonului se depune o valoare n textbox-ulformularului, se afiseaza o fereastra pe ecran si apoi se face submiterea for-mularului, totul prin cod JavaScript (dar oricare din actiuni este optionala):

    1 2 3 4 function myJSFunction() {5 var hiddenElement = document.getElementById("adresa");6 if (hiddenElement != null) {7 hiddenElement.value = "valoare setata din myJSFunction";8 }9 window.alert("functia myJSFunction s-a terminat");

    10 document.getElementById("formular").submit();11 }12 13 14 15 16 17
    18 20 21 22

    Rezultatul este dat n figura 1.11.

    1.3.11 Textarea

    Input-ul de tip text este convenit a contine o singura linie. Pentru cazuln care se doreste existenta unei casute text cu mai multe linii se poate folosielementul textarea:

    1 2 3

  • 1.3. FORMULARE 25

    Figura 1.11: Input de tip buton. Este aratata starea dupa apasarea butonu-lui.

    4 5

    cu reprezentarea din figura 1.12. Detalii despre ce atribute si evenimente

    Figura 1.12: Zona de text cu 20 de coloane si 4 linii.

    suporta elementul textarea - aici.

    1.3.12 Select

    Elementul select permite alegerea dintr-o lista derulanta a uneia sau amai multor optiuni. Lista de optiuni este formata din perechi de forma cheie-valoare, cheia (invizibila n pagina desenata de browser) fiind cea care setrimite catre server, iar valoarea este folosita pentru a face alegerea efectiva.Se poate specifica care este eleemntul implicit selectat:

    1 2 3 Vrancea4 Brasov5 Sibiu

    http://msdn.microsoft.com/en-us/library/bb415522.aspx
  • 26 CAPITOLUL 1. APLICATII WEB

    6 Teleorman7 8
    9

    10

    Query string-ul asociat este judete=14, iar reprezentarea este data n figura1.13.

    Figura 1.13: Reprezentarea controlului de selectare.

    Este posibila si selectarea mai multor optiuni simultan, daca n cadrulelementului select se specifica si atributul multiple:

    1 2 Vrancea3 Brasov4 Sibiu5 Teleorman6

    Daca se specifica acest atribut si niciuna din optiuni nu este selectata,atunci reprezentarea din browser este cea din figura 1.14, iar query string-ulva arata astfel: judete=33&judete=18.

    Figura 1.14: Element option cu selectare multipla.

    Detalii - aici.

    http://msdn.microsoft.com/en-us/library/aa455293.aspx
  • Capitolul 2

    ASP.NET

    2.1 Generalitati

    ASP.NET este o platforma pentru aplicatii web dezvoltata si distribuitade catre Microsoft, pe care dezvoltatorii o folosesc pentru a contrui site-uriweb dinamice si servicii web. A fost lansat n ianuarie 2002 cu versiunea 1.0a .NET Framework si este succesorul tehnologiei Active Server Pages (ASP)dezvoltata tot de Microsoft. ASP.NET a fost construit pe Common LanguageRuntime (CLR), ceea ce permite programatorilor sa scrie cod folosind oricelimbaj suportat de .NET.

    Merita mentionat ca ASP.NET este o tehnologie freeware de la Microsoft.ASP.NET poate fi folosit pentru a crea orice tip de aplicatie web, ncepand dela mici site-uri personale pana la cele de tip business. Strictul necesar pentrua programa cu ASP.NET este reprezentat de .NET Framework, care estegratuit, si de Visual Web Developer Express Edition, de asemenea gratuit.

    Aplicatiile ASP.NET sunt aplicatii web .NET complete care se executaca si cod compilat gestionat de .NET runtime. ASP.NET foloseste de ase-menea capabilitatile complete a .NET Framework-ului o gama de clase lafel de usor de nteles ca si cele pentru o aplicatie Windows obisnuita. Inesenta, ASP.NET ncearca sa estompeze linia ntre dezvoltarea de aplicatiisi dezvoltarea web prin preluarea instrumentelor si a tehnologiilor folosite deprogramatorii de aplicatii desktop.

    2.1.1 Ce e gresit la ASP-ul clasic?

    Spagetti code

    Consideram urmatorul exemplu, n care un dropdown list HTML estepopulat cu rezultatul unei interogari a unei baze de date:

    27

  • 28 CAPITOLUL 2. ASP.NET

    Acest exemplu are nevoie de 19 linii de cod doar pentru a afisa un controlHTML simplu. Dar ceea ce este mai grav e modul n care stilul de codificarediminueaza performantele aplicatiei deoarece amesteca codul HTML cu codVisual Basic. Cand pagina este procesata de catre ASP ISAPI (InternetServer Application Programming Interface), motorul de scripting de pe servertrebuie sa se activeze si sa se dezactiveze de mai multe ori pentru a gestionachiar si o singura cerere. Acest lucru creste cantitatea de timp necesarapentru a procesa ntreaga pagina si a o trimite la client. Mai mult, paginileweb scrise n acest stil pot atinge foarte usor dimensiuni dificil de stapanit.Daca se mai adauga si propriile componente COM (necesare pentru a furnizafunctionalitatea pe care ASP nu o poate asigura) cosmarul managementuluicodului creste.

    Indiferent ce abordare se foloseste, codul devine ncurcat, lung si greu dedepanat. In ASP.NET, aceste probleme nu exista. Paginile de web sunt scrisefolosind conceptele programarii orientate pe obiecte traditionale. Paginile deweb ASP.NET contin controalele care pot fi programate n mod similar cuaplicatiile desktop. Aceasta nseamna ca nu mai este nevoie de combinareaunui set de marcaje HTML si cod inline. Daca se opteaza pentru abordareacode behind atunci cand se creaza paginile ASP.NET, atunci codul si marca-jul sunt de fapt plasate n doua fisiere diferite, ceea ce simplifica ntretinerea

  • 2.1. GENERALITATI 29

    codului si permite separarea sarcinii de design a paginii web de cea destul dedificila a programarii.

    Limbajele de scriptare

    La momentul crearii sale, ASP parea o solutie perfecta pentru dezvol-tatorii de aplicatii desktop care vroiau sa treaca la dezvoltare web. Maidegraba decat sa necesite nvatarea unui limbaj de programarea cu totulnou, ASP a permis dezvoltatorilor sa foloseasca limbaje familiare cum ar fiVBScript. Folosind deja popularul COM (Component Object Model) ca ocoloana vertebrala, aceste limbaje au actionat ca un vehicul pentru accesareacomponentelor si resurselor de pe server. Dar desi ASP era usor de ntelespentru dezvoltatorii care erau deja obisnuiti cu limbaje precum VBScript,aceasta familiaritate a avut un pret. Deoarece ASP a fost bazat pe tehno-logii vechi, ce au fost initial create pentru aplicatii desktop, acestea nu auputut sa functioneze la fel de bine n noul mediu de dezvoltare web.

    Performanta nu a fost singura problema. Fiecare obiect sau variabila uti-lizata n ASP clasic era creata ca un tip de data variant. Asa cum mareparte din programatorii in Visual Basic stiu, tipul de data variant este slabtipizat, avand nevoie de cantitati mari de memorie, iar tipul exact este cu-noscut doar la momentul rularii. De aici rezulta ca au performante mult maislabe decat variabilele explicite. De asemenea, cu acest tip de variabile eraimposibil de creat un IDE1 care sa ofere facilitati de debugging, IntelliSense(recunoasterea elementelor lexicale) si verificarea erorilor.

    2.1.2 Ce aduce ASP.NET?

    Majorele diferente dintre ASP.NET si platformele de dezvoltare existenteinclud urmatoarele:

    ASP.NET propune un modelul de programare n ntregime obiect-orientat,care include o arhitectura bazata pe evenimente si controale, care ncurajeazancapsularea si refolosirea codului;

    ASP.NET ofera posibilitatea de a programa n orice limbaj acceptat de.NET;

    ASP.NET sprijina ideea de executare rapida: paginile si componenteleASP.NET sunt compilate (fie la prima cerere, fie la instalarea site-uluipe server), n loc de a fi interpretate de fiecare data cand acestea suntutilizate; a se vedea figura 2.1.

    1Integrated Development Environment, mediu integrat de dezvoltare.

  • 30 CAPITOLUL 2. ASP.NET

    modul de programare este orientat pe obiecte; orice pagina este vazutaca un obiect, derivat din clasa pusa la dispozitie de .NET Framework;

    are un mecanism ncorporat care permite pastrarea starii paginii (chiardaca 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 beneficii notabileprecum: managementul automat al memoriei prin garbage collection;tipuri de date sigure, verificabile; manipularea structurata a erorilor;fire de executie - pentru fiecare cerere facuta de catre un client, selanseaza un fir de executie separat;

    usor de distribuit2 si configurat.

    2.2 Despre ASP.NET 3.5

    2.3 Tipuri de fisiere n ASP.NET

    Intro aplicatie web sunt disponibile urmatoarele tipuri de fisiere:

    fisiere cu extensia aspx pagini web asp.net; ele contin interfata uti-lizator si optional cod (JavaScript, C#);

    fisiere cu extensia ascx controale utilizator ASP.NET; reprezintacontroale personalizate, dezvoltate de programatori, prin care se ex-tinde paleta de controale cu care vine ASP.NET; aceste controale potfi adaugate n pagini aspx;

    fisiere cu extensia asmx sau svc servicii web ASP.NET (prima exten-sie) sau servicii implementate prin Windows Communication Founda-tion (WCF);

    web.config fisier de configurare a aplicatiei Web pentru ASP.NET;contine stringuri de conexiune catre baza de date, configurari relativ lamanagementul starii, al securitatii etc;

    2In sens de: deploy.

  • 2.3. TIPURI DE FISIERE IN ASP.NET 31

    Figura 2.1: Compilarea n doua trepte pentru aplicatie ASP.NET [2].

  • 32 CAPITOLUL 2. ASP.NET

    global.asax fisier global al aplicatiei; se foloseste pentru a implementacod de reactie la evenimente ale aplicatiei, precum pornirea sau oprireaei;

    fisiere cu extensia cs (daca este vorba de o aplicatie ASP.NET cuC#), este partea de codebehind care prelucreaza pe server eveni-mentele survenite pe partea de browser si ciclul de viata al paginilor.Se obtine astfel separarea partii de interfata utilizator de cea de codexecutat pe server;

    fisiere cu extensia ashx HTTP handlers, pentru returnarea de continutcare sa nu fie pagina web;

    fisiere cu extensia axd folosite pentru urmarirea aplicatiei (tracing);

    fisiere cu extensia master pentru master pages;

    fisiere cu extensia resx pentru internationalizarea si localizarea aplicatiilorASP.NET;

    fisiere cu extensia sitemap pentru crearea structurii site-ului;

    fisiere cu extensia skin pentru crearea de teme (skinuri).

    2.4 Modelul de cod

    O pagina web aspx este compusa din cod ASP.NET de forma:

    cod HTML; acesta este interpretat de catre browser;

    controale web; acestea se recunosc prin tagurile care incep cu prefixulasp:, ca de exemplu:

    Controalele web sunt procesate pe server si vor produce cod HTMLcare este inteligibil pentru un browser.

    cod C# sau VB.NET

  • 2.4. MODELUL DE COD 33

    Acest ultim cod este executat pe server (deci browserul nu trebuie sa aibeniciun tip de suport pentru executarea de cod .NET); relativ la locatia ncare se poate depune acest cod, avem posibilitatile:

    1. cod inline, adica scris n interiorul paginii aspx; utilizat pentru paginiweb simple;

    2. cod n spate3, ntr-un document separat cu extensia cs (daca este codC#). Este modelul preferat pentru dezvoltarea de pagini.

    Alegerea ntre aceste doua modalitati este posibila la crearea unei noi paginiweb, prin checkbox-ul Place code in separate file.

    Pentru primul caz, codul paginii aspx este:

    1 23 56 78 protected void myButton_Click(object sender, EventArgs e)9 {

    10 myLabel.Text = "Buton apasat la: " +11 DateTime.Now.ToLongTimeString();12 }13 1415 16 17 18 19 20 21 22 24 25 26 27

    3In original: code behind.

  • 34 CAPITOLUL 2. ASP.NET

    28

    Pentru code behind, se obtin doua fisiere: pagina DemoCodeBehind.aspxsi fisierul sursa DemoCodeBehind.aspx.cs.

    1 34 67 8 9

    10 11 12 13 14 16 17 18 19 20

    Partea de code behind este scrisa astfel:

    1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Web;5 using System.Web.UI;6 using System.Web.UI.WebControls;78 public partial class DemoCodeBehind : System.Web.UI.Page9 {

    10 protected void Page_Load(object sender, EventArgs e)11 {1213 }14 protected void myButton_Click(object sender, EventArgs e)

  • 2.4. MODELUL DE COD 35

    15 {16 myLabel.Text = "Buton apasat la: " +17 DateTime.Now.ToLongTimeString();18 }19 }

    Browserul va primi acelasi cod, deoarece interpretarea partii de C# siASP.NET se face de catre server. Este indicata folosirea variante de codebehind, deoarece asta permite separarea partii de layout (ce este n sarcinaunui designer) de cea de cod (sarcina de programator). In restul lucrarii nevom referi doar la modelul de codebehind.

    Conectarea dintre pagina aspx si codebehind se face prin intermediuldirectivei Page de pe primul rand. Remarcam ca se specifica unde se aflapagina de codebehind (atributul CodeFile); de asemenea faptul ca paginaaspx este de fapt un obiect, derivat din clasa care contine code-behind (atri-butul Inherits). Controalele declarate n pagina aspx vor fi create automat,ntr-o clasa partiala, care completeaza n mod transparent codul din fisierulDemoCodeBehind.aspx.cs. Astfel, pentru declaratia din pagina aspx:

    serverul va genera automat declaratia de camp:

    protected global::System.Web.UI.WebControls.Label myLabel;

    Acest lucru era vizibil n ASP.NET 1.1, prin cod generat automat de catredesigner n fisierul de code behind; pentru versiunea ASP.NET 2.0 sau mainoua, aceasta declaratie este generata automat de catre server4. Se remarcaaici calificarea cu protected a campului, pentru a fi disponibil si n paginaaspx derivata. O vedere a acestui cod se poate obtine din Visual Studio,meniul ViewWiew Code Gen File.

    Evenimentele (precum apasarea de buton, schimbarea itemului curentselectat dintr-o lista de optiuni, ncarcarea paginii) sunt tratate prin metoden partea de codebehind. In exemplul dat mai sus se observa ca evenimentulde apasare a butonului este procesat prin metoda (n acest context: eventhandler, manipulator de metoda) myButton_Click, iar legatura se specificaprin atributul onclick din pagina aspx. Se poate face si atasarea eventhandlerului prin cod:

    4Codul dat a fost preluat din locatia n care modulul de ASP.NET si depo-ziteaza aceste fisiere, %systemroot%\Microsoft.NET\Framework\v2.0.50727\TemporaryASP.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 dinclasa de baza System.Web.UI.Page. Apelul automat al metodei face partedin ciclul de viata al unei pagini, subiect tratat ulterior.

    2.5 Controale Web si controale HTML

    Un control Web reprezinta o clasa (exemplu: System.Web.UI.WebControls.Label)care poate fi utilizata pe parte de codebehind; are un aspect vizual, ge-neranduse cod HTML de catre server, cod care poate fi interpretat de brow-ser; are de asemenea aspect comportamental evenimente si proprietati de exemplu un obiect de tip Label poate sa suporte modificari prin latime,text, culoare, vizibilitate. Avantajul acestor controale este ca permit genera-rea de cod HTML complex, fara ca programatorul sa fie interesat de detalii:eticheta de mai sus va genera un element de tip pentru browser.Exemplul devine mai elocvent pentru controale Web de tipul Calendar sauforma de login. In plus, se creeaza programatorului iluzia ca modul de dezvol-tare al aplicatiilor web este foarte asemanator cu cel folosit pentru aplicatiilede tip Windows Forms, unde exista o abundenta de controale.

    Din exemplul de mai sus, se observa atributul runatcu valoarea server care este mandatoriu (ca prezenta si valoare) pentrucontroalele web. Valoarea atributului id reprezinta numele variabilei cu carese acceseaza controlul pe parte de server.

    La cealalta extrema se afla codul HTML simplu, care este direct interpre-tat de catre browser. Problema cu acest cod este ca nu poate fi accesat decatre code behind. Pentru a se permite accesarea programatica, sa introdusconceptul de control HTML. Un control HTML se obtine din codul HTMLprin adaugarea a doua atribute: runat cu valoarea server si id avand dreptvaloare un nume de variabila:

    Accesarea lui n code behind se face cu:

    myHiddenField.Value = "valoare setata de pe code behind";

    De remarcat ca si pentru aceste controale HTML se face interpretare peserver, deoarece codul din browser nu prezinta atributul runat; runat esteinterpretat de catre mediul ASP.NET si este eliminat la trimiterea spre brow-ser.

  • 2.6. FORME WEB 37

    2.6 Forme Web

    O foma web (denumirea consacrata sub care sunt cunoscute paginile webaspx) reprezinta partea centrala a unei aplicatii ASP.NET. Exista doua partiale unei astfel de forme web:

    partea care se afiseaza pe client cod HTML, rezultat prin executareacodului ASP.NET

    partea care se afla pe server, adica pagina aspx, clasa de code behindsi cod .NET apelat de catre programator

    Evident, trebuie sa existe o comunicare ntre aceste doua parti. Spre exem-plu, daca este vorba de o pagina care permite unui utilizator sa si facacont, datele specificate n pagina web sunt trimise prin formular (a se ve-dea 1.3) napoi catre server; acesta este numit n jargon postback; serverulreceptioneaza acest formular si poate sa execute o secventa de pasi: vali-darea datelor din formular, crearea contului. Pagina apelata va formula unraspuns (cod HTML) pe care l va trimite browserului. Dupa aceasta, ciclulse poate relua. Trimiterea formularului ete un mecanism de baza specificatde protocolul HTTP; ASP.NET nu aduce nimic nou aici.

    Unul din mecansimele esentiale pentru o usoara dezvoltare a unui for-mular este pastrarea starii. Desi foloseste mecanism clasic (campuri as-cunse), modul transparent n care este integrat n framework duce la re-ducerea substantiala a codului. In lipsa acestui mecansim, n Java sau PHPtrebuie facuta o implementare manuala.

    2.6.1 Postback

    Sa presupunem ca avem pagina default.aspx care contine anumite date(de exemplu, lista studentilor din Facultatea de Matematica si Informatica).Atunci urmatorul scenariul poate avea loc:

    1. Un utilizator cere prin browser aceasta pagina. Serverul IIS primestecererea, determina faptul ca este o pagina aspx si invoca motorul ASP.NETpentru a o executa. Motorul creeaza pagina si controalele continute, seexecuta codul de initializare detalii la sectiunea 2.6.4 apoi paginaeste creeata ca sir de caractere HTML si returnata clientului. Obiectulpagina si controalele incluse sunt distruse (adica devin neutilizabile; sane amintim ca protocolul de comunicare este fara stare, deci pe servernu e obligatoriu sa mentina resursele folosite anterior).

  • 38 CAPITOLUL 2. ASP.NET

    2. O data pagina trimisa catre browser, este randul utilizatorului sa pro-duca actiunea de trimitere napoi a paginii, de exemplu prin apasareaunui buton de tip Submit.

    3. Formularul din pagina este trimis napoi la server, catre pagina defa-ult.aspx (acesta este comportamentul implicit pentru ASP.NET, dar sepoate modifica). Motorul ASP.NET primeste iarasi cerere si recreeazapagina (deoarece pagina anterioara, de la pasul 1 a fost dealocata) depe server; aceasta refacere va restabili totusi valorile controalelor lastarea anterioara, prin mecansimul de viewstate sectiunea 2.6.2.

    4. ASP.NET determina care a fost actiunea care a determinat trimitereanapoi si executa event handlerele asociate (metoda myButton_Click,de exemplu). Un asemenea event handler executa o operatie de modifi-care a continutului formei web (myLabel.Text=...), eventual apelandla cod pentru extragere de date de pe un server de baze de date, etc.

    5. Pagina default.aspx cu continutul astfel modificat este transformatan cod HTML si trimisa serverului. Obiectele folosite pentru creareaacestui raspuns sunt disponibilizate. Ciclul se reia de la pasul 2.

    Postback-ul poate fi declansat si de o alta actiune decat apasarea unui bu-ton de tip submit; de exemplu, la adaugarea de control web de tip dropdownlist, se poate specifica n Visual Studio, prin proprietatea de tip booleanAutoPostback daca modificarea itemului curent selectat duce la trimitereaautomata a formularului catre server. Acest mecanism este util pentru cazuln care exista un dropdown list cu judete; alegerea unui anumit judet necesitamodificarea unui alt dropdown list care contine localitatile din judetul curentselectat. Efectul se obtine prin cod JavaScript care actioneaza pe client, codeste injectat automat de catre frameworkul ASP.NET, sub forma:

    1 2 //

    10 theForm.__EVENTARGUMENT.value = eventArgument;11 theForm.submit();

  • 2.6. FORME WEB 39

    12 }13 }14 //]]>15

    Se observa ca avem tot o trimitere de formular, dar dictata de cod. __EVENTTARGETsi __EVENTARGUMENT sunt doua campuri ascunse ce sunt populate cu detaliidespre cine a produs acest postback si eventualele detalii aferente. Dropdownlist-ul este generat n cod HTML astfel:

    1

    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 capostback-ul este disponbil doar pentru controale web.

    Pentru a determina pe parte de code behind daca cererea e postback saunu, se poate folosi proprietatea de tip boolean Page.IsPostBack; aceastaare valoarea true daca este un postback, false altfel. Mecanismul este utilpentru ca de regula la postback se face umplerea controalelor cu valori dintr-o sursa de date, n timp ce la postback acest lucru (de regula costisitor) sepoate evita daca se foloseste mecanismul de viewstate.

    2.6.2 Mentinerea starii prin Viewstate

    In lipsa mecanismului de Viewstate (care poate fi inhibat la nivel decontrol), la fiecare postback s-ar reface pagina la starea initiala, pierzanduse valorile depuse anterior n controale. De exemplu, daca la procesareaanterioara (a doua cerere catre pagina) sa setat continutul unei etichetela o anumita valoare, la a treia cerere aceasta valoare sar pierde. Esteexplicabil, deoarece HTTP este protocol fara stare, iar serverul nu mentinede la o cerere la alta valorile actuale ale controalelor. De regula, asemeneaefect este nedorit.

    Mecansimul prin care se pastreaza ultima valoare a unui control (fie elweb sau HTML) este viewstate. Pentru fiecare web control se poate setavaloarea EnableViewState la true (de fapt, valoarea implicita), prin astasemnalanduse ca se va mentine starea. Mentinerea se face prin intermediulunui camp ascuns numit __VIEWSTATE n cod HTML si accesat cu variabilaViewState pe parte de code behind. Pentru un control HTML trebuie sa sespecifice enableviewstate=true.

  • 40 CAPITOLUL 2. ASP.NET

    In codul HTML generat pentru browser contine un string cu o codificareBase64 a starii controalelor (contine starea tuturor controalelor care au ex-primata optiunea de viewstate). Acest camp este procesat de catre server pepartea de code behind, n mod automat, o data la postback, apoi nainte detrimitere a raspunsului catre client.

    Modul n care lucreazviewstateul pentru prima cerere si pentru postbackurile ulterioare este redat n figurile 2.2 si 2.3 ([2]).

    Figura 2.2: Modul de lucru pentru viewstate la prima cerere [2].

    In acest fel eliberarea resurselor necesitate de catre server pentru procesa-rea paginii pot fi eliberate fara problema; apare nsa cazul unui camp ascunscare va fi plimbat permanent ntre client si server, ceea ce duce la ngreunareacomunicarii (pagina mai mare trimitere mai lenta). De regula, pentru opagina Web se folosesc o multime de controale, care implicit au partea deviewstate neinhibata, deci se poate ajunge la dimeniuni mari pentru campulascuns; se mai ia aici n calcul si expandarea intrinseca indusa de codificareaBase64.

    Pentru contracararea acestui efect, reamintim ca sunt controale a carorstare nu se schimba n timp (e.g. butoane), sau a caror stare este refacuta defiecare data, pentru care dezactivarea optiunii de viewstate poate nsemnao economie importanta de spatiu. De asemenea, evitarea stabilirii valoriipentru controale prin cod (si precizarea lor la designul paginii aspx) reduceviewstate-ul.

    Exista chiar situatii cand pagina cu o dimensiune prea mare a campurilorascunse sunt blocate de catre proxy-uri. Pentru aceasta, viewstateul poatefi spart n mai multe bucati; detalii se gasesc n [2], pagina 81 (View State

    http://en.wikipedia.org/wiki/Base64
  • 2.6. FORME WEB 41

    Figura 2.3: Modul de lucru pentru viewstate pentru postback [2].

    Chunking).In final, menctionam ca viewstate se poate folos nu doar de catre con-

    troalele din pagina, ci si de catre programator, permitanduse adagarea siregasirea unor perechi de forma (cheie, valoare).

    2.6.3 Utilitatea conceptului de controale

    Sa consideram forma web:

    1 45 78 9

    10 11 12 13

  • 42 CAPITOLUL 2. ASP.NET

    14 15 16 17 18 19
    20 22
    23 25
    26 29 30 31 32

    La trimiterea conform selectiei din figura 2.4, query string-ul arata astfel(fragment, am omis viewstate-ul si alte campuri ascunse):

    txtName=Rafael&chkApples=on&btnSend=Trimite

    Figura 2.4: Pagina web obtinuta cu controale web.

    In codebehind, valoarea controalelor se poate accesa cu5:

    1 if (Request.Form["chkApples"] == "on"2 && Request.Form["chkPears"] != "on") ...

    5Daca transmiterea de parametri se face cu metoda get si nu cu post, atunci n loc deRequest.Form se foloseste Request.QueryString.

  • 2.6. FORME WEB 43

    Este nsa mai natural a se interpreta cele doua casute de checkbox ca nistecomponente care au o proprietate, Checked, de tip boolean; de asemenea,casuta de text poate sa fie accesata foarte usor:

    1 string name = txtName.Text;2 if (chkApples.Checked && !chkPears.Checked)3 {4 txtName.Text += " vrea doar mere";5 }

    Astfel, consultarea valorilor de pe formular este simpla, n maniera de reali-zare a aplicatiilor de tip Windows Forms. In cele de mai sus, Request esteun obiect de tip HttpRequest pus la dispozitie prin mostenire din clasa Page,pentru a avea acces la datele cererii dinspre client catre server.

    Acelasi mecanism este valabil si pentru controalele HTML:

    1 Nume
    2 Vreau mere
    4 Vreau pere

    cu procesarea pe code behind (atentie la modul de accesare a textului dininputul de tip text):

    1 if (chkApples2.Checked == true && chkPears2.Checked == false)2 {3 txtName2.Value += " vrea doar mere";4 }

    2.6.4 Ciclul de viata al unei pagini (varianta sumara)

    Pasii parcursi de la primirea unei cereri pentru o forma web pana lafurnizarea raspunsului catre client sunt:

    1. initializarea paginii

    2. instantierea codului utilizator

    3. validare

    4. procesarea de evenimente

    5. legarea automata la date

    6. disponibilizarea de resurse

  • 44 CAPITOLUL 2. ASP.NET

    Initializarea paginii

    La acest pas se creeaza pagina ASP.NET (se instantiaza atat clasa co-respunzatoare portiunii de codebehind, cat si cea corespunzatoare paginiiaspx); controalele sunt instantiate. Daca pagina nu este prima data ceruta decatre acest browser (adica daca este un postback), atunci se face restaurareastarii 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 ncode behind). Aici de regula se scrie cod care face ncarcarea datelor npagina.

    Validarile

    Uneori se cere ca valorile furnizate de catre utilizator n browser sa satis-faca anumite cerinte. Procesul de validare (care se poate efectua si de catrecodul JavaScript de pe client, dar nu obligatoriu) trebuie sa fie ndeplinit pen-tru a se asigura ca valorile cu care urmeaza sa se lucreze au relevanta. In cazcontrar, 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 postbackautomat

    rspuns de tip schimbare: daca sa stabilit un event handler pentru unanumit control, dar nu s-a precizat AutoPostback=true, si n plus sedetecteaza (prin comparatie cu valorile din viewstate) ca a aparut oschimbare n starea controlului, atunci se exectua acest event handler.

    Procesarea evenimentelor de tip schimbare se face nainte de procesarea eve-nimentelor de tip raspuns imediat.

    Legare automata la date

    Fenomenul se va detalia ntrun capitol ulterior. Este vorba de con-troale care se leaga la surse de date. Acestea si pot remprospata automatcontinutul, dupa ce eventualele modificari / adaugari / stergeri de date.

  • 2.6. FORME WEB 45

    Disponibilizarea resurselor

    Se genereaza pagina HTML car eva fi trimisa catre browser. Obiecteleinstantiate pentru aceasta cerere devin neutilizabile.

  • 46 CAPITOLUL 2. ASP.NET

  • Capitolul 3

    Forme Web, gestiunea starii

    3.1 Forme Web (continuare)

    3.1.1 Colectia de controale din pagina

    O pagina reprezinta un container pentru controalele dispuse pe ea; uncontrol poate de asemenea sa fie de tip container (e.g. Panel, MultiView).Regasirea unui control copil continut se face fie prin iterarea peste colectiaControls, fie prin folosirea metodei FindControl(string id). Proprietateasi metoda amintita sunt mostenite din clasa System.Web.UI.Control, bazaa tot ceea ce nseamna controale server.

    3.1.2 Request

    Proprietatea Request reprezinta obiect de tipul System.Web.HttpRequestasociat cererii HTTP efectuate de browser. Exista urmatoarele metode siproprietati (lista este incompleta):

    Browser permite accesarea descrierii proprietatilor browserului folo-sit de client (tipul, numele, versiunea, platforma, capabilitati etc);

    Cookies permite accesarea cookie-urilor trimise de site catre browser;

    Form permite accesarea formularului si a continutului sau;

    QueryString pentru accesarea parametrilor interogarii facute pringet;

    URL, URLReferrer adresa curenta, respectiv adresa paginii din caresa facut cererea curenta;

    47

  • 48 CAPITOLUL 3. FORME WEB, GESTIUNEA STARII

    UserHostName, UserHostAddress adresa si numele calculatoruluide pe care sa facut interogarea;

    UserLanguages lista de limbi pe care o are setata browserul clientu-lui; utila pentru internationalizare.

    Pentru o lista completa a metodelor si proprietatilor, invitam consultareaMSDNului.

    3.1.3 Response

    Desi rar folosit, acest obiect, instanta a clasei System.Web.HttpResponseda acces la cateva mecanisme, printre care:

    setarea de cookie-uri ce sunt trimise spre client via proprietateaCookies;

    saltul la o pagina noua via metoda Redirect; n felul acesta, de peserver se trimite un mesaj browserului prin care este instruit sa cearapagina indicata de server; se poate face redirectare la orice fel de pagina(chiar si la una de tip htm), aflata oriunde (chiar si pe un alt server);

    determinarea starii de conectare a clientului prin interogarea pro-prietatii boolene IsClientConnected; daca raspunsul este false,atunci se poate renunta la o procesare consumatoare de resurse pepartea de server;

    trimiterea de continut, altceva decat sir de caractere via proprieta-tea ContentType; tipurile posibile de continut sunt prevazute de catrespecificatiile MIME type.

    lucrul direct cu fluxul de iesire catre client, prin proprietatea OutputStream.

    3.1.4 Server

    Obiectul Server, de tip System.Web.HttpServerUtility da acces la me-tode auxiliare pentru procesarea de cereri web. Deosebit de utile sunt me-todele HtmlEncode si duala ei HtmlDecode. Daca codul ASP.NET posteazacontinut de tip sir de caractere n pagina, este obligatoriu a se face codificarealor conform canoanelor HTML, altfel caractere precum < sau > pot produceravagii n pagina; ele trebuie codificate ca fiind < respectiv >.

    Similar, substituirea corecta a caracterelor n adree, se folosesc metodeleUrlEncode si UrlDecode. Pentru determinarea caii fizice corespunzatoare

    http://en.wikipedia.org/wiki/MIME_type
  • 3.2. TIPURI DE CONTROALE SERVER 49

    unui fisier de pe site se foloseste metoda MapPath(). In sfarsit, pentrutransferarea la o alta pagina, fara a se face redirectare prin browser (ca laResponse.Redirect), se poate folosi Server.Transfer(), cu restrictia catransferul sa se faca doar catre pagina ASP.NET de pe acelasi server.

    3.2 Tipuri de controale server

    Exista doua tipuri majore de controale, asa cum s-a specificat si n 2.5:controale server HTML si controale server Web. Acestea din urma cunoscspecializarile: 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 potprocesa ca obiecte pe server, avand deci un tip de date reprezentat pe plat-forma .NET. Clasa de baza pentru orice control este clasa System.Web.UI.Control,care e derivata de clasa System.Web.UI.WebControls.WebControl, repre-zentand baza pentru controalele de tip server si System.Web.UI.HtmlControls.HtmlControls,baza pentru controalele server HTML. Clasa Control contine si transmitederivatilor proprietatile si metodele:

    ClientID proprietate ce returneaza identificatorul fiecarui control dinpagina HTML; acesta va putea fi utilizat n JavaScript, prin functiadocument.getElementById();

    Controls proprietate care returneaza o colectie de controale copil aleobiectului curent. De exemplu, un control declarat cu asp:TextBoxeste copil al formularului;

    EnableViewState returneaza sau seteaza o valoare logica specificanddaca ultima stare setata pentru un control va fi sau nu salvata nViewState (proprietate a paginii, care va fi transformata n campulascuns __VIEWSTATE).

    ID este identificatoru controlului, adica numele de variabila cu carese 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, specificand daca controlul estevizibil sau nu;

    DataBind() se face popularea controlului la surse de date;

  • 50 CAPITOLUL 3. FORME WEB, GESTIUNEA STARII

    FindControl() se cauta recursiv un control cu un anumit nume ncontrolul curent;

    HasControl() returneaza true sau false, aratand daca controlulcurent are sau nu controale copil;

    Render() se scrie codul HTML asociat controlului curent; metodase apeleaza de regula de catre motorul de ASP.NET si nu direct deprogramator.

    3.2.1 Controale server HTML

    Sunt din trei categorii mari: controale de tip input (e.g. butoane, check-box, casute de text etc), controale de tip container (formular, tabel, textareaetc) si grupul format din HtmlImage, HtmlLink, HtmlTitle. Clasa de bazaeste HtmlControl, iar proprietatile expuse sunt:

    Attributes proprietate care permite accesarea sau adaugarea de atri-bute;

    Disabled returneaza sau seteaza starea de inhibare a controlului;daca are valoarea true, va fi afisat pe pagina, dar cu culoare gri deschis;

    Style permite accesarea sai modificarea stilurilor CSS pentru con-trolul curent;

    TagName returneaza numele controlului.

    Un control de tip HtmlContainerControl reprezinta un control HTMLcare are atat eticheta de deschidere, cat si de nchidere, cum ar fi a sau img.Pe langa cele mostenite din HtmlControl, mai avem proprietatile:

    InnerHtml returneaza sau seteaza textul HTML dintre etichetele dedeschidere 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 modificareacaracterelor care au semnificatie HTML predefinita (, ghilimele etc)sunt nlocuite cu codificari corespunatoare (, " etc).

    Clasa HtmlInputControl este folosita ca baza pentru controalele care per-mit interactiunea cu utilizatorul, cum ar fi , . Fata de cele mostenite din HtmlInputControl, se mai punla dispozitie proprietatile:

  • 3.2. TIPURI DE CONTROALE SERVER 51

    Type obtine tipul unui obiect HtmlInputControl;

    Value obtine sau seteaza continutul pentru controlul curent.

    Exemplu: sa presupunem ca avem codul HTML:

    1

    iar pe partea de code-behind codul (fragment):

    1 protected void Page_Load(object sender, EventArgs e)2 {3 myTextBox.Style["font-size"] = "30px";4 myTextBox.Style["color"] = "red";56 myTextBox.Value = "Introduceti numele";7 myTextBox.Attributes["onfocus"] =8 "alert(numele de familie)";9 }

    La rulare codul HTML generat va fi (fagment):

    1

    cu efectul din figura 3.1.

    Figura 3.1: Setarea de proprietati pentru controale server HTML

    Controalele server HTML pot manipula doua evenimente pe parte deserver:

    ServerClick este un click procesat de partea de code-behind; deexemplu, pentru codul:

  • 52 CAPITOLUL 3. FORME WEB, GESTIUNEA STARII

    1 apasa aici

    si implementarea n partea de code-behind:

    1 protected void MyServerClick(object sender, EventArgs e)2 {3 Response.Redirect("http://www.clusty.com");4 }

    nu se va deschide pagina de Google, ci cea setata de catre codul C#.Efectul se obtine deoarece apasarea pe link nu e procesata de catrebrowser n modul natural, ci are loc trimiterea formularului napoi catreserver, asa cum se poate deduce din codul HTML rezultat:

    1 2 apasa aici

    Acest tip de eveniment este disponibil doar pentru o parte din controa-lele server HTML.

    ServerChange se declanseaza atunci cand se modifica continutul unuicontrol poate avea stari diferite: text, checkbox etc. De exemplu:

    1 3
    4 5
    6

    cu partea de code-behind (fragment):

    1 protected void MyServerChange(object sender, EventArgs e)2 {3 myLabel.Text = myCheckbox.Checked.ToString();4 }

    La apasarea butonului de tip Submit se va executa pe server metodaMyServerChange. In acest caz, schimbarea starii casutei de optiune nuduce automat la trimiterea formularului catre server, dupa cum se poateconstata din inspectarea codului HTML obtinut - lipseste procesareaunui eveniment de tip JavaScript.

  • 3.3. GESTIUNEA STARII IN ASP.NET 53

    3.2.2 Controale Web server

    Reprezinta clase din spatiul de nume System.Web.UI.WebControls, ganditepentru a extinde gama de controale HTML; un control de tip Web server arenu doar o reprezentare grafica mai bogata datorita unui cod bogat de HTMLcare se genereaza automat ci si un comportament mai orientat catre comu-nicarea cu serverul. Clasa de baza este WebControl, care expune mult maimulte proprietati si metode decat analoagele lor de tip HTML server control.Spre exemplu, se pune la dispozitie proprietatea Font prin care se specificaproprietatile fontului curent: corp de litera, culoare, decorare, marime etc.Se elimina astfel necesitatea de a sti foarte bine numele atributelor CSS sivalorile lor, deoarece clasele folosite sunt facute astfel ncat sa furnizeze doarvalorile acceptabile.

    Toate controalele se declara n pagina aspx cu sintaxa ,au automat proprietatea runat cu valoarea setata pe server mai mult, dacaatributul lipseste, se declara eroare de compilare.

    Spre deosebire de controalele HTML server, fiecare control server Webdispune de metoda Focus() care poate fi utilizata pe parte de code-behindpentru a selecta acel control ca fiind cel curent. Pentru o casuta de textcu identificatorul myTextbox, apelul myTextbox.Focus() duce la injectareaurmatoarei sectiuni n codul paginii HTML rezultate:

    1 2 4

    unde functia JavaScript WebForm_AutoFocus provine dintr-un fisier de re-surse pus la dispozitie de catre ASP.NET, numit WebResource.axd.

    Daca pe un formular sunt dispuse mai multe butoane, este posibila spe-cificarea unui buton ca fiind implicit adica apasarea lui tastei Enter sa fieinterpretata ca apasarea pe acest buton. Specificarea lui se face prin interme-diul formularului, care prin atributul DefaultButton poate specifica ID-ulbutonului care va fi considerat ca implicit. De asemenea, daca se folosescpanouri (), acestea putand grupa mai multe butoane, se poatespecifica la nivel de panou care e butonul implicit.

    3.3 Gestiunea starii n ASP.NET

    HTTP este un protocol care nu pastreaza starea. Motorul de ASP.NETdistruge obiectele pe care le-a format pentru a raspunde cererii clientului. De

  • 54 CAPITOLUL 3. FORME WEB, GESTIUNEA STARII

    multe ori, nsa, este nevoie ca ntre doua cereri succesive o anumita informatiesa fie pastrata si recuperata dace este nevoie de ea. Exemplul clasic este cosulde 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 fi inspectat sau modificatde 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. Profilul

    7. Caching

    Vom prezenta doar primele cinci metode. O comparatie a lor se gaseste ntabelele 3.1 si 3.2.

    Tabela 3.1: Optiuni de management al starilor (1).

    View State Query String Cookie-uri utilizatorTipuri de date Tot ce e Un numar limitat Siruri de caracterepermise serializabil de caractereStocare Un camp ascuns Adresa URL din Memoria (RAM/HDD)

    n pagina browser a calc. clientuluiDurata de Permanent retinut se pierde cand se Setat de programatorviata la postback-uri introduce o noua

    adresaVizibilitate Pagina curenta Pagin tinta Intreaga aplicatie

    ASP.NETSecuritate Usor de citit, Vizibil n clar, Nesigur, poate fi

    relativ greu de modif. usor de modificat modificat de utiliz.poate fi criptat

    Performanta Nu afecteaza serverul Buna, deoarece datele Buna, deoarecedar poate ngreuna sunt putine datele sunt putinecomunicatia

  • 3.3. GESTIUNEA STARII IN ASP.NET 55

    Tabela 3.2: Optiuni de management al starilor (2).

    Sesiune ApplicationTipuri de date Orice tip serializabil Orice tip .NETpermiseStocare Memoria serverului sau Memoria serverului

    baza de dateDurata de Expira dupa un t de la Durata de viataviata ultima accesare a serverului a aplicatieiVizibilitate In toata aplicatia, In toata aplicatia,

    n cadrul unei sesiuni globalSecuritate Sigur, deoarece datele nu Foarte sigure, deoarece datele nu

    sunt trimise la client sunt trimise la clientPerformanta Sesiuni mari server lent Multe date server lentUtilizare Stocare de cumparaturi Variabile globale

    3.3.1 ViewState

    Stocheaza datele n interiorul paginii curente, sub forma unui camp as-cuns. La orice trimitere de formular cu atre server, acest camp este proiectatnapoi. Este de regula folosit pentru a stoca ultima valoare a unui control (sise include aici si setare privind stilul controlului, nu doar continutul); poatefi de asemenea mbogatit cu perechi de forma cheievaloare, care ulteriorpot fi modificate sau sterse.

    1 ViewState["Counter"] = 1;2 ...3 int counter;4 if (ViewState["Counter"] != null)5 {6 counter = (int)ViewState["Counter"];7 }

    Cheia este de tip sir de caractere; se poate folosi drept valoare orice tip dedate serializabile (care are atributul [Serializable] definit atat pentru elcat si pentru clasele din care este wderivat, direct sau nu).

    Exemplu: clasa Customer definita de programator precum:

    1 [Serializable]2 public class Customer3 {

  • 56 CAPITOLUL 3. FORME WEB, GESTIUNEA STARII

    4 public string FirstName;5 public string LastName;6 public Customer(string firstName, string lastName)7 {8 FirstName = firstName;9 LastName = lastName;

    10 }11 }

    poate fi instantiata si stocata n ViewState:

    1 Customer cust = new Customer("Rafael", "Popescu");2 ViewState["CurrentCustomer"] = cust;

    respectiv refacut cu:

    1 Customer cust = ViewState["CurrentCustomer"] as Customer;

    Aici este important faptul ca campurile FirstName si LastName sunt seriali-zabile (proprietate implicita a clasei String). Daca sunt campuri dintr-un tipneserializabil, sau daca nu se doreste serializarea lor, atunci acestea trebuiesa fie prefixate cu atributul [NonSerializable].

    Situatiile n care nu se recomanda folosirea ViewState-ului pentru mentinereadatelor sunt:

    datele au caracter confidential; codificarea prin Base64 este reversibilasi usor de citit; mai mult, se poate modifica acest continut cu un efortmediu (vezi [2]);

    se foloseste o informatie care trebuie sa fie accesibila pentru mai multepagini; n acest caz sunt mai indicate sesiunea, query string-ul saucookie-urile;

    datele ce trebuie stocate sunt voluminoase, ceea ce ngreuneaza comunicatiaspre si dinspre server (ca parte a formularului, acest camp este plimbatpermanent).

    Pentru mbunatatirea timpilor de raspuns, se poate elimina acest views-tate atunci cand nu este cu adevarat nevoie de el. Asemenea cazuri sunt:

    controlul nu si modifica niciodata starea (continut, caracteristici vizu-ale);

    controlul este repopulat la fiecare postback;

    http://en.wikipedia.org/wiki/Base64
  • 3.3. GESTIUNEA STARII IN ASP.NET 57

    este un control de tip input, a carui valoare este setata de utilizator,deci oricum serverul le mentine.

    Pentru a se omite salvarea automata n ViewState pentru starea unuicontrol, se poate specifica proprietatea EnableViewState cu valoarea false,sau se poate specifica la nivel de pagina, fie prin modificarea ei ca anteriorla nivel de pagina, fie la directiva:

    1

    Securitatea ViewState-ului poate fi privita din 2 perspective: ne intere-seaza sa nu se poata face modificarea continutului (chiar daca acest continutpoate fi usor descifrat), sau chiar sa nu se poata descifra ce sa salvat.

    Primul aspect este automat rezolvat, deoarece o data cu valorile pere-chilor cheievaloare serializata se salveaza si o suma de control asociatacontinutului. Cand se reprimeste la server campul ascuns, se recalculeazaaceasta suma de control; daca nu coincide cu valoarea din ViewState, nseamnaca sa intervenit n el.

    Daca se vrea ca ViewState-ul sa fie codificat, atunci se va specifica ndirectiva Page:

    1 %@Page ViewStateEncryptionMode="Always" ... %>

    In loc de Always se mai poate utiliza Never sau Auto.

    3.3.2 Query String

    Din adresa http://www.google.ro/search?q=data+mining&lang=ro, qu-ery string-ul este partea de dupa semnul de ntrebare. Reprezentarea se facesub forma variabila=valoare, iar mai multe astfel de perechi pot fi separateprin caracterul &.

    Exista urmatoarele limitari ale unui query string:

    Informatia este limitata la siruri de caractere, care trebuie sa continecaractere valide pentru un URL.

    Informatia este vizibila pentru oricine;

    Pot aparea modificari 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 fi folosit din partea de code behind astfel:

  • 58 CAPITOLUL 3. FORME WEB, GESTIUNEA STARII

    1 Response.Redirect("newpage.aspx?recordID=" + recordID.ToString());

    Trebuie permanent avut grija ca adresa astfel formata sa contina mereu ca-racterel valide pentru un URL, adica un set destul de redus. Acest lucru seobtine prin apelul metodei Server.UrlEncode(detaliu).

    3.3.3 Cross page posting

    [2], pag 233 si urm

    3.3.4 Cookies

    Cookie-urile utilizator reprezinta fisiere care sunt menc tinute de catreclient (browser) fie n memoria sa (si deci disponibile doar pe durata catbrowserul este deschis), fie pe harddisk (si deci pot fi valabile la reporni-rea browserului). Reprezinta perechi de forma cheievaloare, ambele de tipstring. Un cookie este trimis automat de catre browser serverului si apoinapoi.

    Crearea unui cookie si atasarea lui la raspuns se face astfel:

    1 HttpCookie cookie = new HttpCookie("Preferences");2 cookie["LanguagePref"] = "English";3 cookie["Country"] = "US";4 Response.Cookies.Add(cookie);

    Mai sus s-a definit un cookie care va fi stocat doar n browser; dacase doreste ca acesta sa fie stocat pe HDD, se va specifica o data limita devalabilitate:

    1 cookie.Expires = DateTime.Now.AddYears(1);

    Redobandirea unui cookie se face prin:

    1 HttpCookie cookie = Request.Cookies["Preferences"];2 string language;3 if (cookie != null)4 {5 language = cookie["LanguagePref"];6 }

  • 3.3. GESTIUNEA STARII IN ASP.NET 59

    3.3.5 Sesiunea

    Sesiunea nu este parte a HTTP-ului, dar este un concept implementatde catre orice framework pentru crearea de pagini web dinamice l imple-menteaza. O sesiune este caracteristica unui browser deschis, reprezinta uncontainer de elemente structurate ca si cheievaloare, unde cheia este de tipstring iar valoarea orice obiect serializabil. De regula, se mentine n memoriaserverului cate o sesiune, instantiata la fiecare inceput de sesiune. Alternativ,se poate specifica faptul ca sesiunile sa fie memorate ntro baza de date.

    Fiecare sesiune este identificata de un sir de 120 de biti lungime, carese salveaza de regula ntrun cookie pe browser; la orice cerere efectuata decatre browser, se trimite automat si acest cookie, ceea ce permite serveruluisa determine care este sesiunea atasata browserului; pe partea de code behindse poate accesa continutul sesiunii. Daca se suspecteaza ca clientul nu aremecansimul de cookie permis (sau browserul nu permite asa ceva), atunci sepoate face codificarea acestui identificator de sesiune prin intermediul URLului, setare disponibila din fisierul de configurare web.config; sau se poatefolosi autodetectare, deci sa se decida automat care din variante sa se aplice.

    Adaugarea (sau suprascriere) si accesarea continutului din sesiune se facprecum urmeaza (exemplu):

    1 Session["ProductsDataSet"] = dsProducts;2 dsProducts = Session["ProductsDataSet"] as DataSet;

    Sesiunea este pierduta ntruna din urmatoarele situatii:

    utilizatorul nchide browserul; aceasta duce la pierderea cookie-ului carecontine indentificatorul de sesiune;

    sesiunea expira; implicit, n ASP.NET dupa 20 de minute de la ultimaaccesare dinspre clientul care a determinat crearea sesiunii, se dealocaautomat aceasta sesiune de catre server, pentru a nu irosi resursele; va-loarea de timeout se poate specifica n fisierul de configurare web.config;

    daca programatorul apeleaza n code behind Session.Abandon().

    Daca cineva urmaresste comunicatia pe retea, poate sa obtina acest co-okie, si deci acces la sesiune. Pentru aceasta se poate folosi Secure SocketLayer (SSL).

    3.3.6 Application

    Obiectul Application este unic pentru toata lumea, deci poate sa continaniste valori care sunt de interes general: contoare de exemplu numarul de

  • 60 CAPITOLUL 3. FORME WEB, GESTIUNEA STARII

    utilizatori curent loginati sau seturi de date care nu se modifica dictionarede traducere.

    1 protected void Page_Load(Object sender, EventArgs e)2 {3 // Acquire exclusive access.4 Application.Lock();5 int count = 0;6 if (Application["HitCounterForOrderPage"] != null)7 count = (int)Application["HitCounterForOrderPage"];8 count++;9 Application["HitCounterForOrderPage"] = count;

    10 // Release exclusive access.11 Application.UnLock();12 lblCounter.Text = count.ToString();13 }

  • Capitolul 4

    Validatoare, manipulatoare deHTTP, controale utilizator

    4.1 Controale de validare a intrarii

    In cazul formularelor, o parte considerabila o reprezinta controalele depreluare a datelor de la utilizator. Pentru aceste date preluate un minim dereguli se cere, de obicei, sa fie respectat. De exemplu, pentru un nume deutilizator, se cere ca acesta sa fie nevid; pentru o adresa de email sau unnumar de telefon, acesta trebuie sa aibe un anumit format.

    Validarea se poate face n doua locuri: pe server (la postback) sau peclient, nainte de trimiterea formularului care le contine. A doua variantaeste, evident, preferata, deoarece se scuteste un drum pana la server, pentruca acolo sa se constate ca datele sunt invalide. Am prefera deci ca n codulHTML care se trimite clientului sa existe invocare de cod JavaScript caresa verifice, pe cat posibil, daca regulile de validare a datelor de intrare suntsatisfacute.

    Pentru a evita scrierea acestui cod de validare manual, sau introdusurmatoarele controale de validare:

    - verifica daca un camp de intrare arecontinut;

    - determina daca valoarea specificata ntruncontrol de intrare are valoarea cuprinsa ntre doua margini precizate;

    - verifica daca valoarea unui control este ntro relatie anume cu alta valoare;

    61

  • 62CAPITOLUL 4. VALIDATOARE, MANIPULATOARE, CONTROALE

    - verifica daca valoarea unui controlsatisface o anumita expresie regulata;

    - pentru cazurile n care logica de validare nuse regaseste printre controalele enumerate anterior;

    - arata un sumar al erorilor de validarepentru controalele carora li s-a asociat validator

    Pentru un control se poate specifica mai mult de un validator; de exemplu,pentru un textbox se poate asocia un validator de tip RequiredFieldValidatorcare verifica daca continutul casutei de text este nevid; suplimentar, se poateasocia un validator de expresie regulata, pentru a vedea daca continutul sa-tisface un anumit format. Este chiar cerut a se asocia validatorul de campcerut, deoarece pentru un RegularExpressionValidator (ca de altfel sipentru RangeValidator si CompareValidator), testul de validare se consi-dera trecut daca intrarea este lasata goala.

    Controalele de preluare a datelor care sunt validate sunt: TextBox, Lis-tBox, DropDownList, RadioButtonList, HtmlInputText, HtmlTextArea, Ht-mlSelect. Cand se valideaza un control de tip lista (care contine particulaList n denumire), se valideaza proprietatea Value pentru obiectul ListItemcurent selectat.

    4.1.1 Pasii de validare

    Validarea se porneste atunci cand utilizatorul apasa un buton (sau linksau ImageButton) care determina trimiterea formularului catre server. Fie-care componenta pomenita are o proprietate numita CausesValidation detip boolean care daca are valoarea true atunci se va face validarea paginii.Validarea se face iterand peste controale si