![]() XHost |
Oferim servicii de instalare, configurare si monitorizare servere linux (router, firewall, dns, web, email, baze de date, aplicatii, server de backup, domain controller, share de retea) de la 50 eur / instalare. Pentru detalii accesati site-ul BluePink. |
ASP.NET vine cu cateva controale predefinite, in plus fata de cele HTML, numite si controale server, numite asa deoarece tratarea evenimentelor la care acestea raspund se executa pe server. Visual Studio .NET 2003 are o interfata care permite manipularea facila a acestora din Toolbox. Observati ca, atunci cand introduceti controale intr-un Form web, in codul “din spatele acestuia”, adica in fisierul .cs asociat, se produc niste modificari: se creaza un nou obiect, in functie de ce anume ati adaugat, ca instanta al uneia dintre clasele din spatiul de nume System.Web.UI.WebControls.
Exista controale folosite la afisare de date: Labels , TextBoxes – informatii unicate; dar in mod curent se folosesc si unele pentru afisarea unor colectii de informatii, cum ar fi: ListBoxes , DropDownLists si DataGrids . Acestea din urma se folosesc foarte mult in aplicatii de management al informatiilor, cum ar fi de exemplu una de biblioteca, unde se poate dori afisarea tuturor cartilor dintr-un anumit domeniu, etc.
Controalele au si evenimente predefinite la care stiu sa raspunda. De exemplu, butoanele au Click , textbox-urile au TextChanged , etc. In momentul in care doriti sa tratati un astfel de eveniment, sa spunem apasarea unui buton de catre utilizator, trebuie sa asociati un handler evenimentului predefinit Click al butonului respectiv. Un handler nu este altceva decat o functie, iar asocierea respectiva se poate face foarte usor din Visual Studio. Pentru cazul anterior, este suficient dublu-click pe buton, pentru ca sa se creeze automat o metoda de tipul:
... si in plus aceasta este automat inregistrata ca handler evenimentului Click. Puteti sa observati asta daca va uitati in metoda InitializeComponents() din regiunea Web Form Designer generated code.
Spuneam ca putem sa afisam o colectie de informatii in controale precum ListBox-ul. Cam asa se face adaugarea la runtime intr-un ListBox si intr-un DropDownList:
Pentru a putea referi informatiile dupa aceea, folosim o serie de proprietati ale obiectului ListBox, cum ar fi:
Un caz special il reprezinta DataGrid -ul. In mod uzual el afiseaza date "extrase" dintr-o baza de date, prin asignarea la proprietatea sa DataSource a obiectului (DataSet) cu informatiile din baza de date. Daca dorim sa personalizam afisarea (in mod normal controlul afiseaza toate informatiile din DataSet) sau, pur si simplu, dorim sa afisam datele intr-un format nestandard, putem folosi coloane Template. Pentru fiecare astfel de coloana specificam controalele ce vor fi afisate in interiorul ei (click dreapta pe DataGrid-ul din modul Design al Form-ului, apoi Property Builder si in fine mergeti la Columns). Dupa crearea unor coloane Template, mergeti la Edit Template si alegeti-o pe cea dorita. Apoi puteti sa luati controale din Toolbox si sa le puneti in coloana pe care tocmai o editati. La terminarea editarii, dati End Template Editing.
Pentru popularea controalelor din coloanele Template ale unui DataGrid, exista mai multe posibilitati. Am ales una dintre ele, presupunand ca in coloana Template a unui DataGrid numit “dgQuestions”, in Item Template , am depus un RadioButtonList cu numele “rblAnswer”. Datorita faptului ca in coloana Template pot fi incluse mai multe controale, trebuie sa "cautam" controlul dorit, apeland la metoda FindControl .
DataGrid-ul mai stie sa raspunda la un eveniment numit ItemCommand . La ce este bun acest eveniment? Ei bine, daca in DataGrid, pe langa informatiile pe care dorim sa le afisam, adaugam o coloana de butoane, adica un buton pentru fiecare rand de informatii, apasarea unuia dintre acestea poate fi tratata de catre handlerul asociat evenimentului ItemCommand al DataGridului. Se poate observa ca putem adauga mai multe astfel de coloane de butoane, si atunci diferentierea intre ele trebuie facuta prin referirea numelui comenzii asociate butonului. Vom reveni asupra acestui aspect in lectiile urmatoare.
De asemenea, as putea sa remarc Web User Controls . Acestea pot fi create de catre programator si in general sunt folosite pentru a grupa un set de controale, cu scopul de a le reutiliza in mai multe pagini. Astfel, daca doresc sa vizualizez, in cazul nostru, documentele in doua Form-uri, atat in User.aspx cat si in Admin.aspx (va mai aduceti aminte specificatiile aplicatiei pe care dorim s-o construim), as putea crea un control ViewDocs.ascx (da, “ascx”, nu este greseala J ). In acest control imi voi pune un Label, un DataGrid si poate si alte controale si in codul din spatele acestuia il voi popula cu date extrase din baza de date. Apoi, pentru a-l adauga in cele 2 formulare in care am nevoie de el, voi face Drag&Drop cu fisierul ascx peste formularele dorite.
Pentru a obtine o asezare in pagina cat mai ordonata , se recomanda cu tarie folosirea de tabele, acestea putand fi gasite in Toolbox -> HTML, sau se pot scrie direct in codul HTML al paginii web.
Daca pe un Form dorim sa efectuam mai multe actiuni , ca de exemplu Adaugare/Stergere documente + Imprumut docs+ Returnare docs, am putea sa grupam controalele folosind Panel -uri. Acestea sunt utile si in momentul in care dorim ca o singura functionalitate sa fie vizibila la un moment dat. De exemplu, vrem sa fie vizibile doar controalele pentru Adaugare/Stergere documente, iar controalele celorlator actiuni nu. Dupa ce le-am grupat pe toate in cate un Panel, putem sa ne jucam cu proprietatea Visible a panel-urilor, pentru a le afisa/ascunde.
Deoarece noi nu putem stii ce informatii vor introduce utilizatorii sitului nostru, acestea trebuie neaparat validate. Pentru asta, ASP.NET ne pune la dispozitie cateva controale, care dupa asocierea de un Control (un TextBox de ex.), pot sa ne avertizeze asupra introducerii unor informatii gresite: CompareValidator, RequiredFieldValidator, RangeValidator, RegularExpressionValidator, CustomValidator. Acestea se pot folosi in modul urmator:
· Luati un astfel de control din Toolbox si puneti-l pe Form.
· Specificati controlul pe care doriti sa il valideze prin intermediul proprietatii ControlToValidate .
· Setati proprietatea ErrorMessage care va fi afisata atunci cand un anumit control nu a putut fi validat.
· In functie de tipul controlului de validare va trebui sa setati si alte proprietati: la CompareValidator veti seta ControlToCompare (controlul cu care va fi comparat controlul de validat); la RangeValidator specificati MinimumValue si MaximumValue intre care trebuie sa se afle valoare controlului de validat; la RegularExpressionValidator, specificati proprietatea ValidationExpression , sub forma unei expresii regulate care specifica formatul in care trebuie sa se afle valoarea controlului; CustomValidator ridica un eveniment ServerValidate , care poate fi folosit pentru a realiza validarea controlului.
Atentie : Validarea controalelor are loc atunci cand se face o cerere catre server (postback). In mod uzual aceasta cerere se face prin intermediul unui buton, care, in momentul in care este apasat, inainte de a trimite cererea catre server, va apela functiile de validare (pentru controalele de validare configurate sa valideze la client) sau trimite cererea catre server si primul lucru pe care server-ul il face este sa valideze controalele (pentru controalele de validare configurate sa valideze pe server).
ASP.NET foloseste protocolul HTTP pentru a comunica cu server-ul. Acesta este un protocol "fara stare", adica intre cereri, nu se salveaza/restaureaza starile anterioare. Cu toate acestea, este de dorit ca paginile unei aplicatii web sa "tina minte" starea anterioara. Ar fi destul de neplacut ca un utilizator sa trebuiasca sa-si introduca parola de fiecare data cand are nevoie sa interactioneze cu o pagina web, de ex. In mod normal, el isi introduce o data parola, iar apoi poate folosi pagina respectiva, server-ul web "tinandu-l minte" pe acel user. Pentru a realiza acest deziderat, creatorii ASP.NET-ului, au adaugat fiecarui control web capabilitatea de a-si salva si restaura automat starea intre apeluri (adica informatiile continute, de ex. proprietatea Text a unui TextBox). Aceasta stare salvata este impachetata intr-un sir de caractere care este trimis catre browser-ul clientuui intr-un camp ascuns din pagina web. Cand utilizatorul face postback (face o cerere catre server), el va transmite inapoi server-ului atat starea curenta cat si stringul acela ascuns, cu starea anterioara (salvata). Server-ul prin compararea celor 2 stari isi poate da seama daca user-ul a modificat informatiile din pagina si, daca da, stie ce eveniment server sa apeleze. De ex. daca clientul intre 2 postback-uri, modifica continutul unui control TextBox, server-ul isi va da seama (examinand continutul starii salvate si al starii curente) si va apela evenimentul TextChanged al acelui control. Concluzionand, ASP.NET-ul este destul de inteligent sa-si salveze starea controalelor intre apelurile catre server, dar ce ne facem daca dorim ca in interiorul unui Form sa pastram informatii specifice unui client si nu dorim sa le inmagazinam in controale. Mai mult, poate dorim sa pastram informatii de stare intre apeluri catre form-uri diferite (aici nici macar controalele web nu ne pot ajuta, pentru ca acestea pot fi accesabile doar de pe pagina in care au fost create si de care apartin).
Se impune deci sa pastram cumva starea obiectelor pe care dorim sa le folosim. Exista urmatoarele modalitati de a rezolva problema: Query Strings, Cookies, View State, Session State, Application State.
Nu am sa le discut pe toate, ci am sa ma refer doar la Session State acum. Exista un obiect standard numit Session, la care noi avem acces din toate paginile unei aplicatii web, si in care putem inmagazina informatii (obiecte), care dorim sa fie specifice fiecarui user (cu alte cuvinte, pentru fiecare utilizator care ne viziteaza pagina, exista cate un obiect Sesion asociat). Obiectele introduse in Session sunt identificate ori printr-un index, ori printr-un nume. De ex., pentru a introduce un obiect "objFeedback" in Session, putem folosi urmatoarea linie de cod:
Iar “luarea” lui din Session:
Se observa ca s-a facut o conversie de tip. Asta pentru ca in Session, toate variabilele sunt de tip object, iar eu doresc sa citesc de acolo una de tip Feedback (asta fiind o clasa definita de mine).
Navigarea intre Forms cu pastrarea informatiilor
Exista mai multe posibilitati de a naviga intre Form-urile unei aplicatii ASP.NET.
Controlul Hyperlink si metoda Response.Redirect() fac acelasi lucru, doar ca primul este un control care rezida in .aspx, iar metoda se apeleaza din cod (.aspx.cs).
Metoda Server.Transfer() , face acelasi lucru doar ca asa se pot retine informatii din Form-ul sursa si folosite in cel destinatie. Daca setam parametrul preserveForm al metodei la valoarea true, starea form-ului sursa va fi disponibila si in form-ul destinatie. Totusi, pentru a folosi aceasta stare a formularlui sursa, va trebui sa setam atributul EnableViewStateMac din directiva @Page (fisierul .aspx) pe valoarea false. Asta pentru ca, in mod normal (EnableViewStateMac==true), informatia de stare este hash-uita si in acest caz, form-ul destinatie nu ar putea sa aiba acces la informatiile din form-ul sursa. Prin dezactivarea hash-uiri starii form-ului sursa, form-ul destinatie va avea acces la aceasta stare. Pe de alta parte, este bine sa nu dezactivam aceasta hash-uire, deoarece aceasta prezinta un risc de securitate.
Transferul de la un form la altul, pastrand informatia utila:
O alta modalitate de a naviga intre Form-uri si a pastra informatie utila, este folosirea Session . Iata cum ar arata:
Nota: proprietatea IsPostBack a unui form, specifica daca cererea curenta catre server-ul web este una de tip postback sau nu. La prima cerere catre o pagina web, aceasta are valoarea false (nu este de tip postback), in timp ce cererile succesive (determinate, de ex., de apasarea unui buton pe form) vor fi de tip postback. De obicei, in Page_Load, atunci cand IsPostBack este pe false, se fac initializari ale controalelor de pe pagina (fiind prima accesare a paginii de catre user), in timp ce atunci cand IsPostBack este true, nu este nevoie de intializari, deoarece, dupa cum am mentionat mai sus, controalele web isi pastreaza starea intre apeluri. Exemplu:
Vom crea in aceasta tema interfata cu utilizatorul. Vom avea 2 form-uri, unul pentru utilizatorul normal ( user ) si altul pentru administrator ( admin) . Pe form-ul user-ului vor trebui sa existe 3 zone (Panel-uri) in care veti introduce controale specifice pentru "Vizualizare documente" (un DataGrid si un Button pentru refresh), "Imprumut document" (un TextBox in care se va specifica numarul documentului dorit si un Button), "Restituire document" (3 TextBox-uri in care se va specifica numarul documentul restituit, noul titlu si noul text al documentului si un Button). De asemenea inafara celor 3 panel-uri se va afisa un meniu cu 3 intrari (HyperLink-uri), pentru fiecare din cele 3 zone. Astfel, daca se selecteaza primul hyperlink, se va afisa panel-ul "Vizualizare documente", iar celelalte vor fi invizibile (Visible=false), daca se selecteaza al 2-lea se afiseaza "Imprumut" s.a.m.d. In mod prestabilit (default) se va afisa "Vizualizare documente". Meniul va fi sub forma de Web User Control (UserMenu.ascx). Tip : folositi obiectul Session in UserMenu.ascx pentru a specifica zona care trebuie afisata (in urma selectiei unui link). Apoi in evenimentul Page_Load al paginii User.aspx, in functie de valoarea salvata din Session afisati un panel sau altul. Daca in Session nu aveti nimic, afisati panel-ul default.
Form-ul admin-ului va contine 4 Panel-uri "Vizualizare documente" (aici as vrea sa folositi un Web User Control, pentru a nu duplica codul), "adaugare/stergere", "vizualizare documente imprumutate", "Trimite email" la cei carora le-a expirat termenul de imprumut. La fel ca si la form-ul user, se va crea un Web User Control (AdminMenu.ascx) care contine 4 link-uri care afiseaza fiecare una din cele 4 zone.
In plus, creati un form default.aspx, in care sa aveti controalele pentru autentificare (username si password). Pe baza tipului lor, intr-una din lectiile urmatoare, vom face Redirect catre una din paginile User sau Admin. Totusi ca sa putem sa « ne jucam » cu aplicatia, as vrea sa existe 2 utilizator : admin si user, cu ce parola vreti voi J. Ideea este ca din default sa pot sa ii dau un username si sa intru atat ca admin cat si ca user. Partea de securitate va fi acoperita mai incolo, deci trebuie sa facem o improvizatie ca sa mearga.
In momentul in care se introduce username, se verifica daca este unul dintre admin sau user. Daca nu e nici-unul => eroare. Daca e admin, se creaza un obiect de tip BAdmin, caruia ii setati un atribut UserID pe valoarea 1 la creare, iar apoi faceti redirect in admin.aspx, unde intr-un label se afiseaza UserID. Analog, daca e user, veti crea un BUser cu UserID pe valoarea 2, apoi redirect la user.aspx si afisare intr-un label UserID. Evident, trebuie sa avem in clasele respective acele atribute definite J. ATENTIE! Nu vreau sa creati un nou obiect de tip Badmin sau Bstudent, ci sa il folositi pe cel creat in default.aspx (folositi Session pentru a salva acest obiect din default.aspx si pentru a-l folosi mai apoi in paginile admin/user.aspx).
Dupa ce voi evalua tema 2, voi pune la dispozitie si o solutie de la care poate sa plece toata lumea in continuare; asta pentru a pastra o uniformitate in modul de dezvoltare a aplicatiei.
Evaluare :
Autentificare, redirect si folosirea obiectelor deja create = 2 p.
Crearea celor 3 Web User Control (AdminMenu, UserMenu, ViewDocs) + logica din spate care afiseaza doar panel-ul care trebuie= 2 p.
Crearea controalelor in form-urile User.aspx si Admin.aspx = 1 p.
Nu vreau culori, imagini, etc. ci doar respectarea unor elemente de asezare a controalelor asa cum apar enuntate mai sus.
Pentru nelamuriri, folositi thread-urile de pe forum pentru a pune intrebari.
Atentie: Datorita faptului ca foarte multi studenti mi-au trimis la tema 1 doar fisierul solutie (.sln), va rog sa fiti atenti si sa-mi trimiteti intregul director cu proiectul, pe care-l gasiti in c:\inetpub\wwwroot\<numele_proiectului> (*.aspx, *.cs *.ascx etc.). De asemenea, upload-ul temelor pe site se poate face o singura data . Nu voi mai accepta teme trimise pe mail, deoarece tema postata pe site nu era completa.
preview --- Cursuri --- next