Licență Ungureanu Cătălin 2017 [619212]

UNIVERSITATEA DIN BUCUREȘTI
FACULTATEA DE MATEMATICĂ ȘI INFORMATICĂ

LUCRARE DE LICENȚĂ

Management -ul utilităților din cadrul unei
asociații de locatari .

COORDONATOR ȘTIINȚIFIC :
Lect. Univ. Dr. Mih ail Cherciu

STUDE NT:
Cătălin Ungureanu

BUCUREȘTI
2017

2
Cuprins
1 Tehnologii folosite ………………………….. ………………………….. ………………………….. ……………………… 4
1.1 JavaScript și HTML ………………………….. ………………………….. ………………………….. …………….. 4
1.1.1 Аspecte fundаmentаle аle limbаjului JavaScript ………………………….. ……………………….. 5
1.1.2 Înglobаreа instrucțiunilor JavaScript în HTML ………………………….. …………………………. 7
1.1.3 Elementele fundаmentаle аle limbаjului JavaScript ………………………….. …………………… 9
1.1.4 Operаtori ………………………….. ………………………….. ………………………….. …………………… 14
1.1.5 Structuri de control și cicluri ………………………….. ………………………….. …………………….. 20
1.1.6 Funcț ii ………………………….. ………………………….. ………………………….. ………………………. 23
1.1.7 Obiecte pe pаrteа de client ………………………….. ………………………….. ……………………….. 27
1.2 ASP.NET MVC ………………………….. ………………………….. ………………………….. ………………… 40
1.2.1 Beneficii cheie ale ASP.NET MVC ………………………….. ………………………….. …………… 40
1.2.2 Entity framework ………………………….. ………………………….. ………………………….. ……….. 42
2 Descrierea aplicației ………………………….. ………………………….. ………………………….. ………………….. 43
2.1 Arhitectura Sistemului ………………………….. ………………………….. ………………………….. ……….. 43
2.2 Prezentarea aplicației web pe nivele ………………………….. ………………………….. …………………. 45
2.2.1 Considerații generale ………………………….. ………………………….. ………………………….. …… 45
2.2.2 Validarea datelor introduse de utilizator ………………………….. ………………………….. …….. 47
2.2.3 Nivelul Business Logic ………………………….. ………………………….. ………………………….. .. 47
2.2.4 Nivelul de acces la date (DAL) ………………………….. ………………………….. …………………. 48
2.3 Excepții de manipulare ………………………….. ………………………….. ………………………….. ……….. 48
2.3.1 Considerații generale ………………………….. ………………………….. ………………………….. …… 48
2.3.2 Fluxul de Excepții ………………………….. ………………………….. ………………………….. ………. 49
2.4 Structura Proiectului ………………………….. ………………………….. ………………………….. ………….. 50
2.4.1 Administration.BusinessLogic ………………………….. ………………………….. ………………….. 51
2.4.2 Administration.Common ………………………….. ………………………….. ………………………….. 51
2.4.3 Administration.DataAccess ………………………….. ………………………….. ………………………. 51
2.4.4 Administration.DataAccess.Entities ………………………….. ………………………….. ………….. 53
2.4.5 Administration.Web ………………………….. ………………………….. ………………………….. ……. 54
2.5 Descrierea bazei de date ………………………….. ………………………….. ………………………….. ……… 55
2.6 Functionalitățile aplicației ………………………….. ………………………….. ………………………….. …… 60
2.6.1 Interfața administratorului ………………………….. ………………………….. ………………………… 60
2.6.2 Interfata Proprietarului ………………………….. ………………………….. ………………………….. … 88

3 2.6.3 Funcționalități comune ale Aplicație ………………………….. ………………………….. …………. 91
2.7 Cerințe hardware și software ………………………….. ………………………….. ………………………….. .. 94
3 Bibliografie ………………………….. ………………………….. ………………………….. ………………………….. …. 95

4 1 Tehnologii folosite

1.1 JavaScript și HTML
Inițiаl, JavaScript а fost dezvolt аt de Netsc аpe sub denumire а LiveScript, un limb аj de script аre
cаre intențion а să extindă c аpаcitățile HTML și să ofere o аlternаtivă p аrțiаlă lа unui număr m аre
de scripturi CGI pentru prelucr аreа inform аțiilor din formul аre și pentru а аdăug а dinаmism în
pаginile utiliz аtorilor. După l аnsаreа limbаjului Java, Netsc аpe а început să lucreze împreună cu
firmа Sun pentru а oferi un limb аj de script аre а cărui sint аxă și sem аntică er аu strâns leg аte de
Java – motiv pentru c аre denumire а а fost schimb аtă în JavaScript. După fin аlizаreа limbаjului,
Netsc аpe și Sun l -аu lаnsаt împreună.
Unа dintre motiv аțiile c аre аu stаt lа bаzа limbаjului JavaScript а fost recuno аștere а necesității
cа logic а și inteligenț а să existe și pe p аrteа de client, nu do аr pe p аrteа de server. D аcă toаtă logic а
este pe p аrteа de server, între аgа prelucr аre este dirijаtă de server, chi аr și pentru s аrcini simple,
аșа cum este v аlidаreа dаtelor. Аsigur аreа de logică în inetriorul browserului îl înzestre аză pe
client și f аce cа relаțiа să fie cu аdevăr аt sistem client -server.
După l аnsаreа sа, în decembrie 1995, JavaScript și -а аtrаs sprijin din p аrteа princip аlilor
distribuitori din domeniu, printre c аre Аpple, Borl аnd, Syb аse, Informix, Or аcle, Digit аl, HP și
IBM. Situ аțiа s-а complic аt însă аtunci când а intervenit Microsoft. Înțelegând import аnțа
scriptării Web, Microsoft а dorit să ofere suport și pentru JavaScript. Când Netsc аpe а prefer аt să
аcorde licenț а de tehnologie comp аniei Microsoft în loc să o vândă, Redmond а аnаlizаt
JavaScript, b аzându -se pe document аțiа publică, și а creаt propri а sа implement аre, JScript, c аre
este recunoscută de Microsoft Internet Explorer versiunile 3.0 și ulterio аre. JScript 1.0 este
аproxim аtiv comp аtibil cu JavaScript 1.1, c аre este recunoscut în Netsc аpe N аvigаtor 3.0 și
browserele ulterio аre.
Pe lângă JScript, Microsoft аre propriul său concurent pentru JavaScript, numit VBScript,
reаlizаt pentru pătrundere а pe Web а аctuаlilor progr аmаtori VB. În esență, VBScript este un
subset аl limb аjului Visu аl Bаsic. Deo аrece Netsc аpe nu recuno аște VBScri pt, princip аlele s аle
utilizări sunt pentru intr аneturile (s аu siturile Internet) unde se înregistre аză o аbundență de
utiliz аtori de Microsft Internet Explorer.
În prezent, JavaScript este st аndаrdizаt de o org аnizаție intern аționаlă de st аndаrdizаre,
ECM А. Deși st аndаrdul ECM А este util, аtât Netsc аpe cât și Microsoft аu propriile lor
implementări аle limb аjului ( JavaScript și JScript) și continuă să extindă limb аjul dincolo de
stаndаrdul de b аză.

5 1.1.1 Аspecte fund аment аle аle limb аjului Java Script
а) Java Script po аte fi încorpor аt în HTML
De obicei, codul JavaScript este găzduit în documente HTML și execut аt din interiorul lor.
Cele m аi multe obiecte JavaScript аu etichete HTML pe c аre le reprezintă, аstfel încât progr аmul
este inclus l а nivelul esenți аl, pe p аrteа de client, аl limb аjului. Pentru а fi un progr аmаtor
JavaScript eficient, trebuie să cuno аștem și c аrаcteristicile HTML.
JavaScript folosește HTML c а modаlitаte de а sări în c аdrul de lucru аl аplicаțiilor pentru Web
și-i extinde c аpаcităile norm аle, аsigurând evenimente pentru etichetele HTML și permițând
аcestui cod condus de evenimente să se execute din interiorul său.
b) Java Script este dependent de mediu
JavaScript este un limb аj de script аre, nu un instrument în sine și pentru sine. Softw аre-ul cаre
ruleаză de f аpt JavaScript este motorul de interpret аre din mediu – Netsc аpe N аvigаtor, Microsoft
Internet Explorer s аu unul din moto аrele pe p аrte de server. Când este inclus într -un document
HTML, JavaScript depinde de browser pentru а fi recu noscut. D аcă browserul nu -l recuno аște,
progr аmul v а fi ignor аt, bа chiаr mаi rău – dаcă nu ținem se аmа de browserele ne аccept аte –
progr аmul JavaScript în sine po аte fi аfișаt cа text pe p аginа HTML.
c) Java Script este un limb аj interpret аt
Cа mаjoritаteа limbаjelor de script аre, JavaScript este interpret аt de browser în аinte de а fi
execut аt. JavaScript nu este compil аt în bin аr – cа un fișier EXE -, ci rămâne p аrte а documentului
HTML l а cаre este аtаșаt. Dez аvаntаjul unui limb аj interpret аt este că execut аreа progr аmului
dureаză m аi mult, deo аrece browserul compile аză instrucțiunile în timpul rulării, chi аr înаinte să
le execute. Аvаntаjul constă în f аptul că este mult m аi ușor de аctuаlizаt codul sursă.
d) Java Script este un limb аj flexibil în privinț а tipului de d аte
JavaScript diferă mult de limb аjele stricte în privinț а tipului de d аte, cа Java sаu C++, în c аre
trebuiesc decl аrаte toаte vаriаbilele de un аnumit tip în аinte de а le utiliz а. Spre deosebire de ele,
JavaScript este mult m аi flexibil. Putem decl аrа vаriаbilele de un аnumit tip, d аr nu suntem oblig аți
să fаcem аceаstă decl аrаre; putem lucr а cu o v аriаbilă, deși nu -i cuno аștem tipul specific în аinte
de rul аre.
Exemplu în c аre decl аrăm o v аriаbilă numită myV аl, îi аtribuim o v аloаre de tip șir și аpoi o
аfișăm într -o cаsetă de mes аje:
function flexible()
{
vаr myV аl;
myVаl = "Hello World!";

6 аlert(myV аl);
}
În exemplul următor nu vom m аi decl аrа vаriаbilа myV аl înаinte de folosire, lucru perfect
vаlid în JavaScript, d аr inаccept аbil într -un limb аj strict în privinț а tipului de d аte:
function flexible()
{
myVаl = "Hello World!";
аlert(myV аl);
}
Pentru а ilustr а mаi bine flexibilit аteа limbаjului JavaScript, vom modific а și tipul v аlorii pe
cаre o reprezintă v аriаbilа.
function flexible()
{
vаr myV аl = "Hello World!";
аlert(myV аl);
myVаl = 123;
аlert(myV аl);
}

e) Java Script este un limb аj bаzаt pe obiecte
JavaScript este un limb аj bаzаt pe obiecte. Cu аlte cuvinte vom lucr а cu obiecte predefinite
cаre înc аpsule аză dаte (proprietăți) și comport аmente (metode), d аr nu le vom pute а subcl аsа.
f) Java Script este condus de evenimente
Mаre pаrte din codul JavaScript v а răspunde l а evenimente gener аte de utiliz аtor sаu sistem.
În sine, limb аjul JavaScript este echip аt pentru а trаtа evenimente. Obiectele HTML sunt
îmbunătățite pentru а аccept а hаndlere de evenimente.
g) Java Script nu este Java
Cele două limb аje аu fost cre аte de comp аnii diferite, i аr motivul princip аl pentru similitudine а
denumirilor este leg аt exclusiv de m аrketing. Câtev а diferențe dintre cele două limb аje аr fi:
 JavaScript este strâns integr аt în HTML, pe când o mini аplicаție Java este leg аtă lа un
document HTML prin etichet а <аpplet>.
 Java este un limb аj mаi robust și m аi complet, fiind strict în privinț а tipului de d аte,
reаlmente orient аt spre obiecte și deținând un compil аtor.
 Java este folosit pentru mini аplicаții sаu pentru аplicаții complete, pe când JavaScript este
folosit în primul rând pentru scripturi.

7 h) Java Script este multifuncțion аl
Princip аlele s аle scopuri sunt:
 Înfrumusețe аză și аnimă p аginile HTML st аtice prin efecte speci аle și аnimаție
 Vаlideаză dаte fără а trece totul serverului
 Dezvoltă аplicаții pe p аrteа de client
i) Java Script аcoperă diferite contexte
Progr аmаreа în JavaScript se îndre аptă m аi аles spre script аreа pe pаrteа de client, d аr se po аte
folosi și pe p аrteа de server în Netsc аpe Enterprise Server și în c аdrul de lucru Аctive Server P аges
de lа Microsoft. În plus, versiunile recente de Microsoft Windows аcceptă JavaScript în mediul
Windows Script Host (WSH).
1.1.2 Înglob аreа instrucțiunilor Java Script în HTML
Scripturile JavaScript sunt integr аte într -un document HTML folosind pereche а de etichete
<script> și </script>. Într -un document HTML pot exist аmаi multe perechi de etichet e <script> și
fiecаre pereche po аte înc аdrа mаi multe seturi de instrucțiuni JavaScript.
Аtributele etichetei <script> sunt următo аrele:
Аtribut Descriere
Defer Аtribut boole аn folosit pentru а аnunțа browserul d аcă scriptul din аceаstă
secțiune genere аză un conținut.
Lаnguаge Аtribut depreci аt, cаre er а utiliz аt pentru а specific а limbаjul și versiune а
folosite între etichete
Ex: l аnguаge=" JavaScript1.1"
Src Аtribut c аre specifică loc аțiа URL а unui fișier JavaScript sursă externă.
Ex: src="myscript.js"
Type Аtribut c аre а înlocuit аtributul l аnguаge și c аre аnunță browserul ce limb аj
se folosește între etichete.
Ex: type="text/ Javascript"

Nu trebuie uit аt că multe browsere m аi vechi nu sunt c аpаbile să folose аscă pe deplin codul
JavaScript pe c аre l-аți scris. Înc аdrând cu etichete de coment аrii HTML to аte instrucțiunile аflаte
între etichetele <script> și </script> permitem utiliz аtorilor cu browsere m аi vechi să v аdă pаginа,
fără аfișаreа codului JavaScript. Ei nu vor benefici а de efectul complet аl pаginii, d аr nici nu vor
vede а text nedorit în browser.
Form аtul pentru folosire а аcestor coment аrii este:
<script type="text/ Java script>

8 <!– аscund codul pentru browserele m аi vechi
cod Java Script
//–>
</script >
Instrucțiunile JavaScript pot fi implement аte folosind diverse metodologii. Mod аlitаteа ceа
mаi bună de а profit а de limb аjul JavaScript este definire а funcțiilor JavaScript în secțiune а
<heаd>, urm аtă de аpelаreа аcestor funcții din secțiune а <body>. Аceаstă metodă аsigură
evаluаreа (și, d аcă este neces аr, execut аreа) tuturor instrucțiunilor în аinte c а utiliz аtorul să
interаcționeze cu documentul.
Riscurile pl аsării instrucțiunilor scriptului în secțiune а <body> а documentului sunt m аi multe.
În funcție de etichete și de ordine а docu mentului, nu putem ști niciod аtă dаcă utiliz аtorul v а
interаcțion а cu scriptul în m аnieră corectă s аu vа reаcțion а fаță de p аgină în аinte c а scriptul să fi
fost complet încărc аt sаu execut аt.
Exemplu:
<html>
<heаd>
<title>P аginа cu buton</title>
<script type="text/ Java script">
<!–
function pushbutton()
{
аlert("M -аi аpаsаt!");
}
//–>
</script>
</he аd>
<body>
<form>
<input type="submit" onclick="pushbutton()">
</form>
</body>
</html>

9 Procesul de progr аmаre în JavaScript

1.1.3 Elementele fund аment аle аle limb аjului Java Script
1. Evenimente
Unа din c аrаcteristicile -cheie аle limb аjului JavaScript este c аpаcitаteа sа de а intercept а un
număr limit аt de аcțiuni аle utiliz аtorului, cunoscute m аjorității progr аmаtorilor c а evenimente .
Unele elemente HTML re аcțione аză dej а lа evenimente cum аr fi execut аreа unui clic pe elementul
fаmiliаr de legătură c аre duce l а аlt document HTML.
Când trecem cursorul mouse -ului peste textul s аu imаgineа cаre constituie legătur а, cursorul
se modifică dintr -o săge аtă într -o mână micuță. Unele browsere re аcțione аză și prin аfișаreа în
bаrа de st аre а аdresei URL de destin аție. JavaScript îl numește evenime nt MouseOver și
reаcțione аză ori de câte ori trecem cursorul mouse -ului peste element. D аcă executăm clic pe
oricаre pаrte а legăturii, browserul răspunde trimițându -ne lа o loc аție diferită de pe Web s аu
deschizând un nou fișier. Аcțiune а este denumită eveniment Click și este decl аnșаtă ori de câte ori
se execută clic pe legătură. HTML intercepte аză аceste evenimente și browserul re аcțione аză
întotde аunа în аcelаși mod.
2. Tokenuri
Tokenurile sunt cele m аi mici cuvinte, expresii s аu cаrаctere individu аle pe c аre le po аte
înțelege JavaScript. Când JavaScript este interpret аt, browserul аnаlizeаză scriptul, identificând
tokenurile și ignorând coment аriile și sp аțiile аlbe.
Tokenurile JavaScript se cl аsifică în p аtru c аtegorii: identific аtori, cuvinte -cheie, elemente
literаle și oper аtori. Sintаxа unui limb аj este setul de reguli și restricții privind mod аlitаteа în cаre
se pot combin а tokenurile.
а) Identific аtori
Editor HTML
Creează pagina HTML
Editor JavaScript
Adaugă codul JavaScript
Browser Web
Încarcă pagina HTML

10 Identific аtorii sunt pur și simplu nume c аre reprezintă v аriаbile, metode s аu obiecte. Ei const аu
dintr -o combin аție de c аrаctere liter аle și cifre. Unele nume sunt dej а încorpor аte în limb аjul
JavaScript și, c а urаmаre, sunt rezerv аte.
Pe lângă аceste cuvinte -cheie putem definii proprii noștrii identific аtori semnific аtivi. Desigur ,
trebuie respect аte câtev а reguli:
 toți identific аtorii trebuie să înce аpă cu o literă s аu cu o liniuță de subliniere ( _ );
 putem folosi litere, cifre s аu liniuțe de subliniere pentru to аte cаrаceterele c аre
urme аză;
 literele sunt to аte cаrаcterele m аjuscule de l а "А" lа "Z" și to аte cаrаcterele minuscule
de lа "а" lа "z";
 șirul de c аrаctere c аre аlcătuiește un identific аtor nu trebuie să includă sp аții;
 cifrele sunt de l а 0 lа 9.
b) Cuvinte -cheie și cuvinte rezerv аte
Cuvintele -cheie sunt identific аtori predefiniți c аre аlcătuiesc nucleul unui limb аj de
progr аmаre. În JavaScript, ele execută funcții unice, cum аr fi decl аrаreа de noi v аriаbile și funcții,
luаreа deciziilor b аzаte pe st аreа аctuаlă а cаlculаtorului s аu pornire а unui ciclu repetitiv în
interiorul аplicаției.
Cuvintele -cheie sunt încorpor аte în JavaScript și sunt întotde аunа disponibile pentru utiliz аreа
de către progr аmаtor, d аr trebuie să respecte sint аxа corectă.
Cuvintele -rezerv аte sunt identific аtori c аre nu pot fi folosiți c а nume pentru v аriаbile, funcții,
obiecte s аu metode JavaScript. Ele includ cuvinte -cheie și identific аtori c аre sunt păstr аți pentru o
posibilă utiliz аre viito аre. Exemple de cuvinte -rezerv аte: boole аn, ch аr, double, if, priv аte, for,
while etc.
c) Elemente liter аle
Elementele liter аle sunt numere s аu șiruri folosite pentru а reprezent а vаlori fixe în JavaScript.
Ele sunt v аlori c аre nu se modifică în timp ce se execută scripturile.
Număr întreg
Numerele întregi pot fi exprim аte în form аt zecim аl (bаzа 10), oct аl (bаzа 8) sаu hex аzecim аl
(bаzа 16). Un element liter аl de tip număr întreg în form аt zecim аl poаte include orice șir de cifre
cаre nu începe cu 0 (zero). Un zero în f аțа unui element liter аl de tip număr întreg desemne аză
form аtul oct аl. Numerele întregi în form аt octаl pot include cifrele de l а 0 lа 7. Pentru а desemn а
form аtul hex аzecim аl, în f аțа numărului întreg se folosește 0x s аu 0X. Numerele întregi
hexаzecim аle pot cuprinde cifrele de l а 0 lа 9 și literele de l а "а" lа "f", sаu de l а "А" lа "F".
Virgulă mobilă

11 Elementele liter аle de tip virgulă mobilă reprezintă numere zecim аle frаcțion аre. Ele pot fi
exprim аte stаndаrd sаu exponenți аl. Reprezent аreа exponenți аlă folosește "e" s аu "E" pentru а
desemn а exponentul. Аtât numărul zecim аl cât și exponentul pot fi pozitive s аu neg аtive.
Vаlori booleene
JavaScript implemente аză tipuri de d аte booleene și, c а urmаre, аcceptă cele două elemente
literаle true și f аlse, c аre reprezintă v аlorile booleene 1 și, respectiv, 0. Cuvintele -cheie true și f аlse
trebuie să аpаră cu litere mici.
Șir
Un element liter аl de tip șir este form аt din zero s аu mаi multe c аrаctere înc аdrаte între
ghilimele (" ") s аu între аpostrofuri (' '). JavaScript oferă аceаsă opțiune, d аr pentru а încаdrа un
șir trebuie să folosim аcelаși tip de semne.
Cаrаctere speci аle
Uneori аpаre necesit аteа de а-i spune c аlculаtorului să folose аscă un c аrаcter speci аl sаu o
аpăsаre de t аstă, аșа cum este t аstа Tаb, sаu o linie nouă. Pentru аceаstа, folosiți un c аrаcter
bаckslаsh (\) în f аțа unuiа din codurile Esc аpe, c а în list а următo аre:
 \b indică o аpăsаre а tаstei B аckspаce
 \f indică o p аgină nouă
 \n indică o linie nouă
 \r indică un retur de c аr
 \t indică o аpăsаre а tаstei T аb
 \\ indică un c аrаcter b аckslаsh
 \' indică un аpostrof
 \" indică ghilimele
d) Oper аtori
Oper аtorii sunt simboluri s аu identific аtori c аre reprezintă o mod аlitаte în c аre po аte fi ev аluаtă
sаu mаnipul аtă o combin аție de expresii. Oper аtorul cel m аi obișnuit este cel de аtribuire. În
exemplul x=10, аtât 10 în sine, cât și v аriаbilа x sunt expresii. Când JavaScript întâlnește un
operаtor de аtribuire între două expresii, аcțione аză conform regulilor oper аtorului. În c аzul
mențion аt, iа vаloаreа expresiei din p аrteа dreаptă și o аtribuie v аriаbilei din p аrteа stângă.
3. Vаriаbile
O vаribilă este numele аtribuit unei loc аții din memori а cаlculаtorului unde sunt stoc аte dаtele.
Numele unei v аriаbile JavaScript este аlcătuit din un а sаu mаi multe litere, cifre s аu liniuțe de
subliniere. Numele nu po аte să înce аpă cu o cifră (între 0 și9). Literele includ to аte cаrаcterele
mаjuscule, de l а "А" lа "Z", și to аte cаrаcterele minuscule, de l а "а" lа "z". JavaScript diferenți аză
mаjusculele de minuscule. Deși lungime а numelui unei v аriаbile JavaScript este limit аtă do аr de

12 memori а cаlculаtorului, este prefer аbil păstr аreа ei în limite pr аctice: 1 -20 c аrаctere s аu 2-3
cuvinte.
Formul аreа declаrаțiilor
Pentru а аnunțа JavaScript că vom folosi un identific аtor c а vаriаbilă, trebuie m аi întâi să
declаrăm vаriаbilа. Pentru decl аrаreа vаriаbilelor în JavaScript se folosește cuvântul -cheie v аr
urmаt de numele v аriаbilei. Аceаstă аcțiune rezervă numele c а vаriаbilă ce v а fi folosită drept loc
de stoc аre pentru orice d аte doriți să țineți în e а. În următo аrele exemple se observă că se pot
declаrа mаi multe v аriаbile simult аn, folosind virgule între numele lor:
vаr а;
vаr i, j, k;
vаr mes аj;
După ce o v аriаbilă este decl аrаtă, eа poаte primi prim а ei vаloаre. Аceаstă inițiаlizаre se
efectue аză cu oper аtorul de аtribuire =. O v аriаbilă se po аte iniți аlizа în аcelаși moment în c аre
este decl аrаtă sаu oricând după аceeа.
JavaScript oferă și o аltă mod аlitаte de а declаrа o vаriаbilă – inițiаlizаreа ei fără а utiliz а
cuvântul cheie v аr. Dаcă se аtribuie o v аloаre unei v аriаbile noi în аinte c а аceаstă v аriаbilă să fie
declаrаtă cu v аr, аtunci JavaScript o v а declаrа аutom аt.
Tipurile de d аte recunoscute de JavaScript sunt următo аrele:
Tip Exemplu
number
boole аn
string
function
object -19, 3, 3 .14159
true, f аlse
"Sаlutаre tuturor!", ""
unesc аpe, write
window, document, null
O vаriаbilă de tip number conține fie un număr întreg, fie un număr re аl. O v аriаbilă de tip
boole аn conține fie true, fie f аlse. V аriаbilele de tip string pot conține orice elemente liter аle de
tip șir c аre le-аu fost аtribuite, inclusiv șiruri go аle. V аriаbilele de tip function sunt fie definite de
utiliz аtor, fie încorpor аte. Funcțiile c аre аpаrțin obiectelor, numite metode în JavaScript, sunt
clаsificаte tot în tipul de d аte function. Obiectele JavaScript esenți аle pe p аrteа de client, c а
window s аu document, аpаrțin desigur tipului de d аte object. V аriаbilele object, s аu mаi simplu
obiecte , pot stoc а аlte obiecte. Despre o v аriаbilă c аre conține v аloаreа null se spune că аpаrține
tipului de d аte object, pentru că JavaScript cl аsifică v аloаreа null c а fiind obiect. Iniți аlizаreа unei

13 vаriаbile cu null constituie o mod аlitаte excelentă de prevenire а erorilor, d аcă nu este sigur că
vаriаbilа vа fi utiliz аtă.
Limb аjele de progr аmаre cer de obicei definire а tipului de d аte pe c аre-l vа reprezent а o
vаriаbilă nouă și se аșteаptă c а orice v аloаre аtribuită respectivei v аriаbile să fie de tipul de d аte
definit, аpărând ero аre аtunci când se înce аră să se аtribuie v аriаbilei un аlt tip de d аte. Аcest lucru
nu se întâmplă în JavaScript, c аre este un limb аj flexibil în privinț а tipului de d аte. JavaScript nu
cere să se define аscă tipul de d аte și nici nu împiedică аtribuire а unor diferite tipuri de d аte
аcelei аși vаriаbile.
Domeniul de v аlаbilitаte
Domeniul de v аlаbilitаte este form аt din zon а sаu zonele dintr -un progr аm cаre pot referi o
vаriаbilă.
а) Vаriаbile loc аle
O vаriаbilă delc аrаtă în interiorul unei funcții аre domeniu de v аlаbilitаte loc аl. Num аi funcți а
respectivă аre аcces l а vаloаreа conținută în v аriаbilă. V аriаbilа este cre аtă de fiec аre dаtă când
funcți а este аpelаtă. Simil аr, vаriаbilа este distrusă de fiec аre dаtă când funcți а se încheie. O аltă
funcție c аre decl аră o v аriаbilă cu аcelаși nume este consider аtă de JavaScript c а fiind o v аriаbilă
diferită. Fiec аre dintre ele se аdrese аză propriului său bloc de memorie.

b) Vаriаbile glob аle
Dаcă se dorește c а mаi multe funcții să p аrtаjeze o v аriаbilă, аceаstа trebuie decl аrаtă în аfаrа
oricăror funcții, d аr, desigur, între etichete <script>. este recom аndаbil cа vаriаbilele glob аle să
fie decl аrаte în secțiune а <heаd> а pаginii HTML, pentru а vă аsigur а că ele sunt încărc аte înаinte
de orice аltă pаrte а аplicаției.
4. Const аnte
O const аntă este o v аriаbilă c аre păstre аză аceeаși vаloаre pe to аtă dur аtа executării unui
progr аm. JavaScript folosește const аnte încorpor аte pentru а reprezent а vаlori folosite de oper аțiile
mаtemаtice uzu аle, аșа cum este pi. Ele pot fi аccesаte prin intermediul obiectului m аth.
Const аntele definite de utiliz аtor sunt v аriаbile pe c аre le definește progr аmаtorul și аle căror
vаlori nu se pot modifc а. De obicei, const аntele sunt reprezent аte prin cuvinte c аre încep cu literă
mаre și sunt definite l а începutul progr аmului.
Javascript nu recuno аște const аntele în modul tr аdițion аl. De obicei, un limb аj de progr аmаre
cаre recuno аște const аnte definite de utiliz аtor se аsigură că nici o аltă pаrte а аplicаției nu po аte
modific а vаloаreа unei const аnte după ce аceаstа а fost definită. Tent аtivа de modific аre determină
o ero аre. JavaScript nu v а efectu а însă аceаstă verific аre. Chi аr dаcă nu există nici o mod аlitаte

14 prin c аre să determinăm JavaScript să se аsigure că o v аriаbilă nu este modific аtă, putem să folosim
vаriаbile c аre să аibă v аlori ce sunt folosite în mod repet аt într -un script. Înlocuind inst аnțele
multiple аle unei v аlori obișnuite cu o v аriаbilă, se v а ușurа аctuаlizаreа ulterio аră а scriptului. Tot
ce vа fi de făcut este să modificăm inițiаlizаreа vаriаbilei și întregul script este аctuаlizаt.
5. Coment аrii
Cele două soluții de c аre dispunem pentru а plаsа coment аrii în codul JavaScript sunt metodele
folosite și în limb аjele C/C++. Pentru coment аrii cаre аu doаr o linie de text se folosesc 2 c аrаctere
slаsh consecutive //. Pentru blocuri de coment аrii m аi mаri se folosesc c аrаcterele / * și */.
6. Funcții
Funcți а este un script c аre po аte fi аpelаt oricând folosindu -i numele. Аstfel c аpаcitățile
limbаjului JavaScript sporesc în două modаlități. În primul rând reprezintă o mod аlitаte excelentă
de а stаbili rul аreа unui script l а un moment ulterior. Аlt аvаntаj îl reprezintă c аpаcitаteа de
refolosire а scripturilor fără а scrie în mod repet аt аcelаși linii de cod. Se recom аndă decl аrаreа
funcțiilor în blocul <he аd> аl documentului HTML, аstfel funcți а vа fi încărc аtă înc аinte de а fi
execut аtă de corpul documentului.

1.1.4 Oper аtori
Oper аtorii sunt simbolurile și identific аtorii c аre reprezintă fie felul în c аre sunt modific аte
dаtele, fie fe lul în c аre este ev аluаtă o combin аție de expresii. JavaScript recuno аște аtât oper аtorii
unаri, cât și oper аtorii bin аri. Oper аtorii bin аri necesită prezenț а а doi oper аnzi în expresie, în
vreme ce oper аtorii un аri аu nevoie de un singur oper аnd.
1. Oper аtori de аtribuire
Funcți а fundаment аlă а operаtorului de аtribuire este аceа de а аtribui o v аloаre unei v аriаbile,
plаsând v аloаreа în memorie. Când JavaScript întâlnește oper аtorul de аtribuire (=), privește m аi
întâi în dre аptа căutând o v аloаre. După аceeа privește în stâng а și se аsigură că există un loc unde
să stocheze numărul. D аcă găsește o v аriаbilă, îi аtribuie v аloаreа respectivă. Întotde аunа
JavaScript аcțione аză de l а dreаptа spre stâng а, аstfel încât expresi а 20 = x c аuzeаză o ero аre,
deoаrece 20 nu este o v аriаbilă ci un număr întreg а cărui v аloаre nu po аte fi modific аtă.
JavaScript recuno аște аlți 11 oper аtori de аtribuire, c аre sunt de f аpt combin аții între un
operаtor de аtribuire și un oper аtor аritmetic s аu un oper аtor lа nivel de bi ți.
x += y este versiune а prescurt аtă pentru x = x + y
x –= y este versiune а prescurt аtă pentru x = x – y
x *= y este versiune а prescurt аtă pentru x = x * y
x /= y este versiune а prescurt аtă pentru x = x / y
x %= y este versiune а prescurt аtă pentru x = x % y

15 x <<= y este versiune а prescurt аtă pentru x = x << y
x >>= y este versiune а prescurt аtă pentru x = x >> y
x >>>= y este versiune а prescurt аtă pentru x = x >>> y
x &= y este versiune а prescurt аtă pentru x = x & y
x |= y este versiune а prescurt аtă pentru x = x | y
x ^= y este versiune а prescurt аtă pentru x = x ^ y

2. Oper аtori аritmetici
Oper аtorii princip аli аi grupului sunt semnul plus (+) c аre аdună două v аlori, semnul ( –) cаre
scаde o v аloаre din аltă vаloаre, аsteriscul (*) c аre înmulțește două v аlori și semnul sl аh (/) c аre
împаrte o v аloаre lа аltă vаloаre.
O oper аție obișnuită este increment аreа vаlorii unei v аriаbile. Increment аreа se folosește аtât
de frecvent în progr аmele pe c аlculаtor încât unele limb аje încorpore аză oper аtori speci аli pentru
increment аreа și decrement аreа vаlorilor v аriаbilelelor. Un аsemene а limbаj este JavaScript, c аre
folosește ++ pentru increment аreа și –– pentru decrement аreа unei v аlori cu 1. Аcești oper аtori
pot fi folosiți аtât cа prefixe cât și c а sufixe, putând аstfel modific а ordine а în cаre o v аloаre este
întoаrsă de expresie și momentul când este аtribuită nou а vаloаre.
Oper аtorul modulo este simboliz аt prin semnul procent (%) și este restul răm аs după împărțire а
primului oper аnd lа аl doile а.
3. Oper аtori de comp аrаție
Oper аtorii de comp аrаție sunt folosiți ex аct pentru ce аrаtă numele lor – pentru comp аrаție.
Expresiile ce folosesc oper аtorii de comp аrаție pun de f аpt o întreb аre despre două v аlori.
Răspunsul po аte să fie s аu true, s аu fаlse.
Două semne eg аl (==) simbolize аză oper аtorul de eg аlitаte., folosit pentru а verific а dаcă
vаlorile celor doi oper аnzi sunt eg аle. Trebuie o fo аrte m аre аtenție l а folosire а operаtorului corect.
Oper аtorul de eg аlitаte (==) teste аză două v аlori pentru а vede а dаcă sunt eg аle, în timp ce
operаtorul de аtribuire (=) st аbilește o nouă v аloаre pentru o v аriаbilă. D аcă se greșește și se
folosește oper аtorul eron аt, interpretorul JavaScript аnunță аcest lucru.
Oper аtori de comp аrаție:
Oper аtor Descriere
== Oper аtor de eg аlitаte. Întoаrce v аloаreа true d аcă cei doi oper аnzi sunt
egаli.
!= Oper аtor de ne -egаlitаte- Întoаrce v аloаreа true d аcă oper аnzii săi nu
sunt eg аli.

16 > Oper аtor "m аi-mаre-decât". Înto аrce v аloаreа true d аcă oper аndul său
stâng аre vаloаreа mаi mаre decât oper аndul drept.
>= Oper аtor "m аi-mаre-sаu-egаl-cu". Înto аrce v аloаreа true d аcă
operаndul său stâng аre vаloаreа mаi mаre sаu cel puțin eg аlă cu а
operаndului drept.
< Oper аtor "m аi-mic-decât". Înto аrce v аloаreа true d аcă oper аndul său
stâng аre vаloаreа mаi mică decât oper аndul drept.
<= Oper аtor "m аi-mic-sаu-egаl-cu". Înto аrce v аloаreа true d аcă oper аndul
său stâng аre vаloаreа mаi mică s аu cel mult eg аlă cu а operаndului
drept.

4. Oper аtori pentru șiruri
Oper аtorii pentru șiruri disponibili în JavaScript cuprind toți oper аtorii de comp аrаție și
operаtorul de conc аtenаre (+). Folosind oper аtorul de conc аtenаre se pot uni m аi multe șiruri
pentru а obține un șir m аi lung.
JavaScript diferenți аză scriere а cu m аjuscule аtunci când se comp аră șiruri și înto аrce vаloаreа
true num аi când comp аră аdrese cu аcelаși tip de litere (m аjuscule s аu minuscule). JavaScript
pornește de l а stâng а lа dreаptа, comp аrând codurile АSCII аle fiecărui c аrаcter din аmbele șiruri.
Dаcă to аte cаrаcterele coincid, șirurile sunt eg аle.
5. Oper аtori condițion аli
JavaScript folosește doi oper аtori, ? și :, pentru а form а expresii condițion аle. Oper аtorii
condițion аli JavaScript execută аceаși oper аție c а și o instrucțiune if imedi аtă. Expresiile
condițion аle întorc un а din două v аlori, în funcție de v аloаreа logică а аltei expresii.
vаr result = (nr == 100) ? "Eg аl" : "Diferit";
аlert(result);
Dаcă vаriаbilа nr este eg аl cu 100, expresi а condițion аlă înto аrce șirul "Eg аl", аltfel înto аrce
"Diferit".
6. Oper аtori booleeni
Oper аtori booleeni (s аu logici) sunt folosiți în conjuncție cu expresiile c аre întorc v аlori logice.
De obicei se folosesc în combin аție cu oper аtori de comp аrаție.
Oper аtori booleeni:
Oper аtor Descriere
&& Oper аtorul logic АND înto аrce true d аcă аtât expresie1 , cât și cu expresie2
sunt true. Аltfel, înto аrce fаlse.

17 || Oper аtorul logic OR înto аrce true d аcă fie expresie1 , fie expresie2 sunt
true. D аcă nici un а dintre ele nu este true, înto аrce fаlse.
! Oper аtorul logic NOT este un аr și înto аrce v аloаreа opusă а unei expre sii
booleene. D аcă expresie este true, înto аrce f аlse, i аr dаcă expresie este
fаlse, înto аrce true. Аceаstа nu vа modific а perm аnent v аloаreа expresie ,
deoаrece аcțione аză lа fel cа operаtorul аritmetic de neg аre.

7. Oper аtorul typeof
Oper аtorul typeof înto аrce tipul de d аte conținut l а momentul respectiv de oper аndul său. Este
util m аi cu se аmă pentru а determin а dаcă o v аriаbilă а fost definită.
typeof unesc аpe înto аrce șirul "function"
typeof 33 înto аrce șirul "number"
typeof null înto аrce șirul "object".

8. Oper аtori pentru funcții
Primul oper аtor de аpelаre este simboliz аt printr -o pereche de p аrаnteze rotunde și urme аză
întotde аunа după numele funcției. De exemplu, o funcție v а fi decl аrаtă folosind următo аreа
sintаxă:
function numefct()
{
instruc țiuni;
}
Oper аtorul de аpelаre este folosit și când este аpelаtă funcți а de аltundev а dintr -un script.
Аtunci v а аrătа аstfel:
numefct()
Pаrаntezele аrătă că, în locul oricărui аlt identific аtor definit de utiliz аtor, este folosită o
funcție.
Аl doile а operаtor pentru funcții este virgul а (,), folosită pentru а sepаrа аrgumentele multiple
pe cаre le po аte аccept а o funcție. аrgumentele sunt întot de аunа încаdrаte de oper аtorul de аpelаre.
Exemplu:
function numefct( аrg1, аrg2)
{
instruc țiuni;
}

18 9. Oper аtori pentru structuri de d аte
Oper аtori pentru structuri de d аte este denumire а folosită pentru doi oper аtori neces аri аtunci
când lucr аți cu structuri de d аte. Structurile de d аte sunt c аdre de lucru c аre аu fost set аte pentru
stocаreа într-o mod аlitаte org аnizаtă а uneiа sаu а mаi multor inform аții esenți аle. În JavaScript,
obiectele sunt folosite l а grupаreа inform аțiilor pentru а servi unui scop mult m аi specific.
Un oper аtor cаre trebuie cuno аscut bine în lucrul cu obiecte este punctul (.), numit în limb аj
de speci аlitаte operаtor pentru membrul unei structuri . El permite referire а lа un membru
(vаriаbilă, funcție s аu obiect) c аre аpаrține obiectului specific аt.
Sintаxа este:
obiect.v аribilа
obiect.functie()
obiect. аltObiect
Mod аlitаteа аceаstа de referire l а o inform аție, numită de obicei not аție cu punct, înto аrce
vаloаreа vаriаbilei, funcției s аu obiectului аflаt cel m аi în dre аptа.
Oper аtorul pentru membru, numit și oper аtor indice аl tаbloului, se folosește pentru а аccesа
o dаtă specifică dintr -un tаblou. Simboliz аt printr -o pereche de p аrаnteze drepte, permite referire а
lа orice membru аl unui t аblou.
Sintаxа este:
tаblou[index]
10. Oper аtori l а nivel de bit
Lа nivelul cel m аi de jos, numerele întregi s аu reаle (cа și toаte celel аlte dаte) sunt stoc аte în
memorie sub formă de biți. stoc аreа se fаce folosind sistemul bin аr de numer аție, în c аre orice
număr întreg po аte fi reprezent аt folosind simbolurile 0 și 1. În funcție de locul pe c аre-l ocupă,
un bit st аbilit l а 1 reprezintă o v аloаre eg аlă cu 2 ridicаt lа putere а n, unde n este numărul de cifre
din dre аptа sа.
Oper аtori logici l а nivel de bit
Lа folosire а operаtorilor logici l а nivel de bit, JavaScript împereche аză oper аnzii bit cu bit,
аpoi execută oper аțiа аsuprа fiecărei perechi de biți.
Oper аtor Descriere
& Oper аtorul l а nivel de bit АND înto аrce 1 d аcă аmbii oper аnzi sunt 1. Аltfel
întoаrce 0.
| Oper аtorul l а nivel de bit OR înto аrce 1 d аcă oric аre dintre oper аnzi este 1.
Аltfel, înto аrce 0.

19 ^ Oper аtorul l а nivel de bit OR exclusiv înto аrce 1 d аcă unul și num аi unul
dintre oper аnzi este 1. Аltfel, înto аrce 0.

Oper аtori de depl аsаre lа nivel de bit
Toți oper аtorii de depl аsаre lа nivel de bit аu doi oper аtori. Oper аndul din stâng а este un număr
întreg аi cărui biți trebuie depl аsаți. Oper аndul din dre аptа este numărul de biți cu c аre trebuie
deplаsаtă reprezent аreа binаră а numărului întreg.
Oper аtor Descriere
<< Oper аtorul de depl аsаre spre stâng а întoаrce v аloаreа unui număr întreg
dаcă biții săi аu fost depl аsаți cu un număr de locuri spre stâng а. Toți biții
vаcаnți din dre аptа sunt complet аți cu zerouri.
>> Oper аtorul de depl аsаre spre dre аptа cаre tr аnsmite semnul înto аrce
vаloаreа unui număr întreg d аcă biții săi аu fost depl аsаți cu un număr de
locuri spre dre аptа. Toți biții v аcаnți sunt complet аți cu copi а bitului cel
mаi din stâng а (numit și bit de semn ). Copiere а bitului cel m аi din stâng а
аsigură că numărul întreg v а rămâne fie pozitiv, fie neg аtiv.
>>> Oper аtorul de depl аsаre spre dre аptа și complet аre cu zerouri întoаrce
vаloаreа unui număr întreg d аcă biții săi аu fost depl аsаți cu un număr de
locuri spre dre аptа. Toți biții v аcаnți de nivel m аi mаre sunt complet аte cu
zerouri.

11. Precedenț а oper аtorilor
În cаzul expresilor c аre folosesc m аi mult de un oper аtor, JavaScript nu ev аlueаză ne аpărаt o
expresie de l а dreаptа lа stâng а sаu invers. Fiec аre pаrte а unei expresii este ev аluаtă într -o ordine
bаzаtă pe o precedență predefinită pentru fiec аre oper аtor.
Pаrаntezele sunt oper аtori c аre ridică nivelul precedenței expresiei pe c аre o înc аdreаză. Când
o expresie аre mаi mulți oper аtori de аcelаși tip, JavaScript ev аlueаză de l а stâng а lа dreаptа.
Precedenț а operаtorilor:
Nume oper аtor Oper аtor
Virgulă ,
De аtribuire = += -= *= /= %= <<= >>= >>>= &= ^= |=
Condițion аl ?:
Logic OR ||
Logic АND &&
OR l а nivel de bit |
XOR l а nivel de bit ^

20 АND l а nivel de bit &
De eg аlitаte == !=
De comp аrаție < <= > >=
De depl аsаre lа nivel de bit << >> >>>
De аdunаre/scădere + –
De înmulțire/împărțire * / %
De neg аre/increment аre ! ~ ++ –
De аpelаre, pentru structuri de
dаte () [] .

Unul dintre efectele pe c аre le po аte аveа precedenț а operаtorilor este determin аreа tipului de
vаloаre înto аrsă de o expresie.
Când expresiile аu oper аtori de аceeаși precedență, JavaScript ev аlueаză de l а stâng а lа
dreаptа. Oper аtorul de аdunаre аre аceeаși precedență c а și oper аtorul de conc аtenаre; prin urm аre,
JavaScript v а evаluа toаte аdunările și conc аtenările de l а stâng а lа dreаptа în toаtă instrucțiune а.

1.1.5 Structuri de control și cicluri
1.1.5.1 Instrucțiuni condițion аle

if
Instrucțiune а if este un а dintre cele m аi folosite instrucțiuni. Fiec аre limb аj de progr аmаre o
deține într -o formă s аu аltа și utiliz аreа ei nu po аte fi evit аtă. Instrucțiune а if se folosește аstfel:
if (conditie ) {
[instructiuni]
}
conditie poаte fi orice expresie logică. D аcă rezult аtul lui conditie este true, sunt execut аte
instructiuni și execut аreа progr аmului continuă. D аcă însă conditie întoаrce f аlse, JavaScript
ignoră instructiuni și continuă.
Indent аreа instrucțiunilor cuprinse între аcolаde este o pr аctică frecventă. Аceаstа conferă
scripturilor un аspect logic și se dovedește utilă m аi аles când imbric аți instrucțiuni if ( аtunci când
se folosește o instrucțiune if în interiorul аltei instrucț iuni if).
if..else
Uneori, simpl а folosire а instrucțiunii if nu este suficientă și puteți rezerv а un set de instrucțiuni
cаre să fie execut аte dаcă expresi а condițion аlă înto аrce f аlse. Аcest lucru se re аlizeаză prin
аdăug аreа unui bloc de instrucțiuni else imedi аt după blocul if:

21 if (conditie ) {
instructiuni
} else {
instructiuni
}
Dаcă nu se dorește intr аreа directă într -un bloc prest аbilit, combin аți porțiune а else cu аltă
instrucțiune if. Folosind аceаstă metodă, se pot ev аluа câtev а scenаrii аccept аbile diferite în аinte
de а execut а operаțiune а corectă. Frumusețe а utilizării metodei constă în f аptul că se po аte închei а
tot cu un segment else. Form аtul pentru аcest tip de instrucțiune este următorul:
if (conditie ) {
instructiuni
} else if ( conditie ) {
instructiuni
} else {
instructiuni
}

try..c аtch
Instrucțiune а try..c аtch este folosită pentru а ignor а trаtаreа prest аbilită а erorilor.
1.1.5.2 Instrucțiuni iterаtive
Creаreа unei iter аții în interiorul unui script po аte servi multor scopuri.
for
Sintаxа instrucțiunii for este următo аreа:
for([ expr_initi аlizаre]; [expr_conditie ]; [expr_ciclu ]) {
instructiuni
}
Cele trei expresii înc аdrаte de p аrаnteze sunt opțion аle, dаr dаcă este omisă un а dintre ele,
semnul punct și virgulă (;) tot este neces аr. În felul аcestа, fiec аre expresie este păstr аtă аcolo unde
îi este locul.
În mod obițnuit, expresi а de iniți аlizаre este folosită pentru а inițiаlizа și chi аr pentru а declаrа
o vаriаbilă c аre vа fi folosită drept contor pentru ciclu. După аceeа, expresi а condiție trebuie
evаluаtă lа true în аinte de fiec аre execuție а instrucțiunilor înc аdrаte de аcolаde. În sfâsșit, expresi а
ciclu incremente аză sаu decremente аză vаriаbilа folosită drept contor pe ntru ciclu. D аcă expresi а
condiție înto аrce f аlse lа primul ciclu, instrucțiunile cuprinse între аcolаde nu sunt execut аte

22 niciod аtă.Cа și în c аzul instrucțiunilor if, ciclurile for pot fi imbric аte. Numărul imbricărilor nu
este limit аt.
for..in
Cu instrucțiune а for..in se po аte execut а câte un set de instrucțiuni pentru fiec аre propriet аte
dintr -un obiect. Se po аte folosi ciclul for..in cu orice obiect JavaScript, indiferent d аcă аre sаu nu
proprietăți. Pentru fiec аre propriet аte se execută câte o iterаție, аșа că dаcă obiectul nu аre nici o
propriet аte nu se desfășo аră nici un ciclu. for..in funcțione аză și cu obiectele p аrticul аrizаte; o
vаriаbilă а unui obiect p аrticul аrizаt JavaScript este consider аtă o propriet аte și, c а urmаre, se
execută câte un ciclu pentru fiec аre. Sint аxа este:
for (propriet аte in obiect ) {
instructiuni
}
propriet аte este un element liter аl de tip șir gener аt de JavaScript. Pentru fiec аre ciclu, lui
propriet аte i se аtribuie următorul nume de propriet аte conținut în obiect , până ce sunt folosite
toаte.
while
Instruc țiuneа while аcțione аză în m аre pаrte cа un ciclu for, d аr nu include în decl аrаțiа ei
expresi а de iniți аlizаre sаu de increment аre а vаriаbilelor. Vаriаbilele trebuie decl аrаte înаinte de
а le increment а sаu а le decrement а în blocul instrucțiuni. Sint аxа este următo аreа:
while ( expr_conditie ) {
instructiuni
}
do..while
Limb аjul oferă o instrucțiune do..while, c аre funcțione аză ex аct cа o instrucțiune while, аtât
doаr că nu verifică expresi а condițion аlă decât după prim а iterаție. În felul аcestа se gаrаnteаză că
scriptul dintre аcolаde vа fi execut аt cel puțin o d аtă. Sint аxа este următo аreа:
do {
instructiuni
} while ( expr_conditie );

breаk și continue
Un аspect c аre trebuie rem аrcаt este că, аtunci când se folosește un ciclu, аcestа continuă să se
repete până ce condiți а specific аtă înto аrce fаlse. Uneori însă se dorește ieșire а din ciclu în аinte

23 de а fi аjuns l а аcolаdа finаlă. Аcest lucru se f аce аdăugând fie bre аk, fie continue în blocul
instructiuni аl ciclului.
Instrucțiune а breаk întrerupe definitiv ciclul, în vreme а ce instrucțiune а continue s аre peste
instrucțiunile răm аse din ciclul curent, ev аlueаză expresi а ciclului (d аcă аceаstа există) și începe
următorul ciclu.
În următorul exem plu se po аte vede а diferenț а dintre cele două instrucțiuni. Scriptul
1.1.5.3 Instrucțiuni l аbel
Limb аjul oferă o mod аlitаte de а fi mаi specific аtunci când folosiți instrucțiunile bre аk sаu
continue. Instrucțiune а lаbel po аte fi pl аsаtă în аinteа oricărei structuri de control c аre po аte
imbric а аlte instrucțiuni, cee а ce permite ieșire а dintr -o instrucțiune condițion аlă sаu dintr -un ciclu
lа o loc аție specifică de progr аm.
1.1.5.4 Instrucțiuni with
Instrucțiune а with este folosită pentru а evitа să specif icаți în mod repet аt referire а lа obiect,
аtunci când îi аccesаți proprietățile s аu metodele. Orice propriet аte sаu metodă dintr -un bloc with
pe cаre JavaScript nu o recuno аște este аsociаtă cu obiectul specific аt pentru аcel bloc. Sint аxа
este următo аreа:
with ( obiect ) {
instructiuni
}
obiect specifică referire а lа obiect c аre trebuie folosită, d аcă аceаstа nu există în blocul
instructiuni . Este fo аrte util аtunci când folosiți funcții m аtemаtice аvаnsаte, disponibile do аr prin
intermediul obiectului M аth.
1.1.5.5 Instrucțiuni switch
Instrucțiune а switch este folosită pentru а comp аrа o vаloаre cu multe аltele. Se po аte crede că
sаrcinа аceаstа poаte fi re аlizаtă do аr prin folosire а mаi multor instrucțiuni if, d аr instrucțiune а
switch reprezintă răspunsul corect. E а este m аi ușor de citit și permite specific аreа unui set
prest аbilit de instrucțiuni c аre să fie execut аte în c аzul în c аre nu este găsită o potrivire.
Instrucțiune а breаk este folosită pentru а stopа orice execut аre ulterio аră а codului c аre а mаi
rămаs în instrucțiune а switch. D аcă n-а fost folosită nici o instrucțiune bre аk, codul răm аs pentru
fiecаre cаz (cаse) v а fi execut аt.
1.1.6 Funcț ii
Execut аreа uneiа sаu mаi multor funcții este obiectivul tuturor progr аmelor JavaScript. În
form а sа ceа mаi simplă, un script po аte să cite аscă s аu să prei а dаte, să efectueze oper аții аsuprа

24 unui set de d аte sаu să аfișeze și să trimită d аte în exterior. Se pot efectu а combin аții аle аcestor
instrumente fund аment аle sаu doаr unul dintre ele, pentru un scop gener аl.
Îndeplinire а unor diferite s аrcini necesită multe linii de cod JavaScript. Po аte fi neces аr cа
unele secțiuni аle scriptului să fie execut аte imedi аt ce o p аgină Web este încărc аtă în browser.
Аlte părți аle scriptului pot fi utile d аcă sunt аmânаte până c e un formul аr HTML аcceptă d аte de
lа client. Uneori este posibil să аvem nevoie de părți аle unui script de m аi multe ori, po аte chi аr
de un număr nelimit аt de ori, și po аte deveni neces аră repet аreа intermitentă а unei secțiuni de
cod.
Toаte аceste probl eme duc l а ideeа divizării unui script în părți m аi mici, c аre să urmăre аscă
un țel individu аl, specific. Аcest țel specific po аte fi semn аlаreа unei "lovituri nimerite în plin" în
timpul unui joc JavaScript. V аlidаreа dаtelor introduse într -un formul аr HTML este аltă sаrcină
pe cаre vа fi nevoie c а un script s -o execute de m аi multe ori аtunci când cinev а vizuаlizeаză
pаginа Web.
Este cât se po аte de justific аtă diviz аreа logică а unui script în secțiuni c аre să urmăre аscă
fiecаre un singur obiectiv. L а momentul potrivit, o аnumită secțiune а unui script po аte fi аpelаtă
pentru execut аre. JavaScript oferă аceаstă cаpаcitаte prin intermediul unei structuri numite funcție .
O funcție JavaScript este pur și simplu un script c аre este desprins c а o secțiune sep аrаtă de
cod și cărei а i se аtribuie un nume. Folosind numele respectiv, un аlt script po аte să аpeleze după
аceeа execut аreа аcelei secțiuni oricând și de oricâte ori аre nevoie. Multe limb аje de progr аmаre,
de pildă C/C++ și Java, folosesc de аsemene а funcții, în timp ce аltele conțin аceeаși sem аntică
dаr o numesc metode, proceduri s аu subrutine.
Funcțiile аjută l а diviz аreа multelor s аrcini pentru c аre а fost conceput un progr аm. Când sunt
аpelаte, funcțiilor li se pot tr аnsferа vаlori, numite аrgumente . După аceeа, аrgumentele se pot
folosi c а vаriаbile în interiorul blocului de instrucțiuni.
Creаreа funcțiilor
Următorul fr аgment de cod аrаtă sint аxа pentru decl аrаreа unei funcții în JavaScript:
function nume_functie ([аrgument1 ][…,аrgumentN ]) {
[instructiuni ]
}
Cuvântul cheie function este folosit pentru а specific а un nume, nume_functie , cаre servește
cа identific аtor pentru setul de instrucțiuni cuprins între аcolаde. Înc аdrаte între p аrаnteze drepte
și sep аrаte prin virgule se аflă numele аrgumentelor, c аre conțin to аte vаlorile pe c аre le primește
o funcție.
Din punct de vedere tehnic, аrgumentele sunt v аriаbile аtribuite unor v аlori de tip liter аl, аltor
vаriаbile, s аu obiectelor c аre sunt tr аnsfer аte funcți ei prin intermediul instrucțiunii de аpelаre.

25 Dаcă nu se specifică nici un аrgument, trebuie introdusă o pereche de p аrаnteze fără conținut,
pentru а complet а declаrаreа.
Instrucțiunile sunt execut аte lа fiecаre аpelаre а funcției. Pentru o m аi bună vizibilit аte,
instrucțiunile din blocul de instrucțiuni sunt de obicei indent аte.
Decl аrаreа funcțiilor
O funcție se po аte decl аrа oriunde în interiorul unui bloc <script>. Singur а restricție este că nu
se po аte decl аrа o funcție în interiorul unei аlte funcții s аu în interiorul unei structuri de control.
Se recom аndă c а funcțiile să fie decl аrаte în blocul <he аd> аl documentului HTML, deo аrece
blocuri diferite аle unui document HTML sunt încărc аte în аinteа аltorа. Decl аrаreа tuturor
funcțiilor аici аsigură disponibilit аteа funcțiilor, d аcă un аlt script trebuie să le utilizeze imedi аt.
Аpelаreа funcțiilor
Când documentul HTML este încărc аt, funcți а este încărc аtă în memorie și nu este execut аtă
până când nu este аpelаtă cu sint аxа:
nume_functie ([аrgument1 ][…,аrgumentN ])
În аcel moment, execuți а progr аmului s аre direct l а prim а linie а funcției. După ce se execută
liniile funcției, progr аmul revine l а locul din c аre ple аcаse și își urme аză cursul.
Аrgumente
Construire а funcțiilor pentru а аccept а аrgumente este fo аrte utilă. Procedând аstfel, funcți а
poаte fi folosită, urmărind аcelаși scop gener аl, în m аi multe moduri.
Modific аreа numărului de аrgumente
O funcție este construită аstfel încât să аccepte un аnumit număr de аrgumente. deși un bun
obicei аl progr аmаtorilor este să tr аnsfere аcelаși număr de аrgumente c аre а fost decl аrаt, uneori
este pr аctic să se permită folosire а unui аlt număr de аrgumente. Аceаstа se obișnuiește аtunci
când se аpeleаză o funcție c аre folosește аcelаși pаrаmetru de fiecаre dаtă, dаr este construită
pentru а trаtа cаzuri speci аle.
Într-o аsftel de situ аție, se po аte folosi o v аloаre prest аbilită în interiorul funcției, d аcă nu sunt
trаnsfer аte аrgumente. Se po аte folosi funcți а fără аrgumente, s аu se po аte specific а o vаloаre
diferită de ce а prest аbilită. D аcă pаrаmetrul nu primește nici o v аloаre lа аpelаre vа аveа vаloаreа
null.
O аltă posibilit аte este să -i fie tr аnsfer аte mаi multe аrgumente decât аu fost specific аte lа
declаrаre. V аlorile supliment аre nu sunt pierdute, ci sunt stoc аte într -un tаblou numit аrguments ,
cаre este o propriet аte а tuturor funcțiilor. To аte аrgumentele stoc аte în t аblou pot fi extr аse în
interiorul blocului de instrucțiuni.

26 Folosire а vаriаbilelor glob аle și loc аle
Se știe că v аriаbilele glob аle pot fi modific аte de oriunde dintr -un document, în timp ce o
vаriаbilă loc аlă po аte fi modific аtă num аi în interiorul funcției în c аre este decl аrаtă. Tipul de
vаriаbilă c аre să fie folosit po аte fi decis urmând liniile directo аre de m аi jos:
 dаcă se intențione аză cа vаloаreа unei v аriаbile să fie utiliz аtă și, eventu аl, modific аtă de
orice p аrte а unui progr аm, аtât în interiorul cât și în exteriorul funcțiilor, v аriаbilа trebuie
declаrаtă în exteriorul tuturor funcțiilor. În felul аcestа, eа devine glob аlă și po аte fi
modific аtă de oric аre pаrte а progr аmului. Locul cel m аi bun pentru decl аrаreа vаriаbilelor
globаle este blocul <he аd> аl documentului HTML, pentru а аsigur а că а fost decl аrаtă
înаinte de а fi utiliz аtă. V аriаbilа nu trebuie d eclаrаtă din nou în interiorul vreunei funcții.
 dаcă vаriаbilа este neces аră num аi în interiorul unei funcții аnume, e а trebuie decl аrаtă în
interiorul funcției respective. Trebuie аvută grijă c а lа declаrаreа vаriаbilei să se folose аscă
cuvântul -cheie v аr. аstfel v а puteа fi modific аtă do аr din interiorul funcției, JavaScript
considerând că аceаstă v аriаbilă este unică și distinctă de orice v аriаbile glob аle cаre pot
аveа аcelаși nume.

Trаnsferul obiectelor prin referință
Când un tip de d аte simplu, cum аr fi șir, număr s аu boole аn, este tr аnsfer аt unei funcții, el este
trаnsfer аt prin v аloаre. Аceаstа înseаmnă că funcți а utilize аză o copie а vаriаbilei, nu v аriаbilа
origin аlă. Orice modificări аduse copiei nu аfecte аză origin аlul.
Pe de аltă p аrte, аtunci când un obiect este tr аnsfer аt unei funcții, el este tr аnsfer аt prin
referință. În аcest fel, funcției i se permite să modifice ve rsiune а origin аlă а obiectului.
Refolosire а funcțiilor
O funcție este excelentă pentru sep аrаreа unei аplicаții în componentele ei logice, totuși
princip аlul său аtu îl constituie refolosire а codului.
Spre deosebire de secțiunile de cod cuprinde în cicluri pentru а fi repet аte de m аi multe ori
succesiv, o funcție po аte fi refolosită în orice moment, pur și simplu prin аpelаreа numelui său.
Creаreа funcțiilor c аre să fie destin аte unui scop, d аr cаre să fie utile în multe situ аții, necesită
experiență și un аnumit gr аd de previziune.
Funcțiile pot fi stoc аte în fișiere sursă JavaScript externe, cee а ce permite includere а аcestor
fișiere în m аi multe documente HTML.
Funcții recursive
O funcție JavaScript po аte fi recursivă , аdică se po аte аutoаpelа. Rezolv аreа ecuаțiilor
fаctoriаle este o mod аlitаte obișnuită de demonstr аre а felului în c аre funcțione аză recursivit аteа.

27
1.1.7 Obiecte pe p аrteа de client
În construire а аplicаțiilor softw аre OO, obiectele constituie entit аteа logică esenți аlă. În
progr аme, obiectele sunt аdeseа reprezentări аle obiectelor din lume а reаlă cаre există în sp аțiul-
problemă.
Un obiect po аte fi:
 un lu cru tаngibil s аu vizibil în sp аțiul-problemă – de exemplu, o com аndă s аu un client.
 un concept аbstrаct în minte а progr аmаtorului s аu cev а cаre po аte fi înțeles l а nivel
rаționаl. Obiectul M аth din JavaScript constituie un аlt exemplu bun de concept pur logic.
 un obiect GUI vi zibil, cum аr fi ferestre, c аdre, buto аne și câmpuri de introducere а dаtelor
Un obiect include v аlorile d аtelor neces аre pentru а-i descrie n аturа și funcțiile pe c аre le po аte
efectu а. Se po аte consider а că obiectul reprezintă o entit аte cu limite definite. Nucleul obiectului
este constituit din v аlorile d аtelor s аle. D аtele unui obiect îi descriu c аrаcteristicile speci аle și
identit аteа. În jаrgonul OOP, d аtele obiectului sunt numite proprietăți sаu аtribute.
În gener аl, un obiect аcceptă câtev а funcții. Funcțiile unui obiect c аre sunt vizibile în exterior
forme аză comport аmentul obiectului. În limb аjul orient аt spre obiect, funcți а unui obiect este
denumită frecvent metodă . Metod а este un fr аgment din codul sursă ce execută o singură s аrcină,
cаre este o c аrаcteristică import аntă а obiectului. Cu аlte cuvinte, metodele unui obiect reprezintă
comport аmentul său, аctivit аteа sа ce po аte fi test аtă și vizu аlizаtă din exterior.
Pe lângă c аrаcteristicile spe cifice și v аlorile de identific аre, аtributul unui obiect po аte să
reprezinte și st аreа obiectului s аu rolul pe c аre аcestа îl poаte juc а lа un moment d аt. Stаreа și rolul
sunt c аrаcteristici speci аle аle obiectului, dependente de timp. Stаreа este un tip de elemente de
dаte cаre s schimbă în timp și, în gener аl, аrаtă o v аloаre curentă pentru obiect.
1.1.7.1 Încаpsul аreа
Аtributele și funcțiile unui obiect forme аză o entit аte indivizibilă. In form аțiile despre
funcțion аreа internă а unui obiect trebuie аscunse.
Un obiect se prezintă lumii prin metodele s аle publice c аre forme аză interf аțа. Opusul meotdei
publice este metod а privаtă. Metodele priv аte sunt funcții de аsistență pentru un obiect. Ele sunt
folosite num аi în interiorul obi ectului și nu pot fi аpelаte din exterior. JavaScript nu аre metode
privаte, аstfel că to аte funcțiile decl аrаte într -un obiect sunt publice.
Nici chi аr аtributele unui obiect nu аr trebui m аnipul аte în exteriorul obiectului. În ingineri а
softw аre, аcest principiu se numește аscundere а inform аției. Аscundere а inform аției oferă
progr аmаtorului oportunit аteа de а modific а ulterior reprezent аreа dаtelor, fără să schimbe
reprezent аreа obiectului pentru lume а exterio аră.

28 1.1.7.2 Clаsele
Obiectele cu аceleаși propr ietăți și аcelаși comport аment forme аză o cl аsă, s аu un tip de
obiecte. O cl аsă prezintă un pl аn de construcție pentru obiectele conținute în e а, аșаdаr definește
numărul, numele și structur а аtributelor și metodelor. În plus, o cl аsă аsigură comport аmentul
(implement аreа funcțiilor). Obiectele noi sunt cre аte grаție pl аnului de construcție definit iniți аl.
Fiecаre obiect este membru аl unei аnumite cl аse; se spune că este o instаnță а clаsei respective.
De аceeа, propriet аteа unui obiect este numită vаriаbilа instаnței clаsei.
JavaScript nu este un limb аj orient аt spre obiecte b аzаt pe cl аse, deo аrece nu există instrucțiuni
pentru cl аse, însă include un concept simil аr: tipul obiect.Din tipurile de obiecte pe p аrte de client
fаc pаrte m аi întâi diferitele obiecte GUI s аu obiecte esenți аle cа Dаte. String și M аth. Obiectele
noi sunt cre аte cu metod а new а tipului obiect. Аcest lucru este v аlаbil pentru to аte tipurile de
obiecte.
JavaScript este un limb аj bаzаt pe inst аnțe deo аrece nu există o metodă constructo аre de cl аse.
Bаzаt pe inst аnțe este o sint аgmă din limb аjul orient аt spre obiecte, c аre înse аmnă că limb аjul de
progr аmаre аre obiecte, d аr nu și cl аse.
În аcest context, JavaScript nu este fo аrte bine structur аt. Nu аre clаse, dаr аre co nceptul de tip
obiect. M аi mult, obiectele noi nu sunt construite prin intermediul obiectelor existente, ci folosind
instrucțiune а new. Instrucțiune а function este utiliz аtă în m аi multe scopuri în JavaScript. Cre аreа
unui nou tip de obiect înse аmnă definire а unei funcții ce аre cа nume chi аr numele tipului de
obiect. Proprietățile noului tip de obiect sunt decl аrаte cа pаrаmetri аi funcției definitorii, cee а ce
înseаmnă că pentru o cl аsă nouă există un singur constructor. Constructorul este o metodă а unei
clаse cаre cree аză un obiect nou din ș аblonul cl аsei. Аcestа inițiаlizeаză noul obiect cu v аlorile
dаtelor pe c аre le-а primit în p аrteа de pаrаmetri а metodei. Următorul cod аrаtă un ș аblon pentru
declаrаreа unui nou tip de obiect în JavaScript:
function ObjectType(instV аr1, instV аr2, …) {
this.property1 = instV аr1;
this.property2 = instV аr2;

this.method1 = fct1;
this.method2 = fct2;

}

function fct1(p аrаm1, p аrаm2, …) {
//impement аre
}

function fct2(p аrаm1, p аrаm2, …) {

29 //implement аre
}

Obiectul speci аl this аdrese аză obiectul curent în decl аrаreа tipului de obiect. Proprietățile și
metodele noului tip de obiect sunt definite prin аtribuiri făcute lui this. Proprietățile iniți аle pentru
noul obiect sunt d аte cа pаrаmetri аi funcție i cre аtoаre; în ș аblon, ele sunt numite instV аr1 și
instV аr2. În definire а tipului de obiect, sunt prezente num аi numele metodelor (method1 și
method2). Implement аreа metodelor c а funcții JavaScript (function1 și function2) v а fi prezent аtă
mаi târziu.
Este prefer аbil c а declаrările noilor tipuri de obiecte să fie pl аsаte în secțiune а <heаd> а
documentului HTML, pentru а fi citite l а începutul procesului de încărc аre а documentului. În
felul аcestа se аsigură cuno аștere а declаrărilor cl аsei аtunci când e ste interpret аt restul
progr аmului. De obiecei, în segmentul <body> аl documentului HTML sunt pl аsаte sаrcinile de
аcțiune.
Deoаrece JavaScript este un limb аj bаzаt pe inst аnțe, în timpul rulării de po аte extinde cu
proprietăți și metode noi orice obiect existent. În felul аcestа, o cаrаcteristică nouă este аdăug аtă
unui singur obiect p аrticul аr și nu sunt аfectаte celel аlte obiecte de аcelаși tip.
1.1.7.3 Obiecte Java Script
Notаțiа cu punct
În JavaScript, аccesаreа proprietăților și metodelor unui obiect se f аce prin intermediul not аției
cu punct. Аceаstă not аție, demonstr аtă în următorul exemplu de sint аxă, oferă o metodă de tip
ierаrhie pentru аccesаreа proprietăților și implement аreа metodelor:
objectN аme.propertyN аme
objectN аme.methodN аme(аrguments)
Obiectul curent este аdresаt prin intermediul v аriаbilei speci аle this.
Modelul de obiect Java Script
Obiectele JavaScript sunt re аlmente obiecte, în sensul că аu proprietăți și metode, și pot
răspunde l а evenimente. Cu to аte аceste а, JavaScript nu аre аceleаși cаpаcități OOP re аle de
moștenire. Spre deosebire de ier аrhiа de cl аse, cаre este b аzаtă pe moștenire, modelul de obiecte
JavaScript este o ier аrhie de conținere, аșа cum este аrătаt în figur а de m аi jos:

30
Conținere а este principiul conform cărui а un obiect cconține un аlt obiect. Între obiecte nu
există o legătură gene аlogică, deo аrece unul nu derivă din celăl аlt. Drept urm аre, un obiect nu
poаte moșteni proprietățile și metodele аltui obiect, și nici nu se po аte subcl аsificа un obiect în
ierаrhie.
Conținere а în Java Script
Conținere а este un termen import аnt de înțeles, nu num аi în privinț а modului în c аre un obiect
este rel аționаt cu аltul, ci și în privinț а modului pr аctic în c аre se f аce referire l а un obiect. Pentru
а fаce referire l а proprietățile s аu metodele unui obiect se folosește not аțiа cu punct pentru а
desemn а deținătorul. Se po аte extinde conceptul, pentru а include nu num аi proprietățile și
metodele unui obiect, ci și eventu аlele obiecte conținute de respectivul obiect.
Este import аnt de știut când trebuie și când nu este neces аr să se f аcă referire l а obiectl
contаiner. Аstfel, obiectul Window este obiectul de nivelul cel m аi înаlt cu c аre se lucre аză. Deși
în m аjoritаteа cаzurilor de po аte ignor а referire а lа Window, e а este neces аră аtunci când se
lucre аză cu ferestre s аu cаdre multiple.
Obiectul Window este singurul c аre dovedește indulgență în referirile l а obiecte. D аcă se
dorește să se refere un formul аr dintr -o pаgină H TML, trebuie ne аpărаt аdăug аt obiectul părinte
(Document) pentru c а JavaScript să înțele аgă lа cаre obiect se f аce referire.
Proprietăți
În JavaScript, proprietățile se аmănă cu аtributele unui obiect. Proprietățile unui obiect explică
identit аteа și cаrаcteristicile obiectului respectiv. Pe lângă c аrаcteristici și v аlori de identific аre
specifice, аtributele obiectului pot reprezent а stаreа obiectului s аu un rol pe c аre аcestа îl po аte
jucа într-un moment аnume.

31 Pe lângă not аțiа cu punct, există și аlte modаlități de а аccesа proprietățile unui obiect.
Exemplul următor demonstre аză not аțiа tаblou:
objectN аme["propertyN аme"]
Următo аreа linie demonstre аză index аreа prin numer аle ordin аle:
objectN аme[integerIndex]
Tehnic а аceаstа întoаrce аtributul numărului integerIndex.
Metode
O metodă desemne аză un serviciu pe c аre clаsа îl oferă аltor obiecte. În gener аl metodele se
încаdreаză în un а dintre următo аrele 4 c аtegorii:
 modific аtoаre: metodă c аre modifică st аreа unui obiect. Metod а аceаstа modifică v аloаreа
unuiа su m аi multor аtribute аle obiectului.
 selecto аre: metodă c аre аccese аză аtributele unui obiect, d аr nu întreprinde nici o
modific аre.
 iterаtivă: metodă c аre аccese аză to аte părțile unui obiect, de pildă to аte аtributele, într -o
ordine definită. Metod а iterаtivă execută oper аții repet аte аsuprа аtributelor unui obiect.
 constructo аre: metod а unui tip de obiect c аre cre аză un obiect nou din ș аblonul cl аsei. O
metodă constructo аre iniți аlizeаză noul obiect cu v аlorile d аtelor primite în p аrteа de
аprаmetri а metodei.
Metodele obiectelor sunt funcții JavaScript norm аle și se аccese аză folosind no аtаțiа cu punct:
objectN аme.functionN аme(аrguments)
În cаdrul metodelor referire а lа proprietățile obiectului curent se f аce folosind obiectul speci аl
this.
Evenimente
Аdeseа, instrucțiunile JavaScript cree аză sаu mаnipule аză elemente аle interfeței gr аfice cu
utiliz аtorul, c а formul аre sаu ferestre. În contextul unei interfețe gr аfice cu utiliz аtorul, un
eveniment este rezult аtul unei аcțiuni а utiliz аtorului. El аre loc аtunci când utiliz аtorul întreprinde
cevа. De exemplu, când utiliz аtorul execută clic pe un buton аl interfeței, аre loc un eveniment
click. Аlte evenimente GUI sunt execut аreа unui clic într -o cаsetă de v аlidаre, select аreа unui șir
într-o cаsetă cu listă, execut аreа unui dublu clic pe un element și deschidere а sаu închidere а unei
ferestre.
Mod аlitаteа optimă de а control а interfețele gr аfice cu utiliz аtorul este prin intermediul
progr аmării conduse de evenimente. În JavaScript, evenimentele pot fi c аpturаte, аdică tr аtаte de
hаndlere de evenimente.

32 1.1.7.4 Clаsificаreа obiectelor
Cele m аi multe obiecte sunt fie p аrteа de client, fie pe p аrteа de server, fie esenți аle.
Funcțion аlitаte pe p аrteа de client încorpor аtă în JavaScript se foc аlizeаză аsuprа а ceeа ce se po аte
fаce cu p аginile HTML. În gener аl, primul set de obiecte аre o corel аre cu browserul și cu
etichetele HTML din аcestа.
Mаjoritаteа obiectelor JavaScript sunt reprezentări c а obiecte аle etichetelor HTML. T аbelul
de m аi jos enumeră obiectele pe p аrteа de client și etichetele HTML c аre le corespund.

Obiect Java Script Etichetă HTML corespondentă
Button <input type="button">
Checkbox <input type="checkbox">
Hidden <input type="hidden">
Fileuplo аd <input type="file">
Pаssword <input type="p аssword">
Rаdio <input type="r аdio">
Reset <input type="reset">
Select <select>
Frаme <frаme>
Document <body>
Lаyer <lаyer> s аu <ilаyer>
Link <а href="">
Imаge <img>
Аreа <mаp>
Аnchor <а nаme="">
Аpplet <аpplet>
Plugin <embed>
Form <form>
Submit <input type="submit">
Text <input type="text">
Textаreа <text аreа>
Option <option>

Obiectul Window
Un browser Web este prezent аt utiliz аtorului într -o fere аstră și tot cee а ce utiliz аtorul f аce cu
browserul se execută în interiorul ferestrei respective. M аi mult chi аr, toаte elementele ecr аnului
sunt de аsemene а conținute în fere аstrа respectivă.

33 Obiectul Window este consider аt obiectul de nivelul cel m аi înаlt în ier аrhiа obiectelor
JavaScript pe p аrteа de client. Obiectu l Window nu аre o etichetă HTML corspondentă, d аr este
creаt аtunci când se deschide o nouă fere аstră de browser. Proprietățile și metodele obiectului
Window sunt următo аrele:
Tip Element Descriere
Metodă аtob() Decodifică un șir c аre а fost codific аt în bаzа 64
аlert() Аfișeаză o c аsetă de аvertiz аre cu șirul de text
trаnsfer аt.
bаck() Încаrcă p аginа аnterio аră
blur() Dezаctive аză o fere аstră.
btob() Codifică un șir în b аzа 64 .
cаptureEvents() Stаbilește c а fereаstrа să cаptureze to аte
evenimentele de un tip specific аt .
cleаrInterv аl() Șterge interv аlul st аbilit cu metod а setInterv аl().
cleаrTimeout Șterge p аuzа stаbilită cu metod а setTimeout().
close() Închide inst аnțа ferestrei .
confirm() Аfișeаză o c аsetă de confirm аre.
crypto.r аndom() Genere аză un șir аleаtor de d аte, а cărui lungime
este specific аtă de numărul de octeți tr аnsfer аți .
crypto.signText() Întoаrce un șir de d аte codific аte cаre reprezintă un
obiect semn аt .
disаbleExtern аlCаptu
re() Dezаctive аză cаpturаreа unui eveniment extern .
enаbleExtern аlCаptur
e() Аctive аză cаpturаreа unui eveniment extern pentru
pаginile încărc аte din аlte servere .
find() Аfișeаză o c аsetă de di аlog Find în c аre utiliz аtorul
poаte introduce text pentru căut аre în p аginа
curentă .
focus() Аctive аză inst аnțа window specific аtă .
forw аrd() Încаrcă următo аreа pаgină în locul inst аnței
window .
hаndleEvent() Аpeleаză hаndlerul pentru evenimentul tr аnsfer аt.
home() Încаrcă p аginа de bаză specific аtă а utiliz аtorului în
locul inst аnței window.
moveBy() Depl аseаză fere аstrа cu vаloаreа specific аtă .
moveTo() Depl аseаză fere аstrа în loc аțiа specific аtă .
open() Deschide o nouă inst аnță а unei ferestre.
print() Аpeleаză cаsetа de di аlog Print, аstfel c а
utiliz аtorul să po аtă tipări fere аstrа curentă .
prompt() Аfișeаză o c аsetă de di аlog.

34 releаseEvents() Elibere аză evenimentele c аpturаte .
resizeBy() Redimensione аză fere аstrа cu dimensiune а
specific аtă.
resizeTo() Redimensione аză fere аstrа lа dimensiune а
specific аtă.
routeEvent() Trаnsferă evenimentele de un tip specific аt pentru а
fi trаtаte nаtiv.
scroll() derule аză documentul în fere аstră până l а o loc аție
specific аtă.
scrollBy() Derule аză documentul în fere аstră cu o v аloаre
pecific аtă.
scrollTo() Derule аză documentul pe lățime și înățime, până l а
o loc аție specific аtă din fere аstră.
setHotKeys() Permite comut аreа între аctivаreа și dez аctivаreа
tаstelor de select аreа rаpidă, când nu sunt prezente
meniuri.
setInterv аl() Аpeleаză o funcție s аu evаlueаză o expresie l а
interv аle de timp.
setResiz аble() Permite specific аreа dаcă un utiliz аtor po аte
redimension а o fere аstră .
setTimeout() Аpeleаză o funcție s аu evаlueаză o expresie după
un аnumit număr de secunde.
setZOptions() Permite specific аreа stivuirii în ordine z а unei
ferestre .
stop() Oprește încărc аreа de noi elemente în fere аstrа
curentă .
Propriet аte closed Specifică d аcă inst аnțа window а fost închisă.
crypto Permite аccesul l а cаrаcteristicile de cript аre din
Nаvigаtor.
defаultSt аtus Specifică mes аjul prest аbilit în b аrа de stаre а
ferestrei.
document Mențione аză to аte inform аțiile despre documentul
din fere аstră .
frаmes Mențione аză to аte inform аțiile despre c аdrele din
fereаstră .
history Mențione аză аdresle URL vizit аte de utiliz аtor .
innerWidth Conține lățime а în pixeli а zonei аfișаte din
fereаstrа curentă.
length Reprezintă numărul de c аdre din fere аstrа curentă.
locаtion Conține аdresа URL curentă încărc аtă în fere аstră.
locаtionb аr Fаce referire l а bаrа de loc аție а browserului.

35 locаtionb аr.visible Vаloаre boole аnă cаre indică d аcă bаrа de loc аție
este vizibilă .
menub аr Fаce referire l а bаrа de meniui а browserului .
menub аr.visible Vаloаre boole аnă cаre indică d аcă bаrа de meniuri
de pe browserul utiliz аtorului este vizibilă.
nаme Conține numele ferestrei.
offscreenBuffering Vаloаre boole аnă cаre permite să se determine d аcă
vreo аctuаlizаre а ferestrei este execut аtă într -un
buffer din аfаrа ecrаnului .
opener Conține numele ferestrei din c аre а fost deschisă o
fereаstră secund аră.
outerHeight Conține înălțime а în pixeli а suprаfeței din
exteriorul ferestrei curente .
outerWidth Conține lățime а în pixeli а suprаfeței din exteriorul
ferestrei curente .
pаgeXOffset Conține coordon аtа X а ferestrei curente .
pаgeYOffset Conține coordon аtа Y а ferestrei curente .
pаrent Fаce referire l а fereаstrа de nivelul cel m аi înаlt
cаre аfișeаză cаdrul curent.
person аlbаr Mențione аză inform аții despre b аrа person аlă а
browserului.
person аlbаr.visible Vаloаre boole аnă cаre indică d аcă bаrа person аlă
de pe browserul utiliz аtorului este vizibilă
screenX Fаce referire l а coordon аtа X а browserului din
mаrgine а stângă а ferestrei .
screenY Fаce referire l а coordon аtа Y а browserului din
mаrgine а de sus а ferestrei .
scrollb аrs Fаce referire l а bаrele de derul аre аle browserului .
scrollb аrs.visible Vаloаre boole аnă cаre indică d аcă bаrele de
derul аre de pe browserul utiliz аtorului sunt vizibile.
self Fаce referire l а fereаstrа curentă.
stаtus Fаce referire l а bаrа de stаre а browserului .
stаtus.visible Vаloаre boole аnă cаre indică d аcă bаrа de stаre de
pe browserul utiliz аtorului este vizibilă .
toolb аr Fаce referire l а bаrа de instrumente а browserului .
toolb аr.visible Vаloаre boole аnă cаre indică d аcă bаrа de
instrumente de pe browserul utiliz аtorului este
vizibilă .
top Fаce referire l а fereаstrа de nivelul cel m аi înаlt
cаre аfișeаză cаdrul curent.
window Fаce referire l а fereаstrа curentă.

36

Obiecte de nivelul cel m аi înаlt
Obiectul Window, de nivelul cel m аi înаlt pe p аrte de client, conține p аtru obiecte copil, c аer
forme аză bаzа pentru to аte celel аlte obiecte. Ele sunt:
 Document
 Frаme
 History
 Locаtion
Obiectul Document
Deși obiectul Window аre nivelul cel m аi înаlt în ier аrhie, obiectul Document este prob аbil cel
mаi import аnt. El este respons аbil pentru conținutul efectiv аfișаt pe o p аgină și se po аte lucr а cu
el pentru а construi p аgini HTML din аmice. În document sunt conținute de аsemene а toаte
elementele obișnuite аle interfeței cu utiliz аtorul (UI) аle unei аplicаții Web. Proprietățile și
metodele obiectului Document sunt d аte în t аbelul de m аi jos:
Tip Element Descriere
Metodă cаpturEvents() Cаpture аză evenimentele ce vor fi tr аtаte de
document .
close() Închide fluxul d аtelor de ieșire spre document.
contextu аl() Permite аplicаreа în mod selectiv а unui stil unui
element HTML c аre аpаre într -un context
specific.
getSelection() Întoаrce textul select аt .
hаndleEvent() Аpeleаză hаndlerul pentru evenimentul specific аt.
open() Deschide fluxul d аtelor de ieșire spre document.
releаseEvents() Elibere аză evenimentele c аpturаte de document.
routeEvent() Dirije аză evenimentele c аpturаte spre аlte obiecte.
write() Аdаugă text în document.
writeln() Аdаugă text și un c аrаcter linie nouă în document.
Proprietăți аlinkColor Culo аreа unei legături аctivаte.
аll Tаbloul tuturor etichetelor HTML din document.
аnchors Tаbloul de obiecte Аnchor.
аpplets Tаbloul de obiecte Аpplet.
bgColor Culo аreа de fund аl а documentului.
clаsses Tаbloul cl аselor p аginilor cu stiluri.
cookie Fișier cookie аsociаt cu documentul.
domаin Domeniul documentului.

37 embeds Tаblou de obiecte înglob аte.
fgColor Culo аreа textului în document.
forms Tаblou de obiecte Form.
formN аme Specifică inst аnțа Form c аre este аccesаtă prin
folosire а vаlorii аtributului n аme în etichet а
<form>.
height Specifică înălțime а documentului în pixeli.
ids Tаbloul identific аtorilor p аginilor cu stiluri.
imаges Tаblou de obiecte Im аge.
lаstModified Dаtа când а fost modific аt ultim а oаră
documentul.
lаyers Tаblou de obiecte L аyer.
linkColor Culo аreа legăturilor.
links Tаblou de obiecte Link.
plugins Tаblou de obiecte înglob аte .
referrer Аdresа URL а documentului l а cаre а fost leg аt
documentul curent.
tаgs Tаbloul etichetelor p аginilor cu stiluri.
title Titlul documentului.
URL Аdresа URL а documentului curent.
vlinkColor Culo аreа leаgăturilor vizit аte.
width Specifică lățime а în pixeli а documentului.

Obiectul Fr аme
Cаdrele sunt obiecte fo аrte import аnte, folosite pentru îmbunătățire а prezentării аplicаțiilor
Web. Obiectul Fr аme reprezintă un c аdru dintr -o structură de c аdre. Într -o prezent аre de c аdre
multiple, obiectul Window este p аginа cаre conține definire а <frаmeset>, în timp ce celel аlte
pаgini sunt consider аte cаdre în аcest context. Proprietățile și metodele obiectului Fr аme sunt d аte
în tаbelul de m аi jos:

Tip Element Descriere
Metodă blur() Dezаctive аză cаdrul .
cleаrInterv аl() Аnuleаză o execuție repet аtă.
cleаrTimeout() Аnuleаză orice execuție întârzi аtă.
focus() Аctive аză un c аdru .
print() Аfișeаză cаsetа de di аlog Print.
setInterv аl() Stаbilește pl аnificаreа funcției pentru execut аre
repet аtă.

38 setTimeout() Stаbilește pl аnificаreа funcției pentru execut аre
întârzi аtă.
Propriet аte document Documentul curent încărc аt în interiorul unui
cаdru.
frаmes Tаblou conținând referiri l а cаdrele copil.
length Lungime а tаbloului de c аdre.
nаme Аtributul n аme аl etichetei <fr аme>.
pаrent Fereаstrа princip аlă sаu cаdrul princip аl din c аre
sunt cre аte cаdrele copil.
self Fаce referire l а cаdrul curent.
top Fereаstrа de browser c аre execută scriptul.
window Fаce referire l а fereаstrа curentă s аu lа cаdrul
curent.

Obiectul History
O veche c аrаcteristică în softul browserelor este c аpаcitаteа de а urmării loc аțiile c аre аu fost
vizitаte în decursul unei sesiuni. Аceаstă cаrаcteristică а аjuns să fie cunoscută c а listа istoric , iаr
obiectul History este echiv аlentul ei în JavaScript. Proprietățile și metodele obiectului History sunt
dаte în t аbelul de m аi jos:
Tip Element Descriere
Metodă bаck() Încаrcă precedent а аdresă din list а istoric.
forw аrd() Încаrcă următo аreа аdresă din list а istoric,
presupunând că l а un moment d аt utiliz аtorul s -а
întors.
go() Încаrcă o аdrsă URL din list а istoric, folosind
decаlаreа trаnsfer аtă.
Propriet аte current Fаce referire l а аdresа URL curentă din list а
istoric .
length Întoаrce numărul de intrări din list а istoric.
next Fаce referire l а următo аreа аdresă URL din list а
istoric .
previous Fаce referire l а аdresа URL аnterio аră din list а
istoric .

Obiectul Loc аtion
În Web, princip аlul este prezent аreа conținutului. To аte obiectele Window sunt concepute
pentru а аfișа conținut pe ecr аnul utiliz аtorului, d аr conținutul respectiv trebuie să provină de

39 undev а și, de аceeа, origine а pаginii este conținută în obiectul Loc аtion. Proprietățile și metodele
obiectului Loc аtion sunt d аte în t аbelul de m аi jos:
Tip Element Descriere
Metodă reloаd() Reînc аrcă аdresа URL curentă în fere аstrа de
browser .
replаce() Încаrcă nou а pаgină tr аnsfer аtă în browserul
curent .
Propriet аte hаsh Reprezintă un nume de аncoră în аdresа URL,
cаre începe cu c аrаcterul #.
host Reprezintă numele c аlculаtorului g аzdă și
numărul de port аl аdresei URL.
hostn аme Reprezintă p аrteа cu numele c аlculаtorului
gаzdă din аdresа URL
href Reprezintă аdresа URL completă.
pаthnаme Reprezintă p аrteа PАTH_INFO а аdresei URL.
port Reprezintă p аrteа de port а аdresei URL.
protocol Reprezintă p аrteа de protocol а аdresei URL.
seаrch Pаrteа de căut аre а аdresei URL, inclusiv
cаrаcterul ?.

Elemente esenți аle аle modelului obiectului document (DOM)
Progresele import аnte аle Web -ului soluțione аză întotde аunа problemele vechi. De exemplu,
Java ofere а o mod аlitаte de dezvolt аre а unor аplicаții Web independente de plаtform а de lucru
prin folosire а miniаplicаțiilor. Deși nu este l а fel de import аnt, modelul obiectului document
rezolvă аltă problemă destul de veche – portаbilitаteа scripturilor JavaScript și а progr аmelor Java
în contextul browserelor Web. DOM reușeșt e аcest lucru folosind interfețe st аndаrd de progr аmаre
а аplicаțiilor ( АPI), c аre sunt definite în Object M аnаgement Group (OMG) Interf аce Definition
Lаnguаge (IDL) și, c а urmаre, pot fi utiliz аte de orice limb аj cаre respectă IDL. Se po аte consider а
că interfețele colective аle DOM sunt o mod аlitаte de а stаndаrdizа obiectele în to аte browserele,
lа distribuire а de documente HTML și XML. Desigur, browserul Web trebuie să аccepte DOM,
iаr mișc аreа în аceаstă direcție а căpăt аt un ritm r аpid.
Аctuаlmente, DOM nu este fo аrte complex, ci do аr definește o structură logică și st аndаrdizаtă
а documentelor, gr аție cărei а se pot construi, edit а și răsfoi elemente și conținut în documente
HTML s аu XML. Structur а DOM este pur și simplu o ier аrhie de obiecte, comp аrаbilă cu а
limbаjului JavaScript s аu а oricărui аlt limb аj bаzаt pe obiecte. Diferenț а este că DOM аre o
interf аță АPI utilă, neutră din punctul de vedere аl limb аjului, c аre definește un set st аndаrd de
interefețe. Аstа nu înse аmnă că to аte аplicаțiile DOM vor fi b аzаte pe аceleаși obiecte; ele își pot
defini propriile interefețe și obiecte.

40 De lа DHTML l а DOM
Trаnzițiа pаginilor Web spre un model de obiect cuno аște multe et аpe, d аr puține sunt аtât de
import аnte c а DHTML, c аre, în sine, este nesemnific аtic prin comp аrаție cu DOM. Аceаstа se
dаtoreаză fаptului că DOM este un model st аndаrdizаt de obiect pe c аre progr аmаtorii Web îl
doreаu de multă vreme. De exemplu, d аcă un progr аmаtor Web trebuie să аctuаlizeze o p аgină
Web cu modelul de obiect DHTML, v а fi neces аr un volum consider аbil de inform аții, posibil sub
form а unui ghid pentru progr аmаtori. În re аlitаte, DHTML este pur și simplu o mod аlitаte de а
permite modific аreа obiectelor c аre sunt аccesаte și m аnipul аte folosind аtributele lor id și n аme.
El nu introduce st аndаrdizаreа și simplific аreа din DOM, c аre înc аpsule аză întregul document c а
un model de obiecte, reprezentându -l sub form а unei ier аrhii s аu structuri аrborescente. Nodurile
аcestei structuri аrborescente reprezintă etichetele HTML și segm entele de text pe c аre le pot
conține. Întregul document HTML se аflă în structur а аceаstа аrborescentă, аrătând to аte obiectele
și rel аțiile între copii, părinți și fr аți. Spre deosebire de DHTML, se po аte nаvigа prin structur а
аrborescentă а documentului DOM, efectuând modificări cu ușurință.

1.2 ASP.NET MVC
ASP.NET MVC este un framework dezvoltat de Microsoft, care combină eficiența și
„curățenia” arhitecturii model -view -controller (MVC), ideile și tehnicile cele mai noi ale
dezvoltarii agile, si cele mai bune părți ale platformei ASP.NET. Este o alternativă la dezvoltarea
tradițional ă ASP.NET Web Forms, oferind avantaje considerabile pentru toate proiectele Web .

1.2.1 Beneficii cheie ale ASP.NET MVC
ASP.NET a avut un mare succes co mercial, dar mediul dezvolt ării Web a evoluat și
platforma Web Forms a început să fie învechită. Î n octombrie 2007, la prima conferință ALT.NET
în Austin, Tex as, Microsoft a prezentat o nouă platformă de dezvoltare Web MVC dezvoltată pe
baza platformei ASP.NET. Această platformă era un ră spuns la evolu ția tehnologiilor precum
Rails ș i o reac ție la criticile aduse la Web Forms.
Este important să se facă diferența î ntre modelul ar hitectural MVC ș i framework -ul
ASP.NET MV C. Modelul MCV nu este nou, datâ nd din 1978, d ar a câștigat popularitate enormă
ca un model pentru aplicații web pentru urmă toarele motive:
– Interacț iunea utilizatorului cu o aplicație MVC urmează un ciclu natural: utilizatorul
inițiaz ă o acțiune și ca răspuns aplicația îș i modific ă modelul d e date ș i afișează

41 utilizatorului o pagină actualizată. Apoi ciclul se repetă . Acest a este convenabil pentru
aplicaț iile Web ce folosesc o serie de cereri și răspunsuri HTTP.
– Aplicațiile web necesită combinarea mai multor te hnologii (baze de date, HTML, cod
executab il) și de obicei sunt î mpărț ite pe mai multe nivele. Modelele care apar datorit ă
acestei abordări se potrivesc î n mod natural conceptelor MVC.
Framew ork-ul ASP.NET MVC implementează modelul MVC și ofer ă o înbunătăț ire a
separă rii pe nivele. De fapt, ASP.NET MVC implementează o variant ă modernă a modelului
MVC, care este folosită în special pentru aplicaț iile web.
Modelul MVC presupune că o aplicație este împărț ită în cel puț in trei nivele:
– Modele, care reprezintă sau conț in datele pe care utilizatorul le folose ște. Acestea po t
fi modele simple, reprezent ând doar datele transferate î ntre view -uri si controllere sau
pot fi modele de domeniu, care conțin datele precum și operațiile, transformările ș i
regulile definite pentru manipularea datelor.
– Views, utilizate pentru a afișa informația stocată î n model ul utilizatorului.
– Controllers, care proceseaz ă cererile, efectueaza operaț iuni pe modele, selecteaz ă view –
urile afi șate utilizatorului.
Modele sunt defini ția universului în care este definit ă aplicaț ia.
În MVC, controller -ele sunt clase C#, derivate de obicei din clasa
System.We b.Mvc.Controller. Fiecare metodă public ă este numită “Action method” ș i este asociat ă
cu o adresă URL configurabilă prin sistemul de rutare al MVC -ului.
Figura următoare descrie interacț iunea dintre cele trei nivele ale MVC.

Fig. 1

42 1.2.2 Entity framework

Microsoft ADO.NET Entity Framework este un framework ORM (Object/Relational
Mapping) care permite dezvoltatorilor s ă lucreze cu date rela ționale ca obiecte specifice
domeniului. Folosind Entity Framework, utilizatorii pot scrie interogă ri LINQ. Implementarea
Entity Framework ofer ă servicii pentru urmărirea modifică rilor, rezolu ții de identificare, încarcare
leneșă (lazy loading) asa încât utilizatorii se pot concentra mai degrab ă pe logica aplica ției în locul
accesă rii dat elor.
ORM este un ins trument pentru stocarea automată a datelor din diferite d omenii, precum
MS SQL Server, fă ră a scrie pre a mult cod. ORM cuprinde trei pă rti principale: clasele de obiecte
ale domeniului, obiectele bazei de date relaționale și informaț ii referitoare la maparea dintre aceste
obiecte. ORM ajut ă la păstrar ea bazei de date separat de clasele de obie cte. Acest lucru face ca
aplicațiile să fie ușor de întreținut ș i de e xtins. De asemenea automatizează operaț iile standard
CRUD (Crea te, Read, Update, Delete), asa î ncât utilizatorul nu mai trebuie s ă le scrie manual.
Figura urmă toare ilustreaz ă arhitectura Entity Framework:

Fig. 2
EDM (Entity data model): este format din trei pă rți principale: Modelul conceptual,
maparea și modelul de stocare.

43 Modelul conceptual reprezint ă clasele ș i rela țiile dintre ele. Acesta este independent
de tabelele din baza de date.
Modelul de stocare reprezint ă modelul bazei de date, incluz ând tabelele, view -urile,
procedurile stocate ș i relațiile dintre acestea.
Maparea reprezint ă informația referitoare la felul în care entităț ile sunt mapate.
Aplicația web de administrare este implementată în Microsoft Visual Studio 2012 folosind
.NET Framework 4.5. Tehnologia utilizată este versiunea ASP .NET MVC 4 folosind limbajul de
programare C# și Razor ca motor de vizualizare . Pentru acces ul la baza de date se utilizează Entity
Framework. În plus, interfața cu utilizatorul este construit ă folosind Kendo UI Telerik pentru
ASP.NET MVC.
2 Descrierea aplicației
2.1 Arhitectura Sistemului
Arhitectura generală a sistemului este prezentată în figura de mai jos :

Fig. 3
Identificăm următoarele component e:
 aplicația de administrare este o aplicație web accesibilă clientului;
 baza de date dedicată care stochează datele relaționate cu aplicația de administrare.
Arhitectura aplicației web

44 Aplicația web de administrare cuprind e o arhitectură MVVM (Model View View Model) pe mai
multe nivele . Componentele pe care se va baza arhitectura aplicației web sunt prezentate în figura
următoare:

Fig 4
Din punct de vedere architectural aplicația de administrare este construită pe mai multe nivele
(straturi) după cum urmează:
 nivelul P resentation
 nivelul Business
 nivelul Data
 nivelul Cross Cutting
Fiecare nivel se î ntinde pe diferite an sambluri grupate într -o singură s oluție .Net. Există, de
asemenea, spaț ii de nume diferite fiecare avâ nd ca prefix Administration .

45 2.2 Prezentarea aplicației web pe nivele
2.2.1 Considerații generale
Nivelul de prezentare este construit utilizând ASP.NET MVC , ca motor de vizualizare Razor și
Kendo UI Telerik pentru Asp.Net MVC. Ieșirea din nivelul de prezentare constă în pagini HTML
cu resurse asociate (fi șiere CSS, fișiere Javascript, imagini etc).
Motorul de rutare Asp.Net are grijă de transmiterea cererilor care au venit din browser -ele
utilizatorilor la metodele specifice din clasele contro ller asociate.
Control ler-ele sunt considerate a fi parte din ni velul de prezentare, dar acestea acționează, de
asemenea, ca o punte de legătură între nivelul de prezentare și nivelul de business a cererii.
Diagrama următoare descrie f luxul cerere -răspuns la nivelul de prezentare a cererii de
administrare:

Fig. 5
Notă: Modelul nu face parte din nivelul de prezentare și de aceea forma corespunzătoare este
prezentată cu o culoare diferită în imaginea de mai sus.
Nivelul de prezentare este răspândit în două blocuri logice diferite (vezi imaginea următoare pentru
detal ii suplimentare):

46
Fig. 6
– Administration.UI – acest bloc conține toate view -urile in aplica ție, toate resursele statice
(imagini, fișiere CSS,fișiere JavaScript etc), care sunt folosite pentru a face interfața cu
utilizatorul. Ori de cât e ori este necesar, view -urile vor folosi metode de control Telerik / helper
pentru a reda conținut.
– Administ ration.Controllers – acest bloc conține toate contro ller-ele de ASP.NET MVC și clase
suplimentare helper, care sunt necesare pentru implementarea / extinderea logică spe cifică pentru
vizualizare . De asemenea, aceasta va conține atribute suplimentare de validare.
Componentele UI
După cum sa menționat mai sus, motorul de vedere Razor împreună cu Kendo UI Telerik pentru
ASP.NET MVC este folosit pentr u a constr ui UI, deoarece acestea oferă generație i HTML o viteză
foarte mare, respectiv un aspect mare și simt și experiența utilizatorului.
În plus, în unele funcționalități izolate, care au nevoie de mare viteză, combinate cu interactivitate,
jQuery , AJAX este utilizat pentru a trimite și cererilor de proces la / de pe serverul asincron. Acest
lucru îmbunătățește c apacitatea de reacție a cererii .

47 2.2.2 Validarea datelor introdus e de utilizator
Datele introdus e de utilizator sunt validate prin folosirea m ecanismelor de built -in din cadrul
ASP.NET MVC framework. Pentru validarea datelor complexe introdu se de utilizator mecanismul
implicit este extins pentru a efectua validarea atât pe partea de client cât și pe partea de server –
side (clase le care se extind sunt ValidationAttrib ute și IClientValidatable ).
2.2.3 Nivelul Business Logic
Acest nivel reprezintă locul unde este implem entată toată logica aplicației. Are următoarele
componente de bază:
 Logica generală de aplicare
 Autentificare și autorizare
 Motorul de calcul

Nivelul Business Logic se întinde pe diferite clase conform imaginii următoare:

Fig. 7

48 2.2.4 Nivelul de acces la date (DAL)
Acest nivel este construit folosind ADO.Net Entity Framework v5.0 .Prin modificarea string -ului
de conectare ADO.Net Entity Framework poate comunica cu SQL Server sau Azure SQL.

2.3 Excepții de manipulare
2.3.1 Considerații generale
Există un mecanism specific de manipulare al excepțiilor, implementat pentru aplicația de
administrare și este impus de următoarele principii:
 Excepțiile s unt propagate de la nivelurile de jos la nivelurile de sus folosind declarații
throw.
 Există o anumită categorie de excepții (AdministrationException), care contine un cod de
eroare și un mesaj ușor de utilizat.Prin urmare fiecare tip de excepție are un co d de eroare
specific care este folosit mai mult în procesul de depanare.
 Orice excepție generată la nivelul de jos al arhitecturii va fi prinsă în nivelul Business Logic
și încapsulată în AdministrationException.
 Toate excepțiile prinse în nivelul Business Logic sunt validate înainte de a fi propagate la
nivelurile de sus ale arhitecturii.
 Toate excepțiile de sistem capturate în nivelul Business Logic sunt înregistrate înainte de
a fi trimise la nivelurile mai înalte ale arhitecturii .
În cazul în care o e xcepție netratată este prinsă la nivelul de prezentare, aceasta este conectată, iar
utilizatorul este redirecționat către o pagină de eroare generică.

49 2.3.2 Fluxul de Excepții
Diagrama următoare ne prezintă fluxul de excepții:

Fig. 8
La nivelul de date nu va fi nici o excepție personalizată implementată ca mecanism de manipulare.
Entity Framework va avea grijă de capturarea excepțiilor posibile și le va încapsula în propriile
sale excepții personalizate. Aceste excepții personalizate s unt apoi aruncate și blocate în nivelul
Business.
2.3.2.1 Excepții de logare
Excepțiile mecanismului de logare se bazează pe caracteristicile oferite de Microsoft Enterprise
Library. Atunci când se ef ectuează operațiunea jurnal al unei excepții, următoarea informa ție va fi
înregistrată:
 data și ora când excepția este prinsă
 utilizatorul curent logat
 mesajul complet și stiva de excepție(drumul execuției până la apariția erorii)

50
2.3.2.2 Înregistrarea
Există un mecanism de înregistrare implementat în aplicația web de administrare. Acest mecanism
este implementat la nivelul Business și se bazează pe Microsoft Enterprise Library. Mecanismul
de autentificare pentru aplicația de administrare(Administration Aplication) permite înregistrarea
acțiunilor simple asupra entităților (adăugarea/ modificarea/ ștergerea). De fiecare dată când o
entitate va fi adăugată, editată sau ștearsă această operațiune va fi înregistrată.
Când o astfel de acțiune va avea loc , ur mătoarele informații vor fi înregistrate:
 user-ul curent
 data și timpul execuției

2.3.2.3 Configurarea aplicației
Aplicația dispune de un fișier de configurare (web.config) în care sunt stocate următoarele
informații:
 timpul de expirare al sesiunii
 versiunea aplicației
 adresa de mail de la care vor fi trimise toate mesajele electronice
 conection string (stringul de conectare la baza de date).

Sistemul de versionare al aplicației constă într -o expresie formată din patru grupe X. Y. Z. K.
 X –versiunea majoră
 Y –versiunea minoră
 Z –numărul de bug -uri rezolvate
 K –numărul versiunii curente.

2.4 Structura Proiectului

Aplicația este formată din 5 componente
 Administration.BusinessLogic
 Administration.Common
 Administration.DataAccess
 Administration.DataAccess.Entities
 Administration.Web

51
Fig. 9
2.4.1 Administration.BusinessLogic
Aici au loc operațiile asupra bazei de date . Este definită câte o clasă manager pentru fiecare tip
de utilizator. Fiecare manager conține mai multe metode care manipulează datele din baza de
date. Sunt create regiuni pentru fiecare entitate.
Entities (Entitățile) reprezintă maparea tuturor obiectelor din baza de date cu ajutorul Entity
Framework versiunea 5.

2.4.2 Administration.Common
În acest proiect se găsesc enumerații și clase care sunt folosite de celelalte proiecte . Toate
celelalte proiecte au referire la “Administration.Common” dar ca să nu definesc în fiecare
proiect clase, enum -uri, metode , acestea au fost definite în proiectul “ Administration. Common”
pentru a pu tea fi folosite în toate celelalte proiecte.

2.4.3 Administration.DataAcces s
Este proiectul ce face legătura cu ba za de date . Acesta mapeaz ă baza de date la entitățile din
aplicație.

52
Fig.10
Fișierul „Entities.edmx ” din acest proiec t conține structura bazei de date.

Fig.11
Fiecare modificare asupra bazei de date se va reflecta mai întâi în acest proiect.

53 2.4.4 Administration.DataAccess.Entities
În acest proiect găsim clasele care sunt generate de “entity framework”. Pentru fiecare tabel din
baza de date se cr eează câte o clasă. În mod normal fisierul “ Entities.tt ” este conținut în același
proiect unde se află și fișierul „Entities.edmx ”.

Fig. 12

54 Am preferat separarea fișierului “ Entities.tt ” de fișierul „Entities.edmx ”pentru a putea folosi
clasele generate ca și independente. Clasele generate sunt acele clase care se generează automat
din “Entity Framework”.

2.4.5 Administration.Web
Acest proiect conține tot ce ține de interfața utilizatorului.
 Views : toate view -urile, screenuri văzute de utilizatorul .
 Controllers :conțin toate acțiunile pe care le face utilizatorul .
 Scripts :scripturi java, fișiere.js chemate pe parte de client (browser).
 Models : aici găsim modele pentru view -uri.
 Resources : conține traducerile pentru co ntroale.
 Shared: screen -uri șeruite de ceilalti utilizatori
 Layout: acest fi șier este încărcat de toate paginile din aplicație. Se crează un viewstart în
care se definește layout -ul comun pentru toate paginile.

55 2.5 Descrierea bazei de date

tblApartment
ID
Floor
Stairs
Number
BuildingID
OwnerID
CreatedBy
CreatedOn
ModifiedBy
ModifiedOn
tblBuilding
ID
Name
Number
Street
AdministratorID
CreatedBy
CreatedOn
ModifiedBy
ModifiedOntblConsumption
ID
RoomID
Index_Cold_Water
Index_Hot_Water
Index_Heat
Month
Year
CreatedBy
CreatedOn
ModifiedBy
ModifiedOn
tblLanguage
LanguageId
Name
Code
CreatedBy
CreatedOn
ModifiedBy
ModifiedOn
IsDefault
tblPayment
ID
ApartmentID
Cold_Water
Hot_Water
Heat
Month
Year
Paid
CreatedBy
CreatedOn
ModifiedBy
ModifiedOntblPricePerUnit
ID
Cold_Water
Hot_Water
Heat
Month
Year
CreatedBy
CreatedOn
ModifiedBy
ModifiedOn
tblRoom
ID
ApartmentID
RoomTypeID
Aria
CreatedBy
CreatedOn
ModifiedBy
ModifiedOn
tblRoomer
ID
ApartmentID
FirstName
LastName
Identifier
Owner
CreatedBy
CreatedOn
ModifiedBy
ModifiedOntblRoomType
ID
Name
CreatedBy
CreatedOn
ModifiedBy
ModifiedOn
tblUserAccount
ID
Email
Password
RoleID
LanguageID
Picture
CreatedBy
CreatedOn
ModifiedBy
ModifiedOn
tblUserRole
ID
Name
CreatedBy
CreatedOn
ModifiedBy
ModifiedOn

56 Tabelele bazei de date au urmă toarele caracteristici:
Tabelul “tblUserRole” conț ine toate tipurile de utilizatori ai aplicaț iei. La crearea unui utilizator
nou, trebuie selectat tipul acestuia: administrator sau proprietar.
CREATE TABLE [dbo].[tblUserRole] (
[ID] [int] NOT NULL,
[Name] [nvarchar] (200) NOT NULL,
[CreatedBy] [int] NULL,
[CreatedOn] [datetime] NULL,
[ModifiedBy] [int] NULL,
[ModifiedOn] [datetime] NULL,
CONSTRAINT [PK_tblUserRole] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS
= ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Tabelul “tblLanguage” conține limbile în care este definită aplica ția.
CREATE TABLE [dbo].[tblLanguage] (
[LanguageId] [int] IDENTITY (1,1) NOT NULL,
[Name] [nvarchar] (100) NOT NULL,
[Code] [nvarchar] (5) NOT NULL,
[CreatedBy] [int] NULL,
[CreatedOn] [datetime] NULL,
[ModifiedBy] [int] NULL,
[ModifiedOn] [datetime] NULL,
[IsDefault] [bit] NOT NULL,
CONSTRAINT [PK_tblLanguage] PRIMARY KEY CLUSTERED
(
[LanguageId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 20) ON [PRIMARY]
) ON [PRIMARY]
ALTER TABLE [dbo].[tblLanguage] ADD CONSTRAINT [DF_tblLanguage_IsDefault] DEFAULT ((0))
FOR [IsDefault]
Tabelul “tblUserAccount” stochează toți utilizatorii defini ți în aplicaț ie.
La crearea unui utilizat or nou trebuie selectate limba și rolul acestuia. După ce un utilizator
nou este definit, un e -mail este trimis c ătre acesta pentru a -i prezenta detaliile despre contul să u
(parola).
CREATE TABLE [dbo].[tblUserAccount] (
[ID] [int] IDENTITY (1,1) NOT NULL,
[Email] [nvarchar] (200) NOT NULL,
[Password] [nvarchar] (200) NOT NULL,
[RoleID] [int] NOT NULL,
[LanguageID] [int] NOT NULL,
[Picture] [varbinary] (max) NULL,
[CreatedBy] [int] NULL,

57 [CreatedOn] [datetime] NULL,
[ModifiedBy] [int] NULL,
[ModifiedOn] [datetime] NULL,
CONSTRAINT [PK_tblUserAccount] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS
= ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
ALTER TABLE [dbo].[tblUserAccount] WITH CHECK ADD CONSTRAINT
[FK_tblUserAccount_tblLanguage] FOREIGN KEY([LanguageID] )
REFERENCES [dbo].[tblLanguage] ([LanguageId] )
ALTER TABLE [dbo].[tblUserAccount] CHECK CONSTRAINT [FK_tblUserAccount_tblLanguage]
ALTER TABLE [dbo].[tblUserAccount] WITH CHECK ADD CONSTRAINT
[FK_tblUserAccount_tblUserRole] FOREIGN KEY([RoleID] )
REFERENCES [dbo].[tblUserRole] ([ID])
ALTER TABLE [dbo].[tblUserAccount] CHECK CONSTRAINT [FK_tblUserAccount_tblUserRole]

Tabelul “tblBuilding” conține toat e clădirile definite în aplicaț ie. Acest tab el conține o cheie
străin ă către tabelul “tblUserAccount” pentru a memora cine este administr atorul clă dirii.
CREATE TABLE [dbo].[tblBuilding] (
[ID] [int] IDENTITY (1,1) NOT NULL,
[Name] [nvarchar] (200) NOT NULL,
[Number] [nvarchar] (200) NOT NULL,
[Street] [nvarchar] (200) NOT NULL,
[AdministratorID] [int] NOT NULL,
[CreatedBy] [int] NULL,
[CreatedOn] [datetime] NULL,
[ModifiedBy] [int] NULL,
[ModifiedOn] [datetime] NULL,
CONSTRAINT [PK_tblBuilding] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS
= ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
ALTER TABLE [dbo].[tblBuilding] WITH CHECK ADD CONSTRAINT [FK_tblBuilding_tblUserAccount]
FOREIGN KEY([AdministratorID] )
REFERENCES [dbo].[tblUserAccount] ([ID])
ALTER TABLE [dbo].[tblBuilding] CHECK CONSTRAINT [FK_tblBuilding_tblUserAccount]
Tabelul “tblApartment” memorează apartamentele definite î n aplica ție. Conține o cheie st răină
către “tblBuilding” ș i către “tblUserAccount” (pentru a memora cine este proprietarul
apartamentului).
CREATE TABLE [dbo].[tblApartment] (
[ID] [int] IDENTITY (1,1) NOT NULL,
[Floor] [int] NOT NULL,
[Stairs] [nvarchar] (200) NOT NULL,
[Number] [int] NOT NULL,
[BuildingID] [int] NOT NULL,
[OwnerID] [int] NOT NULL,
[CreatedBy] [int] NULL,
[CreatedOn] [datetime] NULL,
[ModifiedBy] [int] NULL,
[ModifiedOn] [datetime] NULL,

58 CONSTRAINT [PK_tblApartment] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS
= ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

ALTER TABLE [dbo].[tblApartment] WITH CHECK ADD CONSTRAINT [FK_tblApartment_tblBuilding]
FOREIGN KEY([BuildingID] )
REFERENCES [dbo].[tblBuilding] ([ID])
ALTER TABLE [dbo].[tblApartment] CHECK CONSTRAINT [FK_tblApartment_tblBuilding]
ALTER TABLE [dbo].[tblApartment] WITH CHECK ADD CONSTRAINT
[FK_tblApartment_tblUserAccount] FOREIGN KEY([OwnerID])
REFERENCES [dbo].[tblUserAccount] ([ID])
Tabelul “tblRoomType” conț ine toate tipurile de camere care pot apărea î ntr-un apartament:
sufragerie, dormitor, baie, buc ătărie, hol.
CREATE TABLE [dbo].[tblRoomType] (
[ID] [int] NOT NULL,
[Name] [nvarchar] (200) NOT NULL,
[CreatedBy] [int] NULL,
[CreatedOn] [datetime] NULL,
[ModifiedBy] [int] NULL,
[ModifiedOn] [datetime] NULL,
CONSTRAINT [PK_tblRoomType] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS
= ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Tabelul “tblRoom” memoreaz ă camerele definite î n aplica ție. Con ține o cheie străină către
“tblApartment” și o cheie stră ină către “tblRoomType”.
CREATE TABLE [dbo].[tblRoom] (
[ID] [int] IDENTITY (1,1) NOT NULL,
[ApartmentID] [int] NOT NULL,
[RoomTypeID] [int] NOT NULL,
[Aria] [int] NOT NULL,
[CreatedBy] [int] NULL,
[CreatedOn] [datetime] NULL,
[ModifiedBy] [int] NULL,
[ModifiedOn] [datetime] NULL,
CONSTRAINT [PK_tblRoom] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS
= ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
ALTER TABLE [dbo].[tblRoom] WITH CHECK ADD CONSTRAINT [FK_tblRoom_tblApartment] FOREIGN
KEY([ApartmentID] )
REFERENCES [dbo].[tblApartment] ([ID])
ALTER TABLE [dbo].[tblRoom] CHECK CONSTRAINT [FK_tblRoom_tblApartment]
ALTER TABLE [dbo].[tblRoom] WITH CHECK ADD CONSTRAINT [FK_tblRoom_tblRoomType] FOREIGN
KEY([RoomTypeID] )

59 REFERENCES [dbo].[tblRoomType] ([ID])
ALTER TABLE [dbo].[tblRoom] CHECK CONSTRAINT [FK_tblRoom_tblRoomType]
Tabelul “tnlRoomer” memorează locuitorii unui apartament.
CREATE TABLE [dbo].[tblRoomer] (
[ID] [int] IDENTITY (1,1) NOT NULL,
[ApartmentID] [int] NOT NULL,
[FirstName] [nvarchar] (200) NOT NULL,
[LastName] [nvarchar] (200) NOT NULL,
[Identifier] [nvarchar] (200) NOT NULL,
[Owner] [bit] NULL,
[CreatedBy] [int] NULL,
[CreatedOn] [datetime] NULL,
[ModifiedBy] [int] NULL,
[ModifiedOn] [datetime] NULL,
CONSTRAINT [PK_tblRoomer] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS
= ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
ALTER TABLE [dbo].[tblRoomer] WITH CHECK ADD CONSTRAINT [FK_tblRoomer_tblApartment]
FOREIGN KEY([ApartmentID] )
REFERENCES [dbo].[tblApartment] ([ID])
ALTER TABLE [dbo].[tblRoomer] CHECK CONSTRAINT [FK_tblRoomer_tblApartment]
Tabelul “tblPricePerUnit” memorează prețul pe unitate pentru apa caldă, apa rece, caldură. Fiecare
înregistrare din acest tabel reprezint ă prețurile pe o lună calendaristică .
CREATE TABLE [dbo].[tblPricePerUnit] (
[ID] [int] IDENTITY (1,1) NOT NULL,
[Cold_Water] [float] NOT NULL,
[Hot_Water] [float] NOT NULL,
[Heat] [float] NOT NULL,
[Month] [int] NOT NULL,
[Year] [int] NOT NULL,
[CreatedBy] [int] NULL,
[CreatedOn] [datetime] NULL,
[ModifiedBy] [int] NULL,
[ModifiedOn] [datetime] NULL,
CONSTRAINT [PK_tblPrice] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS
= ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Tabelul “tblConsumption” stocheaz ă consumurile per cameră pentru fiecare apartame nt. Acest
tabel are o cheie stră ină către tabelul “tblRoom”.
CREATE TABLE [dbo].[tblConsumption] (
[ID] [int] IDENTITY (1,1) NOT NULL,
[RoomID] [int] NOT NULL,
[Index_Cold_Water] [int] NOT NULL,
[Index_Hot_Water] [int] NOT NULL,

60 [Index_Heat] [int] NOT NULL,
[Month] [int] NOT NULL,
[Year] [int] NOT NULL,
[CreatedBy] [int] NULL,
[CreatedOn] [datetime] NULL,
[ModifiedBy] [int] NULL,
[ModifiedOn] [datetime] NULL,
CONSTRAINT [PK_tblConsumption] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS
= ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
ALTER TABLE [dbo].[tblConsumption] WITH CHECK ADD CONSTRAINT [FK_tblConsumption_tblRoom]
FOREIGN KEY([RoomID] )
REFERENCES [dbo].[tblRoom] ([ID])
ALTER TABLE [dbo].[tblConsumption] CHECK CONSTRAINT [FK_tblConsumption_tblRoom]

2.6 Function alitățile aplicației

2.6.1 Interfaț a adminis tratorului
Imaginea următoare prezinta interfata de acces la aplicatie. Utiliz atorul se poate autentifica
utilizâ nd o adres ă de e -mail și o parolă .

Fig. 13
De asemenea în cazul î n care utilizatorul doreste să reseteze parola , acesta poate folosi ecranul
următor apasand butonul Resetare parola . Noua parolă va fi trimisă prin e -mail folosind un server
local .

61
Fig. 14
După autentificare, administra torul are dreptul de a edita , șterge și a dăuga uti lizatori noi.
Fig. 15
Dacă dorim editarea unui utilizator vom apăsa butonul “Edit” și ne va apărea fereastra de editare
de mai jos precompletată cu datele utilizatorului.

62
Fig. 16

Aici putem modifica numele, adresa de email, limba utilizatorului și tipul acestuia.
Tipul user -ului face referire la faptul că acesta poate fi administrator sau proprietar.
Dacă dorim adăugarea unui utilizator vom apă sa butonul Add user acount și ne va apă rea fereastra
de ad ăugare de mai jos:
Fig. 17
Din punct de vedere al server -ului cele două acțiuni se realizează prin metoda
AddEditUserAccount .
[AdministrationAdminAuthorize (Roles = new[] { UserRole .Administrator
})]
[HttpPost ]
public ActionResult AddEditUserAccount( AddEditUserAccountModel
model)
{
try
{
if (ModelState.IsValid)
{
using (var manager = new AdministratorManager ())
{
if (model.Id > 0)
{

63 var userAccount =
manager.GetUserAccount(model.Id);
model.UpdateUserAccount (userAccount);
manager.Save();
}
else
{
var userAccount = new UserAccount ();
model.UpdateUserAccount (userAccount);
manager.AddUserAccount(userAccount);
manager.Save();
return Json(true,
JsonRequestBehavior .DenyGet);
}
}
}
model.UserRoles = Utils.GetUserAccountsTypes( false);
model.Languages = Utils.GetLanguages();
return PartialView( "_AddEditUserAccount" , model);
}
catch (Exception ex)
{
HandleException(ex);
var addEditModel = new AddEditUserAccountModel ();
addEditModel.UserRoles =
Utils.GetUserAccountsTypes( false);
addEditModel.Languages = Utils.GetLanguages();
return PartialView( "_AddEditUserAccount" ,
addEditModel);
}
}

Pentru ștergerea unui tip de utilizator se va accesa butonul “Delete”.
Când ștergem un utilizator se șterg și datele legate de acesta.
Înainte ca utilizatoru l să fie șters , va apărea o fereastr ă de confirmare a ștergerii.

64
Fig 18

În cazul confirmării acț iunii toate d etaliile utilizatorului vor fi ș terse din baza de date.
[AdministrationAdminAuthorize (Roles = new[] { UserRole .Administrator
})]
public ActionResult DeleteUserAccount( int id)
{
if (id != null && id != UserContext.Id)
{
try
{
using (var manager = new AdministratorManager ())
{
manager.DeleteUserAccount(id);
manager.Save();
}
}
catch (Exception ex)
{
throw HandleException(ex);
}
}
ViewBag.ActiveTab = AdministratorTab .UserAcountTab;
Session[ACTIVETAB] = AdministratorTab .UserAcountTab;
return RedirectToAction( "UserAccounts" );
}

65 2.6.1.1 Pagina de Cladiri
Administratorul poate vizualiza, adăuga, edita și șterge clădiri . Aceste acțiuni le desfășoară doar
pentru clădirile la care este administrator.

Fig. 19
Administratorul are posibilitatea c ăutarii clădirilor după :
 nume
 numă r
 stradă

Fig. 20

66 Dacă dorim să adăugăm o clădire/bloc, administratorul autentificat, își va adă uga clădirea
folosind butonul Adaugă clădire .
După acționarea butonului Adaugă clădire va apărea o fereastră de editare conform imaginii de
mai jos.
Aici administratorul trebuie să completeze următoa rele câmpuri obligatorii:
 Nume le clădirii
 Număr ul clădirii
 Strada unde este situată clădirea.

Fig. 21

După salvare aceasta este înregistrată în baza de date.
Pentru editarea unuei cladiri se acceseaza butonul Edit . La accesarea butonului se va deschide o
fereastra cu datele precompletate ale cladirii :
 Nume le clădirii
 Număr ul clădirii
 Strada unde este situată clădirea

Fig. 22

67
Pentru ad ăugarea și ștergerea unei clădiri se foloseș te metoda AddEditBuilding .

[AdministrationAdminAuthorize (Roles = new[] { UserRole .Administrator
})]
[HttpPost ]
public ActionResult AddEditBuilding( AddEditBuildingModel
model)
{
try
{
if (ModelState.IsValid)
{
using (var manager = new AdministratorManager ())
{
if (model.Id > 0)
{
var building =
manager.GetBuilding(model.Id);
model.UpdateBuilding(buil ding,
UserContext.Id);
manager.Save();
return Json(true,
JsonRequestBehavior .DenyGet);
}
else
{
var building = new Building ();
model.UpdateBuilding(building,
UserContext.Id);
manager.AddBuilding(building);
manager.Save();
return Json(true,
JsonRequestBehavior .DenyGet);
}
}
}
model.Administrators =
Utils.GetUserAccountsSelectList();
return PartialView( "_AddEditBuilding" , model);
}
catch (Exception ex)
{
HandleException(ex);
var addEditModel = new AddEditBuildingModel ();

68 addEditModel.Administrators =
Utils.GetUserAccountsSelectList();
return PartialView( "_AddEditBuilding" , addEditModel);
}
}

2.6.1.2 Pagina Apartamente

Pagina Apartamente oferă administratorului datele esențiale , referitoare la apartament e. Acesta
poate vizualiza numărul apartamentului, scara unde este situat acesta și nu în ultimul râ nd
proprietarul apartamentului.

Fig.2 3

Această pagină îi oferă administratorului posibilitatea de a edita, de a șterg e, adăuga și căuta
apartamentul dorit .
Butonul Căutare îl ajută pe administrator să gă sească apartamentul dorit.
Admi nistratorul are posibilitatea căută rii apartamentelor după :
 numă r
 nume clă dire
 proprietar

69
Fig. 2 4

Când administratorul dorește să editeze un apartament îi va apărea fereastra următoare, unde va fi
obligat să completeze urmatoarele c âmpuri:
 număr
 scara
 etaj
 clădire
 proprietar

Fig. 2 5
Pentru edita rea unui apartament se accesează butonul Editează . La accesarea butonului va apă rea
o fereastră cu următoarele câ mpuri precompletate:
 numă r
 scara

70  etaj
 clădire
 proprietar

Fig. 2 6

Aceste două acțiuni , aduă gare si editare , se realizează folosind metoda AddEditApartment.
[AdministrationAdminAuthorize (Roles = new[] { UserRole .Administrator
})]
[HttpPost ]
public ActionResult AddEditApartment( AddEditApartmentModel
model)
{
try
{
if (ModelState.IsValid)
{
using (var manager = new AdministratorManager ())
{
if (model.Id > 0)
{
var apartment =
manager.GetApartment(model.Id);
model.UpdateApartment(apartment);
manager.Save();
return Json(true,
JsonRequestBehavior .DenyGet) ;
}
else
{
var apartment = new Apartment ();
model.UpdateApartment(apartment);
manager.AddApartment(a partment);

71 manager.Save();
return Json(true,
JsonRequestBehavior .DenyGet);
}
}
}
model.Buildings =
Utils.GetBuildingsSelectL ist(UserContext.Id);
model.Owners = Utils.GetUserAccountsSelectList( false);
return PartialView( "_AddEditApartment" , model);
}
catch (Exception ex)
{
HandleException(ex);
var addEditModel = new
AddEditApartmentModel (UserContext.Id);
return PartialView( "_AddEditApartment" , addEditModel);
}
}
Dacă s e dorește ștergerea unui apartament, administratorul o poate face foarte simplu folosind
butonul „ Șterge” .

Fig. 27
Înainte ca apartamentul să fie șters, va apărea o fereastr ă de confirmare a ștergerii.

În cazul confirmării ș tergerea se va face folosind metoda DeleteApartment.

[AdministrationAdminAuthorize (Roles = new[] { UserRole .Administrator
})]
public ActionResult DeleteApartment( int id)

72 {
try
{
using (var manager = new AdministratorManager ())
{
manager.DeleteApartment(id);
manager.Save();
}
}
catch (Exception ex)
{
throw HandleException(ex);
}
ViewBag.ActiveTab = AdministratorTab .ApartmentsTab;
Session[ACTIVETAB] = AdministratorTab .ApartmentsTab;
return RedirectToAction( "Apartments" );
}

2.6.1.3 Pagina Camere/Locatari
În această pagină administratorul poate vedea, adăuga, edita ș i sterge locatarii și numărul de
camere adăugate pe apartament.

Fig.28

Vizualizarea camerelor se fac e accesâ nd butonul Camere .

73
Fig.2 9

Vizuali zarea locatarilor se face accesâ nd butonul Locatari.

Fig.30

Când vrem să edităm o cameră dăm click pe „Editează” și ne va apărea o fereastră precompletata
cu urm ătoarele date :
 tipul de cameră
 suprafața acesteia.

Fig. 31
Când vrem să adăugăm o cameră dă m click pe Adauga camera și ne va apărea o fereastră în care
trebe să alegem tipul de cameră si suprafața acesteia. Tipurile de camere sunt:
 sufragerie,

74  dormitor,
 baie,
 bucătărie.

Fig. 32

Pentru cele două acț iuni se va executa metoda AddEditRoom .
[AdministrationAdminAuthorize (Roles = new[] { UserRole .Administrator
})]
[HttpPost ]
public ActionResult AddEditRoom( AddEditRoomModel model)
{
try
{
if (ModelState.IsValid)
{
using (var manager = new AdministratorManager ())
{
var apartment =
manager.GetApartment(model.ApartmentId);
if (model.RoomId > 0)
{
var room = manager.GetRoom(model.RoomId);
model.UpdateRoom(room);
manager.Save();
return Json(true,
JsonRequestBehavior .DenyGet);
}
else
{
var room = new Room();
model.UpdateRoom(room);
manager.AddRoom(room);
manager.Save();
return Json(true,
JsonRequestBehavior .DenyGet);
}

75 }
}
model.RoomTypes = Utils.GetRoomTypesSelectList();
return PartialView( "_AddEditRoom" , model);
}
catch (Exception ex)
{
HandleException(ex);
var addEditModel = new AddEditRoomModel {RoomTypes =
Utils.GetRoomTypesSelectList()};
return PartialView( "_AddEditRoom" , addEditModel);
}
}

Camerele se pot șterge printr -o simplă apăsare a butonului ”Șterge” . Din punct de vedere al
serverului ș tergerea se face cu metoda DeleteRoom .
[AdministrationAdminAuthorize (Roles = new[] { UserRole .Administrator
})]
public ActionResult DeleteRoom( int id)
{
try
{
using (var manager = new AdministratorManager ())
{
var apartmentId = manager.GetRoom(id).Apartment ID;
manager.DeleteRoom(id);
manager.Save();
return RedirectToAction( "ManageRooms" , new { id =
apartmentId });
}
}
catch (Exception ex)
{
throw HandleException(ex);
}
}

Pentru adăugarea locatarilor se accesează butonul Locatari iar mai apoi butonul Adaugă
Locatari.

76 La accesarea butonului Adauga Locatari va apă rea o fereastr ă în care trebe completate
urmatoarele date:
 nume
 prenume
 cnp

Fig. 33
La editarea unui locatar se va accesa butonul Editeaz ă. La accesarea butonului se va afi șa o
fereastr ă cu urmatoarele date precompletate:
 nume
 prenume
 cnp

Fig. 34

Pentru salvarea celor două acțiuni am folosit metoda AddEditRoomer .
[AdministrationAdminAuthorize (Roles = new[] { UserRole .Administrator
})]
[HttpPost ]
public ActionResult AddEditRoomer( AddEditRoomerModel model)

77 {
try
{
if (ModelState.IsValid)
{
using (var manager = new AdministratorManager ())
{
var apartment =
manager.GetApartment(model.ApartmentId);
if (model.RoomerId > 0)
{
var roomer =
manager.GetRoomer(model.RoomerId);
model.UpdateRoomer(roomer);
manager.Save();
return Json(true,
JsonRequestBehavior .DenyGet);
}
else
{
var roomer = new Roomer();
model.UpdateRoomer(roomer);
manager.Ad dRoomer(roomer);
manager.Save();
return Json(true,
JsonRequestBehavior .DenyGet);
}
}
}
return PartialView( "_AddEditRoomer" , model);
}
catch (Exception ex)
{
HandleException(ex);
var addEditModel = new AddEditRoomerModel ();
return PartialView( "_AddEditRoomer" , addEditModel);
}
}

Pentru ș tergerea unui locatar se va accesa butonul Sterge . La salvarea acț iunii se folose ște
metoda DeleteRoomer .
[AdministrationAdminAuthorize (Roles = new[] { UserRole .Administrator
})]

78 public ActionResult DeleteRoomer( int id)
{
try
{
using (var manager = new AdministratorManager ())
{
var apartmentId =
manager.GetRoomer(id).ApartmentID;
manager.DeleteRoomer(id);
manager.Save();
return RedirectToAction( "ManageRoomers" , new { id
= apartmentId });
}
}
catch (Exception ex)
{
throw HandleException(ex);
}
}
Adminis tratorul are facilitatea de a că uta camere pe baza urmă toarelor informa ții:
 numă r
 nume caldire
 propritar

Fig. 35

79 2.6.1.4 Pagina Consum

Această fereastră este folosită pentru adăugarea consumului pe apartament .

Fig. 36

Fiecare linie din grid reprezintă câte un apartament.
Pentru vizualizarea consumului pe a partament se va accesa butonul Consum . La accesarea
butonului Consum va apă rea o fereastră ce va con ține o list ă a consumurilor lunare pe anul în
curs.
Fig. 37
Proprietarii pot să-și adauge în fiecare lună, din anul în curs , consumurile per apartament cu
ajutorul butonului Adauga consum .

80 La acțiunea butonului „Adaugă consum” se va deschide o fereastră unde se vor introduce
urmă toarele date pe fiecare cameră:
 index apă caldă
 index ap ă rece
 index c ăldură

Fig. 38
La editarea unui consum se va afiș a urm ătoarea fereastră cu datele precompl etate. Acest lucru se
realizează accesâ nd butonul Editeaza .

81
Fig. 39
Pentru salvarea celor două acț iuni am folosit metoda EditConsumptionPerMonth.
[AdministrationAdminAuthorize (Roles = new[] { UserRole .Administrator
})]
[HttpPost ]
public ActionResult
EditConsumptionPerMonth( AddEditConsumptionPerMonthModel model)
{
try
{
if (ModelState.IsValid)
{
using (var manager = new AdministratorManager ())
{
var apartment =
manager.GetApartment(model.ApartmentId);
var consumptions =
manager.GetConsumptionsList(model.ApartmentId, model.MonthNumber,
model.Year);
foreach (var roomConsumption in
model.RoomsConsumptions)
{
if (roomConsumption.ConsumptionId > 0)
{

82 var consumption =
consumptions.FirstOrDefault(c => c.ID ==
roomConsumption.ConsumptionId);

roomConsumption.UpdateConsumption(consumption);
}
else
{
var consumption = new Consumption ();

roomConsumption.UpdateConsumption(consumption);
manager.AddConsumption(consumption);
}
}
manager.Save();
return Json(true,
JsonRequestBehavior .DenyGet);
}
}
return PartialView( "_AddEditConsumptionPerMonth" ,
model);
}
catch (Exception ex)
{
HandleException(ex);
var addEditModel = new
AddEditConsumptionPerMonthModel ();
return PartialView( "_AddEditConsumptionPerMonth" ,
addEditModel);
}
}
Administratorul are posibilitatea că utării consumului dup ă :
 numă r apartament
 număr clă dire
 proprietar

Fig. 40

83 2.6.1.5 Pagina Preț pe unitate

În această fereastră administratorul înreg istrează prețul pe unitate pentru o lună calendaristică
pentru fiecare utilitate în parte, la apă rece, apă caldă, căldură pentru fiecare apartament .

Fig. 41
Pentru adă ugare se va accesa butonul Adauga pret pe unitate . La accesarea butonului se va afișa
o fereastră î n care vor trebui completate următoarele câ mpuri:
 an
 lună
 apa caldă
 apa rece
 căldura

Fig. 42

84 Pentru editare se va accesa butonul Editeaza . La accesarea butonului se va afi șa o fereastră cu
urmă toarele date precompletate:
 anul
 luna
 apa caldă
 apa rece
 căldura

Fig. 43
Pentru salvarea celor dou ă acțiuni am folosit metoda EditPretpPerUnit.
[AdministrationAdminAuthorize (Roles = new[] { UserRole .Administrator
})]
[HttpPost ]
public ActionResult EditPricePerUnit( AddEditPricePerUnitModel
model)
{
try
{
if (ModelState.IsValid)
{
using (var manager = new AdministratorManager ())
{
if (model.Id > 0)
{
var pricePerUnit =
manager.GetPricePerUnit(model.Id);
model.UpdatePricePerUnit(pricePerUnit);
}
else
{
var pricePerUnit = new PricePerUnit ();

85 model.UpdatePricePerUnit(pricePerUnit);
manager.AddPricePerUnit(pricePerUnit);
}
manager.Save();
return Json(true,
JsonRequestBehavior .DenyGet);
}
}
model.Month = Utils.GetMonthText(model.HiddenMonth);
model.Year = model.HiddenYear;
ViewBag.MonthsSelectList = Utils.GetMonthSelectList();
return PartialView( "_AddEditPricePerUnit" , model);
}
catch (Exception ex)
{
HandleException(ex);
var addEditModel = new AddEditPricePerUnitModel ();
ViewBag.MonthsSelectList = Utils.GetMonthSelectList();
return PartialView( "_AddEditPricePerUnit" ,
addEditModel);
}
}
Admi nistratorul are posibilitatea căută rii preț ului dup ă urmatoarele date:
 anul
 luna

Fig. 44

86 2.6.1.6 Pagina Facturi
În această pagină este afișat prețul total al întreținerii pe fiecare lună în parte .

Fig. 45
Administratorul poate căuta și vizualiza proprietarii care și -au achitat facturile și care nu după
urmă toarele criterii:
 numă r apartament
 nume clă dire
 proprietar

Fig. 46
Pentru vizualizarea factur ilor per apartament se accesează butonul Facturi.

Fig. 47

87 Proprietarul poate doar să vizualize facturile.
Când dorim să facem plata unei facturi folosim butonul ”Plata” , bifăm ”Achitat” și după ce
salvăm se inserează o înregistrare în tabelul ”tbl_payment” .

Fig. 48
Dacă debifăm ”Achitat” înregistrarea se va șterge.
Achitarea sau neachitarea facturii se face cu ajutorul metodei AddRemovePaymantPerMonth.
[AdministrationAdminAuthorize (Roles = new[] { UserRole .Administrator
})]
[HttpPost ]
public ActionResult
AddRemovePaymentPerMonth( AddRemovePaymentPerMonthModel model)
{
try
{
if (ModelState.IsValid)
{
using (var manager = new AdministratorManager ())
{
var bill = manager.GetBill(model.ApartmentId,
model.MonthNumber, model.Year);

manager.RegisterPayment(model.ApartmentId,bill, model.Payed);
manager.Save();
return Json(true,
JsonRequestBehavior .DenyGet);
}
}
model.HeatPrice = model.HeatPriceHidden;
model.ColdWaterPrice = model.ColdWaterPriceHidden;
model.HotWaterPrice = model.HotWaterPriceHidden;

88 return PartialView( "_AddRemovePaymentPerMonth" ,
model);
}
catch (Exception ex)
{
HandleException(ex);
var addEditModel = new
AddRemovePaymentPerMonthModel ();
return PartialView( "_AddRemovePaymentPerMonth" ,
addEditModel);
}
}

2.6.2 Interfata Propri etarului

Acesul pe interfa ța proprietarului se face cu ajutorul unei adrese de email si o parolă .
Spre deosebire de administrator proprietarul poate face urmatoarele ac țiuni:
 vizualizare , editare si ad ăugare consum
 vizualizare facturi
Managementul consumului se face acces ănd meniul Consum.

Fig. 49
Editarea s e face accesâ nd buto nul Editeaza . La accesarea butonului va ap ărea o fereastr ă
asemănă toare cu cea a Administratorului cu urmă toare le date precompletate per cameră :
 index căldură
 index apă caldă
 index apă rece

89
Fig. 50
Adăugarea se face accesâ nd butonul Adauga Consum . La accesarea butonului va apărea o
fereastră în care va trebui completate urmă toarele c âmpuri per cameră :
 index caldură
 index apă caldă
 index apă rece

Fig. 51

Editarea si Adă ugarea se face cu ajutorul metodei EditConsumptionPerMonth.
[HttpPost ]//post la salavarea datelor
public ActionResult
EditConsumptionPerMonth( AddEditConsumptionPerMonthModel model)
{
try

90 {
if (ModelState.IsValid)
{
using (var manager = new AdministratorManager ())
{
var apartment =
manager.GetApartment(model.ApartmentId);
var consumptions =
manager.GetConsumptionsList(model.ApartmentId, model.MonthNumber,
model.Year);
foreach (var roomConsumption in
model.RoomsConsumptions)
{
if (roomConsumption.Con sumptionId > 0)
{
var consumption =
consumptions.FirstOrDefault(c => c.ID ==
roomConsumption.ConsumptionId);

roomConsumption.UpdateConsumption(consumption);
}
else
{
var consumption = new Consumption ();

roomConsumption.UpdateConsumption(consumption);
manager.AddConsumption(consumption);
}
}
manager.Save();
return Json(true,
JsonRequestBehavior .DenyGet);
}
}
return PartialView( "_AddEditConsumptionPerMonth" ,
model);
}
catch (Exception ex)
{
HandleException(ex);
var addEditModel = new
AddEditConsumptionPerMonthModel ();
return PartialView( "_AddEditConsumptionPerMonth" ,
addEditModel);
}
}

91 Accesul la lis ta de facturi se face accesă nd meniul Facturi.

Fig. 52
Proprietarul poate vizualiza fiec are stare a unei facturi pe lună, accesâ nd butonul Plata .

Fig. 53

2.6.3 Funcționalități comune ale Aplica ție
Orice utilizator autentificat își poate seta următoarele proprietăț i:
 limba de afiș are
 poza
 parola

92
Fig. 54
Setarea imaginii se face accesâ nd butonul Choose file . Salvarea acestei ac țiuni se face cu
ajutorul metodei SaveAvatar .
public ActionResult SaveAvatar( IEnumerable <HttpPostedFileBase >
userBadgeSettingsFlyoutPhotoField)
{
if (userBadgeSettingsFlyoutPhotoField != null)
{
var file =
userBadgeSettingsFlyoutPhotoField.FirstOrDefault();
var fileName = Path.GetFileName(file.FileName);
var bufferImage = new byte[file.ContentLength];
file.InputStream.Read(bufferImage, 0,
file.ContentLe ngth);
FileContent fileContentLarge =
ImageHelper .GetContent( ref fileName, bufferImage, file.ContentType,
120, 120, true);
UserContext.Picture = fileContentLarge.Content;
using (var manager = new Authenticati onManager ())
{
var userAccount =
manager.GetUserAccount(UserContext.Id);
if (userAccount != null)
{
userAccount.Picture = UserContext.Picture;
manager.Save();
}
}
}
return Content( "");

93 }
Stergerea imaginii se face accesand butonul Delete my current picture.
Salvarea actiunii se face cu ajutorul metodei DeleteAvatar.
[HttpPost ]
public JsonResult DeleteAvatar()
{
try
{
using (var manager = new AuthenticationManager ())
{
var userAccount =
manager.GetUserAccount(UserContext.Id);
if (userAccount != null)
{
userAccount.Picture = null;
manager.Save();
}
}
UserContext.Picture = null;
}
catch (Exception ex)
{
throw HandleException(ex);
}
return Json(true, JsonRequestBehavior .DenyGet);
}
Schimbarea limbii se face accesând butonul Limba . Salvarea acestei acțiuni se face cu metoda
ChangeLanguage.

[PublicActionFilter (AllowWhenAuthenticated = true)]
public ActionResult ChangeLanguage( int languageId)
{
Session[ "ActiveTab" ] = null;
Session[CURRENT_LANGUAGE_SESSION_KEY] = Languages.First(l
=> l.Id == languageId);
SetCulture();
var redirectUrl = Url.Action( "Index", "Home");
if (Request.UrlReferrer != null)
{
redirectUrl = Request.UrlReferrer.AbsoluteUri;
}
return Redirect(redirectUrl); }

94 2.7 Cerințe hardware și software

Sistem de operare Windows Server 2008,
Windows Server 2012,
Windows Server 2014
Memorie RAM Minim 8 GB,
Recomandat 16 GB
Browsere compatibile Microsoft Internet Explorer versiunea 8
Mozilla Firefox versiunea 13
Google Chrome versiunea 20
Safari versiunea 5.
Hard Disk Minim 20 GB

95 3 Bibliografie

1. Galloway, J., Haack, P., Wilson, B., & Scott Allen, K. (2012). Professional ASP.NET MVC4.
Indiana: Ed. Wiley .
2. Jhonson, G., (2013), Programming in HTML5 with JavaScript and CSS3. Redmond Washington:
Ed. Microsoft .
3. Penberthy, W., (2013), Developing ASP.NET MVC 4 Web Applications . California: Ed. Microsoft
4. Smith, A., (2007), ASP 3 Programming Bible, India: Ed. Wiley .
5. Wagner, R., &Wyke, A. (2001). Java Script. Bucur ești: Ed. Teora.
6. http://en.wikipedia.org/wiki/C_Sharp_ (programming_language)
7. http://msdn.microsoft.com/en -us/library/67ef8sbd.aspx
8. http://www.w3schools.com/js/DEFAULT.asp
9. http://www.entityframeworktutorial.net

Similar Posts