Șeflucr.dr.ing.Marius-AdrianMarian Septembrie2019 CRAIOVA ii UNIVERSITATEADINCRAIOVA FACULTATEADEAUTOMATICĂ,CALCULATOAREȘI ELECTRONICĂ… [615414]

UNIVERSITATEADINCRAIOVA
FACULTATEADEAUTOMATICĂ,CALCULATOAREȘI
ELECTRONICĂ
DEPARTAMENTULDECALCULATOAREȘITEHNOLOGIA
INFORMAȚIEI
PROIECTDEDIPLOMĂ
Florin-AlexandruLogofătu
COORDONATORȘTIINȚIFIC
Șeflucr.dr.ing.Marius-AdrianMarian
Septembrie2019
CRAIOVA

ii
UNIVERSITATEADINCRAIOVA
FACULTATEADEAUTOMATICĂ,CALCULATOAREȘI
ELECTRONICĂ
DEPARTAMENTULDECALCULATOAREȘITEHNOLOGIA
INFORMAȚIEI
Sisteminformaticpentrugestiuneaproiectelordelicențășidisertație
Florin-AlexandruLogofătu
COORDONATORȘTIINȚIFIC
Șeflucr.dr.ing.Marius-AdrianMarian
Septembrie2019
CRAIOVA

iii„Învățăturaesteocomoarăcareîșiurmeazăstăpânulpretutindeni.”
Proverbpopular

ivDECLARAȚIEDEORIGINALITATE
SubsemnatulFLORIN-ALEXANDRULOGOFĂTU,student: [anonimizat],CalculatoareșiElectronicăa
UniversitățiidinCraiova,certificprinprezentacăamluatlacunoștințădeceleprezentatemaijosși
căîmiasum,înacestcontext,originalitateaproiectuluimeudelicență:
cutitlulSISTEMINFORMATICPENTUGESTIUNEAPROIECTELORDELICENȚĂȘI
DISERTAȚIE
coordonatădeȘEF.LUCR.DR.ING.MARIUS-ADRIANMARIAN,
prezentatăînsesiuneaSEPTEMBRIE2019.
Laelaborareaproiectuluidelicență,seconsiderăplagiatunadintreurmătoareleacțiuni:
reproducereaexactăacuvintelorunuialtautor,dintr-oaltălucrare,înlimbaromânăsauprin
traduceredintr-oaltălimbă,dacăseomitghilimeleșireferințaprecisă,
redareacualtecuvinte,reformulareaprincuvintepropriisaurezumareaideilordinalte
lucrări,dacănuseindicăsursabibliografică,
prezentareaunordateexperimentaleobținutesauaunoraplicațiirealizatedealțiautorifără
menționareacorectăaacestorsurse,
însușireatotalăsauparțialăauneilucrăriîncarereguliledemaisussuntrespectate,darcare
arealtautor.
Pentruevitareaacestorsituațiineplăcuteserecomandă:
plasareaîntreghilimeleacitatelordirecteșiindicareareferințeiîntr-olistăcorespunzătoarela
sfărșitullucrării,
indicareaîntextareformulăriiuneiidei,opiniisauteoriișicorespunzătorînlistadereferințe
asurseioriginaledelacares-afăcutpreluarea,
precizareasurseidelacares-aupreluatdateexperimentale,descrieritehnice,figuri,imagini,
statistici,tabeleetcaetera,
precizareareferințelorpoatefiomisădacăsefolosescinformațiisauteoriiarhicunoscute,a
cărorpaternitateesteunanimcunoscutășiacceptată.
Data, Semnăturacandidat: [anonimizat],

v
UNIVERSITATEADINCRAIOVA
FacultateadeAutomatică,CalculatoareșiElectronică
DepartamentuldeCalculatoareșiTehnologiaInformațieiAprobatladatade
…………………
Șefdedepartament,
Prof.dr.ing.
MariusBREZOVAN
PROIECTULDEDIPLOMĂ
Numeleșiprenumelestudent: [anonimizat]/-ei:Florin-AlexandruLogofătu
Enunțultemei:Sisteminformaticpentrugestiuneaproiectelordelicențăși
disertație
Dateledepornire:Nevoiadeaușuramoduldecomunicareîntrecoordonatorii
delicențășistudenți.
Conținutulproiectului:Structuraproiectului:Introducere,cuprinsșiconcluzii.
CapitolulI:introducere,scopulșimotivațiapersonală;
CapitolulII:introducecititorulînlumeadezvoltăriisite-urilor
web
CapitoulIII:suntprezentatenoțiunimaiavansatedeinterfață
web
CapitolulIV:implementareaproiectuluișidetaliidespre
utilizareaaplicației
Materialgraficobligatoriu:Capturideecran,diagrame,tabele
Consultații:Periodice
Conducătorulștiințific
(titlul,numeșiprenume,semnătura):ȘefLucr.dr.ing.Marius-AdrianMarian
Dataeliberăriitemei:
Termenulestimatdepredarea
proiectului:
Datapredăriiproiectuluidecătre
student: [anonimizat]:

vi
UNIVERSITATEADINCRAIOVA
FacultateadeAutomatică,CalculatoareșiElectronică
DepartamentuldeCalculatoareșiTehnologiaInformației
REFERATULCONDUCĂTORULUIȘTIINȚIFIC
Numeleșiprenumelecandidat: [anonimizat]/-ei:Florin-AlexandruLogofătu
Specializarea: Calculatoarecupredareînlimbaromână
Titlulproiectului:Sisteminformaticpentrugestiuneaproiectelordelicențăși
disertație
Locațiaîncares-arealizatpracticade
documentare(sebifeazăunasaumai
multedinopțiuniledindreapta):Înfacultate□
Înproducție□
Încercetare□
Altălocație:
Înurmaanalizeilucrăriicandidatuluiaufostconstatateurmătoarele:
NiveluldocumentăriiInsuficient
□Satisfăcător
□Bine
□Foartebine

TipulproiectuluiCercetare
□Proiectare
□Realizare
practică□Altul
AparatulmatematicutilizatSimplu
□Mediu
□Complex
□Absent

UtilitateContractde
cercetare□Cercetare
internă□Utilare
□Altul
RedactarealucrăriiInsuficient
□Satisfăcător
□Bine
□Foartebine

Parteagrafică,deseneInsuficientă
□Satisfăcătoa-
re□Bună
□Foartebună

Realiza-
rea
practicăContribuțiaautoruluiInsuficientă
□Satisfăcătoa-
re□Mare
□Foartemare

Complexitatea
temeiSimplă
□Medie
□Mare
□Complexă

AnalizacerințelorInsuficient
□Satisfăcător
□Bine
□Foartebine

ArhitecturaSimplă
□Medie
□Mare
□Complexă

Întocmirea
specificațiilor
funcționaleInsuficientă
□Satisfăcătoa-
re□Bună
□Foartebună

viiImplementareaInsuficientă
□Satisfăcătoa-
re□Bună
□Foartebună

TestareaInsuficientă
□Satisfăcătoa-
re□Bună
□Foartebună

FuncționareaDa
□Parțială
□Nu

RezultateexperimentaleExperimentpropriu
□Preluaredinbibliografie

BibliografieCărțiRevisteArticoleReferințe
web
Comentarii
și
observații
Înconcluzie,sepropune:
ADMITEREAPROIECTULUI
□RESPINGEREAPROIECTULUI

Data,Semnăturaconducătoruluiștiințific,

viiiREZUMATULPROIECTULUI
Înultimuldeceniu,omenireaaavansatexponențialîndomeniultehnologic.Credcutăriecă
prezențacalculatoruluișiainternetuluiinfluențeazăcâtmaimultviațafiecăruiadintrenoi.Fiecă
vremsăcăutamunrăspunslaoîntrebarelacarenuștimrăspunsul,fiecăvremsavedemcefaceun
vechiprieten,apelămcutoțiilasite-urilewebdestinateactivitățilorprecedente.
Amalescaproiectulmeusăfieunsitewebdatorităaccesibilitățiioferite.Estenevoiedoardeun
dispozitivcaresăfieconectatlainternetsiestedeajunssăaccesezisite-ul.Ușurințacucareun
utilizatorpoatenavigapesiteesteprimordialacânddețiiunastfeldeservicu.Vreicautilizatorulsă
revinașisăfieîncăntatdeserviciuloferit.
Site-ullucreazăcubazededateîncaresuntstocateactivitățilegatedelicentaunuistudent:
adăugareatemelorpentrulicență,adăugareanotelor,afișareanotelor,vizualizareaprofesorilor,
examinarea.
Site-ullucreazăcubazededateîncaresuntstocatediferiteinformațiidesprelucrareadelicență:
profesorulcoordonator,temalicenței,datacandafostinregistrată,numeleșiprenumelestudentuluisi
specializareaacestuia.
Unsitewebesteidealînzilelenoastre.Unsitedeevidențastudențilorajutaenormoinstutiție
centralizată,ușurândenormcomunicareadintreFacultateșistudentcâtșiceadintrepărințiși
Facultate.
Parteadeback-endestesusținutădelimbajuldeprogramarePHP.Acestelimbajdeprogramare
estefolositinițialpentruaproducepaginiwebdinamice,darestefolositpescarălargăîndezvoltarea
paginilorșiaplicațiilorweb.CodulPHPpoatefiexecutatcuointerfațădeliniedecomandă,
încorporatîncodulHTMLsauutilizatîncombinațiecudiferitesistemedeșabloaneweb,sistemede
gestionareaconținutuluiwebșicadreweb.
Parteadefront-endesterealizatăcuASP.NET,otehnologiecareaparțineMicrosoft.Scopul
folosiriirespectivuluiframeworkesteștiutdemajoritateacelorcelucreazăîndomeniu,șianume
creareaunorsite-uriwebdinamicecepotoferiutilizatoruluiceeacecaută.Poatechiarșiceeacenu
știecăvreadarcaresă-lținăinteresat.
Termeniicheie:siteweb,PHP,back-end,front-end

ixMULȚUMIRI
Vreausămulțumescînprimulfamilieimelepentrucăafostmereulăngămine.
MulțumescșidomnuluiȘef.Lucr.dr.ing.Marius-AdrianMarian,pentrutotsprijinulacordat,
deasemenea,pentruoportunitateadeatransformaproiectulîntr-olucraredelicențăpentruîncredere,
îndrumare,consiliereșidisponibilitateaoferităînaceastăperioadă.Nuînultimulrând,așdorisăle
mulțumesctuturoracademicienilorcareaucontribuitlapregătireameacaviitoringinerînaceștipatru
ani.
Mulțumesccomisieideastăzipentrurăbdareșitimpulpetrecutîmpreună!
Vămulțumesc!

xPROLOG

xiCUPRINSUL
1 INTRODUCERE………………………………………………………………………………………………………………………….1
1.1 SCOPUL…………………………………………………………………………………………………………………………………1
1.2 MOTIVAȚIA……………………………………………………………………………………………………………………………1
2 DEZVOLTAREASITE-URILORWEB……………………………………………………………………………………….2
2.1 PLATFORMA.NET………………………………………………………………………………………………………………….2
2.2 ARGUMENTEPENTRU.NET……………………………………………………………………………………………………..2
2.3 LIMBAJULC#…………………………………………………………………………………………………………………………3
2.4 ASP.NET……………………………………………………………………………………………………………………………..4
2.4.1StructurauneipaginiASP.NET……………………………………………………………………………………………5
2.4.2Cicluldeviațăaluneipaginiwebcuprindeurmătoriipași:…………………………………………………….8
2.4.3ControaleASP.NET……………………………………………………………………………………………………………9
2.4.4RealizareainterfețeicuASP.NETMasterPage………………………………………………………………………9
3 TEHNOLOGIIWEBPENTRUCREAREAINTERFEȚEI…………………………………………………………14
3.1 JAVASCRIPT…………………………………………………………………………………………………………………………14
3.2 JQUERY……………………………………………………………………………………………………………………………….15
3.3 HTML…………………………………………………………………………………………………………………………………16
3.4 CSS…………………………………………………………………………………………………………………………………….17
3.4.1Laniveldeelement…………………………………………………………………………………………………………..17
3.4.2Încapsulate………………………………………………………………………………………………………………………18
3.4.3Legate……………………………………………………………………………………………………………………………..18
3.4.4Atributulclass………………………………………………………………………………………………………………….19
3.4.5Atributulid………………………………………………………………………………………………………………………19
3.5 BOOTSTRAP………………………………………………………………………………………………………………………….20
3.6 LINQ……………………………………………………………………………………………………………………………………20
3.6.1LinqtoSql……………………………………………………………………………………………………………………….22
3.6.2ModelareabazeidedatefolosindLinqtoSqldetipDataContext…………………………………………..23
3.6.3InterogaricaresepotrealizacuLinqtoSql………………………………………………………………………..25
4 IMPLEMENTAREAȘIUTILIZAREAAPLICȚIEI……………………………………………………………………28
4.1 DIAGRAMAENTITATE-ASOCIERE…………………………………………………………………………………………….39
4.2 PREZENTAREASITE-ULUI……………………………………………………………………………………………………….40
4.3 INTERFAȚACUUTILIZATORUL………………………………………………………………………………………………..41
4.3.1Header-ulsite-uluișibutoaneleprezente…………………………………………………………………………….41

xii4.3.2Side-bar-ulsite-uluișibutoanelesale…………………………………………………………………………………46
CONCLUZII………………………………………………………………………..NUS-AGĂSITACEASTĂDESTINAȚIE!
5 BIBLIOGRAFIE………………………………………………………………………………………………………………………..51
6 REFERINȚEWEB…………………………………………………………………………………………………………………….52
A.CODULSURSĂ…………………………………………………………………………………………………………………………53
B.SITE-ULWEBALPROIECTULUI……………………………..NUS-AGĂSITACEASTĂDESTINAȚIE!
C.CD/DVD…………………………………………………………………………………………………………………………………..95
INDEX……………………………………………………………………………………………………………………………………………….96

xiiiLISTAFIGURILOR
FIGURA1CREAREPAGINĂMASTERPAGE…………………………………………………………………………………………………………10
FIGURA2CONTENTPLACEHOLDER…………………………………………………………………………………………………………………10
FIGURA3WEBFORMÎNPAGINAMASTERPAGE…………………………………………………………………………………………………12
FIGURA4ADĂUGAREPAGINADEMASTER………………………………………………………………………………………………………..12
FIGURA5CONTROLDETIPCONTENT………………………………………………………………………………………………………………13
FIGURA6ARHITECTURALINQ………………………………………………………………………………………………………………………21
FIGURA7OBȚINEREAUNUICONTEXTDEDATE…………………………………………………………………………………………………..24
FIGURA8BAZĂDEDATESQL……………………………………………………………………………………………………………………….24
FIGURA9CLASEDEFINITEINBAZADEDATE………………………………………………………………………………………………………25
FIGURA10CODSTUDENȚIÎNREGISTRAȚI………………………………………………………………………………………………………….29
FIGURA11ÎNREGISTRARESTUDENȚIPESITE……………………………………………………………………………………………………..30
FIGURA12CODÎNREGISTRAREPROFESORI……………………………………………………………………………………………………….31
FIGURA13ÎNREGISTRAREPROFESORIPESITE……………………………………………………………………………………………………32
FIGURA14CODÎNREGISTRAREDEPARTAMENTE…………………………………………………………………………………………………33
FIGURA15ÎNREGISTRAREWEBSITEDEPARTAMENTE……………………………………………………………………………………………34
FIGURA16CODINTRODUCERECURSURI………………………………………………………………………………………………………….34
FIGURA17WEBSITEÎNREGISTRARECURSURIFAȚĂDECELEDEJAEXISTENTE………………………………………………………………..35
FIGURA18ASIGNAREBIROURIPENTRUPROFESORI(INSTRUCTORS)………………………………………………………………………….36
FIGURA19ARATĂMODULDEINTRODUCEREALBIROULUIPESITE……………………………………………………………………………37
FIGURA20ARATĂASIGNAREACURSURILORSTUDENȚILOR…………………………………………………………………………………….38
FIGURA21ASIGNAREACURSURILORDIRECTPESITE…………………………………………………………………………………………….39
FIGURA22DIAGRAMAENTITATE-ASOCIERE………………………………………………………………………………………………………39
FIGURA23HEADER-ULSITE-ULUI………………………………………………………………………………………………………………….41
FIGURA24PAGINASTUDENTSEXTENSIE………………………………………………………………………………………………………….42
FIGURA25BUTONULDETAILS………………………………………………………………………………………………………………………43
FIGURA26REPREZENTÂNDPAGINACOURSESÎMPREUNĂCUBUTONULCREATENEW…………………………………………………….43
FIGURA27CAREARATĂPAGINAINSTRUCTORS………………………………………………………………………………………………….44
FIGURA28COURSESTAUGHTBYSELECTEDINSTRUCTOR………………………………………………………………………………………44
FIGURA29CUPAGINADEPARTMENTS……………………………………………………………………………………………………………45
FIGURA30MENIULCREATENEW………………………………………………………………………………………………………………….45
FIGURA31ARATĂBUTONULEDITȘICAZULDEEROARECÂNDESTEINTRODUSUNNUMĂRNENATURAL………………………………..46
FIGURA32CUSIDE-BAR-ULSITE-ULUI…………………………………………………………………………………………………………….47
FIGURA33BUTOANELEHOMEȘICRAIOVAUNIVERSITY………………………………………………………………………………………..47
FIGURA34CARECONSTĂÎNPREVIEW-ULPAGINIIDESTART…………………………………………………………………………………..48
FIGURA35BUTONULEDUCATIONSTATUS……………………………………………………………………………………………………….49

xivFIGURA36LOADING…………………………………………………………………………………………………………………………………49
FIGURA37EDUCATIONSTATUSPASIV…………………………………………………………………………………………………………….50
FIGURA38EFECTBUTOANE…………………………………………………………………………………………………………………………50

xvLISTATABELELOR
TABEL1ÎNREGISTRARESTUDENȚI…………………………………………………………………………………………………………………28
TABEL2ÎNREGISTRAREPROFESORI………………………………………………………………………………………………………………..30
TABEL3ÎNREGISTRAREDEPARTAMENTE………………………………………………………………………………………………………….32
TABEL4ÎNREGISTRARENOTE………………………………………………………………………………………………………………………33
TABEL5INTRODUCERECURSURI…………………………………………………………………………………………………………………..35

1INTRODUCERE
1.1Scopul
Scopullucrăriimeleesteaceladeareduceefortulcomunicăriiîntrecoordonatorulpentru
licențășistudent.Site-ulurmăreștiaccesibilitateauserilorcareîlaccesează.Interfațaesteunasimplă
menităsămicșorezetimpulnecesargăsiriiinformațieicăutate.Documentulacestăestemenitsăofere
cititoriloroideedesprecumaratăprocesulcreăriiunuisitewebușordeînțelesșicareîșifacetreaba.
1.2Motivația
Fiecareinstituțiedeînvățământuniversitarătrebuiesăaibăoastfeldeplatformă,pentrua
puteafacilitalegaturiledintrestudențișiprofesori.Deaceeaplanulșimotivațiameasunt,săfac
posibilacestlucruîncâtmaimultefacultăți,pentruareduceconsiderabiltimpulpetrecutlafacultate.

22DEZVOLTAREASITE-URILORWEB
2.1Platforma.NET
.NETesteuncadru(Framework)dedezvoltaresoftwareunitarăcarenepermitesărealizăm
distribuireașirulareaatâtaaplicațiilorWEBcâtșiaaplicațiilor-desktopWindows.Tehnologia.NET
puneîmpreunămaimultetehnologii(ASP,XML,OOP,SOAP,WDSL,UDDI,WPF,LINQ)și
limbajedeprogramare(VB,C++,C#,F#)asigurândatâtportabilitateacoduluirulatîntrediferite
calculatoarecusistemWindows,câtșirefolosireacoduluiînprograme,indiferentdelimbajulde
programareutilizat.
.NETFrameworkesteocomponentălivratăîmpreunăcusistemuldeoperareWindows.
Pentruaputeadezvoltaaplicațiipeplatforma.NETestebinesaavem3componenteesențiale:
unsetdelimbaje(C#,VisualBasic.NET,J#,ManagedC++,Smalltalk,Perl,Fortran,
Cobol,Lisp,Pascaletc),
unsetdemediidedezvoltare(VisualStudio.NET,Visio),
bibliotecădeclasepentrucreareaserviciilorWeb,aplicațiilorWebșiaplicațiilor
desktopWindows.
Cânddezvoltămaplicații.NET,putemfolosi:
serverespecializate-unsetdeservereEnterprise.NET(dinfamiliaSQLServer2008,
Exchange2000etc.),carepunladispozițiefuncțiidestocareabazelordedate,email,
aplicațiiB2B(BussinesstoBussiness–comerțelectronicîntreparteneriiuneiafaceri).
serviciiWeb(înspecialcomerciale),acesteasuntutileînaplicațiicarenecesită
identificareautilizatorilor(deexemplu,.NETPassport-unmoddeautentificare
folosindunsingurnumeșioparolăpentrutoatesite-urilevizitate)
serviciiinclusepentrudispozitivenon-PC(PocketPCPhoneEdition,Smartphone,
TabletPC,SmartDisplay,XBox,set-topboxes,etc.)
2.2Argumentepentru.NET
.NEToferăaccesușorlabazededate,permitecreareadesenelorșiaaltorelementegraficeșioferă
instrumentepecarelevomputeafolosisiînalteprograme.

3SpațiuldenumeSystem.Windows.Formsconțineinstrumente(controale)cepermitimplementarea
elementelorimmmnterfețeigraficecuutilizatorul.Folosindacestecontroale,sepotproiectași
dezvoltarapidșiinteractivelementeleinterfețeigrafice.
Tot.NEToferăclasecareefectueazămajoritateasarciniloruzualecucareseconfruntăprogrameleși
careplictisescșifurătimpulprogramatorilor,reducândastfeltimpulnecesardezvoltăriiaplicațiilor.
MicrosoftVisualStudioesteunmediudedezvoltareintegrat(IDE)delaMicrosoft.Acestapoatefi
utilizatpentruaconstruiaplicațiidelaconsolă,interfațagrafică,aplicațiidetipWindowsForms,site-
uriweb,aplicațiiweb,serviciiwebcesuntsuportateplatformele:MicrosoftWindows,Windows
Mobile,WindowsCE,.NETFramework,.NETCompactFrameworkșiMicrosoftSilverlight.
2.3LimbajulC#
LimbajulC#esteunlimbajnoudeprogramare,acestaaapărutodatăcuplatforma.Net.
AcestlimbajfostconstruitdeoechipărestrânsădeingineridelaMicrosoft,echipădincareafăcut
parteAndersHejlsberg(autorullimbajuluiTurboPascalșimembrualechipeicareaproiectatBorland
Delphi).
Ideeadebazăconstăinprogramareaorientatăpeobiecte(POO).CasiînlimbajulC++,limbajulC#
esteunlimbajsimpluformatdinliteremarișiliteremici,cucirca80decuvintecheie,și12tipuride
datepredefinite.LimbajulC#permiteprogramareastructurată,modularășiorientatăpeobiect,
conformperceptelormodernealeprogramăriiprofesioniste.
OaplicațieC#estecompusădinunasaumaimulteclase,grupateînspațiidenume(namespaces).
„Principiiledebazăaleprogramăriiorientatăpeobiecte(INCAPSULARE,MOSTENIRE,
POLIMORFISM)suntelementefundamentalealeprogramăriiC#”[3].LimbajulC#moșteneste
sintaxașiprincipiiledeprogramaredinC++.OmarepartedinC#moșteneștesintaxașiprincipiilede
programaredinC++.
OperatoriiC#suntcuprinșiînurmătoarelecategorii:
Operatoriaritmetici
Operatorideincrementare/decrementare
Operatorirelaționali
Operatorilogici

4Operatorideatribuire
Operatorulcondițional
2.4ASP.NET
ASP.NETesteunsetdetehnologiicarenepermitcreareadeaplicațiiweb.Esteevoluțiadela
MicrosoftActiveServerPages(ASP),darbeneficiazădesuportulplatformeidedezvoltareMicrosoft
.NET.
UnadintrecelemaiimportantecalitățialeASP.NETestetimpulredusnecesardezvoltării
aplicațiilorweb.Atâttehnologiaînsine,câtșiuneltelededezvoltaredeaplicațiiwebdelaMicrosoft
(cumarfiVisualWebDeveloperExpress-VWD)–reducconsiderabiltimpuldedezvoltareal
aplicațiilorwebfațădealtetehnologii–prinsimplitateaunuilimbajdeprogramare”managed”de
genulC#sauVisualBasic.NET,princolecțiabogatădebibliotecideclaseșicontroale.NET”[5]care
oferăfoartemultăfuncționalitate”outofthebox”,prinorientareapeconstruireadeaplicațiiweba
mediuluidedezvoltareVWD.„ChiardacăASP.NETestegânditpentruadezvoltaaplicațiiwebfoarte
complexe–prinfaptulcăsebazeazăpe.NET,prinfaptulcăseinsistăpeunmodeldedezvoltare
OOP,respectivpeseparareainterfețeidelogicaaplicației–totuși,esteextremdesimplucafolosind
ASP.NETsădezvoltămaplicațiimici,degenulmagazineloronline,alaplicațiilorcaresuntpurși
simpluun”front-end”pentruobazădedate,saualsite-urilorpersonale.
ASP.NETcuprindetoatetehnologiilenecesarepentruadezvoltaoaplicațieweb,scriind
cantitateaminimădecod.Limbajeledeprogramarecarepotfiutilizatepentruacreaaplicații
ASP.NETsuntcelesuportatedeplatforma.NET–cumsuntVisualBasic.NETșiC#,iaroaltă
caracteristicaimportantaaacestorlimbaje(înafarafaptuluicăsunt”managed”)estecaaufostcreate
avândînvedereparadigmaprogramăriiorientatăpeobiecte.
Totuldin.NET,șievidentdinASP.NET,esteunobiect.
Evident,oricesite/aplicațiewebtrebuiesăfiegăzduităpeunserverpentruaputeafiutilizată.
Pentruopersoană/companiecaredoreștesăbeneficiezedeoaplicațieASP.NET,dupăceafost
dezvoltată,trebuieinstalatăundeva.Presupunândcăeaafostdezvoltatăpentru.NET,aplicațiaare
nevoiedeunserverwebIIS(internetInformationsServices).
ExistădouăvariantedeagăzduiaplicațiileASP.NET:
1.intern,peservereleproprii

52.extern,laofirmăcareoferăserviciidegăzduire(hosting).
ASP.NETsprijinăabordăridiferitepentruafacesite-uriwebsaupaginiweb.
ASP.NETPaginiWebutilizeazăunsingurmodeldepaginicareseamestecăcucodulHTMLcu
marcare.
ASP.NETSPA(Osingurăpaginăaplicație)
ASP.NETWebFormsutilizeazăcontroaleșiuneveniment-modelbazatpedezvoltare
componente
ASP.NETMVC(ModelViewController)-modelarhitecturalcareseparăaplicațiaintrei
componente:model,vederesicontroler.
Acestethenicisepotfolosișiîntr-osingurăaplicațieînfuncțiedenevoilefiecaruia.
2.4.1StructurauneipaginiASP.NET
OpaginăASP.NETcuprindedouăcomponente:interfațacarevafivizulaizatădecătreutilizator.
Sicodul.NETcarevafiexecutatpeserveratuncicandsevafaceointerogarepepagină.
ÎnASP.NETsepoatescriecodfolsindlimbajulc#sauVisualBasic.NET.
Script-urileASP.NETsuntfișieretextcuextensia.aspx,careconțincontroaleHTMLsauASP.
CodulC#sauVB.NETasociatpaginiisauobiectelordinpaginăpoatefiplasatdirectînfișierulcu
extensia.aspx,sauîntr-unfișierseparat<nume_pagină>.aspx.cs(pentruC#)sau
<nume_pagină>.aspx.v(pentruVB.NET).Pentruaevitaașa-numitul„spaghetticode”,undepartea
caredescrieinterfațaesteintercalatăcuinstrucțiunilecareasigurăfuncționalitatea,estedepreferat
folosireaunuifișierseparatpentruareținecodul.
Exempludepagina.aspx:
<%@PageLanguage="C#"AutoEventWireup="true"
CodeFile="first.aspx.cs"Inherits="first1"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"

6"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
<title>Primapagină</title>
</head>
<body>
<formid="form1"runat="server">
<div>
<pid="output"runat="server"/>
</div>
</form>
</body>
</html>

7Înacestexempluvafiafișatmesajul„Primapagină”.CodulC#estescrisîncadrulpagini.aspx
usingSystem;
usingSystem.Collections;
usingSystem.Configuration;
usingSystem.Data;
usingSystem.Linq;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.HtmlControls;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Xml.Linq;
publicpartialclassfirst:System.Web.UI.Page
{
protectedvoidPage_Load(objectsender,EventArgse)
{
output.InnerText="Primapagină";
}
}

8Oricepaginăweb.aspxconțineosecțiunededirective,caredescriemodulîncarepagina
esteprocesatădecătreserver.Aceastăsecțiuneestecuprinsăîntretag-urile<%@și%>și
precizeazălimbajulutilizatpentruscriereacoduluișinumelefișieruluiîncareestereținut
codul(atuncicândestecazul):
<%@PageLanguage="C#"CodeFile="first.aspx.cs"Inherits="_first"%>”
PaginileASP.NETruleazăpeserver-uldelawebMicrosoftIIS.Dupăprelucrareape
server,varezultaopaginăwebHtml,carevafitrimisăcătrebrowser.
2.4.2Cicluldeviațăaluneipaginiwebcuprindeurmătoriipași:
1.Utilizator-ulscrieadresauneipaginiweb.Ceeaceinseamnăocerereabrowser-uluiweb
cătreserver,seefectueazăprinintermediulmetodeiHTTPGET.Odatăajunsalaserver
paginaruleazăpentruprimadată,executandu-seșicodulPHP.
2.VarezultaopaginăHTMLcarevafitrimisăbrowser-ului.
3.Utilizator-ulvaputeaintroducedatesauvaputeaapăsaunbuton,deundepaginavafi
trimisădinnouservăr-ului.Încazulîncareutilizatorulvreasăaccesezeunlink,server-ulva
încarcaoaltăpagină,iarpepaginainițialănusevaefectuaniciocomandă.
4.PaginawebvafitrimisăcătrebrowserprinacțiuneaHTTPPOST.
5.Paginavaruladinnoupeserver-ulweb,sevormodificainformatiileintrodusedecatre
utilizatorinbrowser-ulweb.
6.Rezultatulvafitrimisbrowser-ului,șiastfelsereiaciclul.
Procedeuldeprelucareapaginilorwebdecătreserverestedivizatinmaimultecategorii.
Fiecareicategoriiîicorespundeunevenimentasociatpaginii.Celemaiimportanteetapepentruo
paginawebsunt:
Init–seinițializeazăfiecarecontrolserver
Load–seexecutălafiecarecerereapaginii
Render–segenereazăcodulhtmlcevafitrimisbrowser-ului
UnLoad–sunteliberateresurselefolosite.

92.4.3ControaleASP.NET
Pentruacreadesign-uluneipaginiwebASP.NETpuneladispozitieoseriedecontroale,chiarși
posibilitateadefiniriunorcontroaleproprii.Acesteasemainumescsicontroaleserverdeoarecepotfi
programate,prinintermediulunuicodserver-sidesipotrăspundelaanumintecomenzidin
pagină.PentruarăspundeacestecontroaletrebuiesăconținăatributeleIdsirunat=„server”.
Existădouătipuridecontroaleserver.WebșiHtml.CotroaleleHtmlcorespundcontroalelor
standardHTML,șisepotcreaprinadaugareaatributuluirunat=„server”unuitagHTML.
IdentificareaunuicontrolHtmlîncodulserver-sidesefaceprinadăugareaatributului„id”:<pid=
"output"runat="server"/>.
Cândsescrieuncodserver-sidepentrucontroaleleHTMLdetipinput(text,checkbox,button)sepoate
folosiproprietateavaluepentruaaccesavalorileintrodusedecătreutilizator.
ControaleledetipserverWeboferămaimulefuncțiiprogramabiledecâtceleHTML.Acestea
potadăugacodjavascriptșipotcuprindemaimultortag-uriHTML.Acesteasuntcuprinseîntretag-
urile<asp></asp>.
ExempludecontrolASP.NETcarepoateintroducedatedecătreutilizator:
<asp:TextBoxID="TextBox1”runat=”server”></asp:TextBox>.
2.4.4RealizareainterfețeicuASP.NETMasterPage
ASP.NETpuneladispozițiaprogramatoruluicâtevaunelteputernicepentrudezvoltareainterfeței
unuisiteweb:
1.MasterPages
2.Foidestil(StyleSheets)
Opaginămasteresteopaginăspecialăcaredeținestructurasite-ului.Paginaestedesemnatăcu
extensia.masterșiesteimportatăînpaginiledeconținutcuproprietateaMasterPageFilecudirectiva
@Pagedinconținutulpagini.
Aceastafoloseșteunșablonpebazacăreiavorfirealizatetoatepaginiledinsite-ulweb.Paginile
.masternusuntfăcutepentruadeținecontroluluneipagini.aspx.Elesuntmenitesăofereunmodel
desprecumartrebuisăarateaspectulsite-uluiweb.

10Înafaraconținut-uluideținutdepaginilecuextensia.master,fiecarepagină.aspxvadețineșiun
conținutpropriu.
PentruaadăugaopaginăMasterPage,dinmeniulWebsitesealegeopțiuneaAdd,NewItem,șiapoi
MasterPage
Figura1Crearepaginămasterpage
MasterPageconțineozonănumităContentPlaceHolderundevafiinseratconținutulpaginilor
.aspxconstruitepebazaacestuitemplate.
Figura2ContentPlaceHolder

11ZonaContentPlaceHoldervarețineconținutulfiecăreipagini.aspx.
<%@MasterLanguage="C#"AutoEventWireup="true"
CodeFile="MasterPage.master.cs"Inherits="MasterPage"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server"><title>IndexPagina</title>
<asp:ContentPlaceHolderid="head"runat="server"></asp:ContentPlaceHolder>
</head>
<body>
<formid="form1"runat="server">
<div>
<asp:ContentPlaceHolderid="ContentPlaceHolder1"runat="server">
</asp:ContentPlaceHolder>
<asp:LabelID="Label1"runat="server"Font-Bold="True"
Text="Text-ulacestavafiafisatpetoatepaginile">
</asp:Label>
</div>
</form>
</body>
</html>
Laadăugareaînsiteauneinoipagini.aspx,sepoateselectapaginaMasterPagecareconținelayout-
uldoritpentrusite-ulweb.

12
Figura3Webformînpaginamasterpage
Figura4Adăugarepaginademaster
SeselecteazăMasterPagepentrupaginawebnouadăugată.
Paginaadăugataareurmătoareastructură:
<%@PageLanguage="C#"MasterPageFile="~/MasterPage.master"
AutoEventWireup="true"CodeFile="Default.aspx.cs"Inherits="_Default"

13Title="UntitledPage"%>
<asp:ContentID="Content1"ContentPlaceHolderID="head"Runat="Server">
</asp:Content>
<asp:ContentID="Content2"ContentPlaceHolderID="ContentPlaceHolder1"
Runat="Server">
<p>
Conținut-ulpaginiadăugate.
</p>
</asp:Content>
ÎnzonadedirectiveaapărutonouăcondițiecarespecificănumelefișieruluiMasterPage:
MasterPageFile="~/MasterPage.master".
FiecarepaginăaspxvaaveauncontroldetipContent,alcăruiidvaaveaaceeașivaloarecucel
dinMasterPage:
Figura5Controldetipcontent

143 TEHNOLOGIIWEBPENTRUCREAREAINTERFEȚEI
3.1HTML
HTMLesteunlimbajdemarcarefolositpentrucreareapaginilorweb,cedefineșteconținutul
paginilorșimoduldeorganizareșiafișarealcomponenteloracestoraprinutilizareaetichetelorșia
atributelor.Etichetelesuntreprezentatedecuvintecheieplasateîntrecaracterele„<”,„>”șisunt
folositepentruadefinielementeHTML.
Majoritateaetichetelorformeazăperechi,ceeaceînsemnăcăfolosireauneiadintreetichete
presupune,implicit,șifolosireaceleilalte.
Oastfeldeperecheestealcătuitădintr-oetichetădeînceputșiunadeîncheiere.Ambeleconțin
acelașicuvântcheieplasatîntrecaracterele„<”și„>”,diferențadintreelefiiinddatădefaptulcă,în
cazuleticheteideîncheiere,cuvântulcheieesteprecedatdecaracterul„/”.
Unexempludeastfeldeperechearfi<p>și</p>,folosităpentrudefinireaunuiparagrapf.
Existăînsășietichetecenuprezintăopereche.Deexemplu,pentrudefinireauneiimaginieste
suficientăfolosireaetichetei<img>.
Pentrucaopaginăwebsăpoatăfiinterpretatăcorectdecătrebrowser,și,prinurmare,săpoatăfi
afișată,trebuiesăprezinteeticheteleesențiale:<html>șiperechea</html>,<head>șicorespondentul
</head>,<body>șietichetadeîncheiere</body>.
Primaperecheestefolosităpentruaisespecificabrowser-uluifaptulcăaredeinterpretato
paginăHTML.Adouaperechemarchezăsecțiuneanumităheadceconțineinformațiiasuprapaginii
precumtitlulacesteia,referințelecătrefișereleJavaScript,iarutlimaperechemarcheazăsecțiunea
numităbodycareconținetoatecomponentelepaginiivizibileînbrowser.
Avândînvederecelemenționateanterior,codulutlizatpentrurealizareauneipaginiwebcutitlul
„Acestaesteuntest”,ceafișeazătextul„Acestaesteunparagraf”este:
<html>
<head>
<title>Acestaesteuntest</title>
</head>
<body>
<p>Acestaesteunparagraf</p>
</body>
</html>

15Înceeacepriveșteatributele,cesuntspecificateînetichetadeînceput,acesteasuntfolosite
pentruaoferiinformațiisuplimentareasuprauneiadintrecomponentelepaginiiweb(unparagraf,o
imagine,etc).Îngeneral,atributeleauasociatunnumeșiovaloare.
Astfel,pentrualiniereacentralăaunuiparagrafsevafolosiatributulcunumelealignșivaloarea
centerdupăcumurmează:
<palign=”center”>Acestaesteunparagraf</p>
3.2jQuery
jQueryesteobibliotecărapidășimicădeJavaScriptcarepuneladispozițiaprogramatorului
numeroasefuncțiipecareacestalepoateutilizapentrusimplificareacoduluiscrisînlimbaj
JavaScript.
Altfelspus,unsimpluapelaluneifuncțiiasociateacesteibibliotecipoateconducelaobținerea
uneifuncționalitățicarealtfelarfinecesitatscriereamaimultorliniidecod.Acestlucruestesusținut
șidemotto-ulpebazacăruiaafostdezvoltatăbibliotecașianume„Writeless,domore!”.
PrintreprincipalelecaracteristicialebiblioteciijQuerysenumără:
simplificăapeluriledetipAJAX.
restaurareadediacriticeînfișieretextcomplexe
oferăometodăelegantădeatrataanumiteevenimenteprecumapăsareaunuilink
faciliteazătraversareaelementelordocumentuluiHTMLprecumșimanipularealor
prezintănumeroasefuncțiiprinintermediulcărorapotfirealizateșiincluseanimațiiîn
paginaweb,cuunminimdeefort
Pentruaputeafifolositefuncțiileacesteibiblioteci,estenecesarfiedescarcareaeidepesite-ul
webasociat„jQuery.com“,pepropiulcomputerșiapoiincludereaînfișierulHTML,fieincluderea
directaînfișierulHTML.
Dintreceledouăvariante,celmaiindicatarfisăfiefolosităvariantaadouadeoarece,prin
vizitareaaltorpaginiweb,ceimaimulțiutilizatoriaudescărcatdejabibliotecajQuery.Astfel,aceasta
vafiîncărcatădirectdinmemoriacacheatuncicândsuntvizitatealtepaginicefolosescfuncțiijQuery
șiprinurmaretimpuldeîncărcarealpaginiiwebvizitatevafimaimic.

16Deasemenea,ceade-adouavariantăvafipreferatădeoarece,încazuluneirețeledetipCDN,
resursacerutădeutlilizatorvafioferitădeserver-ulcelmaiapropiatdeacesta,dinpunctdevedere
geografic,ceeaceducelamicșorareatimpuluideîncărcarealpaginiiaccesate.
SintaxautilizatăatuncicândsedoreșteapelareauneifuncțiidinbibliotecajQueryindicăfaptulcă
principalulscopalacesteiaesteaceladeaselectaelementulpaginiiHTMLasupracăruiavaacționa
unadinfuncțiilesale.Sintaxaeste:$(selector).action().Semnul„$”specificăfaptulcăsevafolosio
funcțiespecificăjQuery,selectorestefolositpentruidentificareaelementuluiHTML(deexemplu,
acestcâmpvafireprezenatdeid-ulelementului)iaraction()nureprezintăaltcevadecâtfuncția
apelată.
Astfel,dacăsedoreșteascundereatuturorparagafelordintr-opaginăHTML,liniadecodceva
trebuifolosităeste:$(“p”).hide().
3.3JavaScript
JavaScriptesteunlimbajdeprogramareorientatpeobiectedenivelînalt,bazatpeconceptul
prototipurilor,dinamic,diferitdeJavaatâtdinpunctdevederealconceptuluicâtșialmoduluide
proiectare.
Acestaesteutilizatpentruintroducereaunordiversefuncțiiînsite-urileweb.Estecunoscut,în
special,caunlimbajdescriptingfolositpentrupaginiweb,fiindfolositpentruacontrola
comportamentulacestora.
ExistătreiformealelimbajuluiJavaScript:
CoreJavaScript–reprezintălimbajulJavaScriptdebază,CSJSșiSSJSfiinddependentede
acesta.
CSJS(Client-SideJavaScript)–reprezintăoversiuneextinsăaJavaScriptfolosităpentru
îmbunătățireafuncționalitățilorpaginilorwebșianavigatoarelorwebfolositedeclient;
SSJS(Server-SideJavaScript)–reprezintăoversiuneextinsăaJavaScriptfolosităpentru
accesareaînfundalabazelordedate,asistemelordefișiereșiaserver-elor;
VersiuneaceamaiutilizatăesteCSJS,codulrezultatfiindinclusdirectîndocumentulHTMLsau
introdusîntr-unfișierdetip„.js“carevafirelatatîndocumentulHTML.

17SecreeazăastfelopaginăHTMLinteractivășidinamică,cepoateprezentaurmătoarele
funcționalități:verificareafaptuluicăadresadee-mailintrodusăîncâmpulcorespunzătoralunui
formularesteunacorespunzătoare(nuseverificăexistențaei,cifaptulcărespectășablonulclasical
uneiadresedee-mail),verificareafaptuluicăuncâmpalformularuluiafostcompletat.
CodulJavaScriptesteexecutatabiadupăfinalizareacompletăriiformularuluișiapăsării
butonuluidetrimitere.Unuldintreprincipaleleavantajealacestuilimbajdeprogramareeste
reprezentatdefaptulcă,fiindunlimbajinterpretatdecătrenavigatoareleweb,nunecesităun
compilator.
3.4CSS
CSSinseamnăCascadingStyleSheets.CSSedefinitcaunmoddeformatareaHTML-ului.
Celedouaconceptenusuntînrivalitate,bachiarnupoateexistaunsitewebfărăamândouă.
PentruaafișaparagrafeinHTMLsefolosește<p>.
Moduldearanjarealdocumentuluierasarcinabrowser-ului,farăafifolositetaguridestructură.
DezavantajullucruluicuCSSestecăpaginaconținândcodCSSpoatearatadiferitînnavigatoare
diferite,deoarecenutoatebrowsereleinterpreteazăcodulCSSlafel.AdăugândcodJavaScript,se
obtinefecteșimaisofisticate,chiardeanimatie.
CSS+JavaScript=DHTML(DynamicHTML).Acesteefectespectaculoasejustificătitulatura
de"artiștiCSS"sau"artizaniCSS"acordatăunorcreatoridepaginiweb.
Foiledestildauposibilitateaspecificăriiinformațieidesprestilînmaimultefeluri.Stilurilese
potspecificaîntr-unsingurelementHTML,îninteriorulelementului<head>aluneipaginiHTML
sauîntr-unfișierexternCSS.
Dintr-unsingurdocumentHTMLsepotfacereferiricătremaimultefoidestilexterne.Deci,un
stildininteriorulunuielementHTMLareceamaimareprioritate,ceeaceînseamnăcăvasuprascrie
fiecarestildeclaratîntagul<head>,într-ofoaiedestilexternășiînbrowser.
Stilurilepotfiaplicateelementelorunuidocumentîntreimoduri:
3.4.1Laniveldeelement
StilurilesuntinclusecaatributeîncadruletichetelorHTMLdindocument.Ceeaceînseamnă
căelevorschimbadoarelementulasupracăruiasuntaplicate.Esteometodămaipuținfolosită,

18deoarececontraziceprincipiulgeneralalstilurilor,aceladeasimplificașideafacemailizibilcodul
documentuluiHTML.
3.4.2Încapsulate
Stilurilesuntintoduseîndocumentulasupracăruiasefoloseste,șianumeînsecțiunea
<head>adocumentului,prinaplicareamarcajului<style>.
3.4.3Legate
StilurilesuntutilizateînfișiereseparatededocumentulHTML.Documentulfaceapellafoaiade
stiluriprinintermediuletichetei<link>.
Avantajulfolosiriifoilordestiluriexterneestedublu.Pede-oparte,elesepotfolosilanivelul
maimultordocumenteHTML,construindastfelolegăturădestilîntreele,lucrudeosebitdeutilîn
realizareaunuisiteweb.Pedealtăparte,acelașidocumentpoaterealizafoidestiluridiferite,oferind
vizitatoruluiposibilitateadeaoptalaunmomentdat,pentruunulsaualtuldintreele,înfuncțiede
preferințelefiecăruia.
Includereastilurilorîntr-undocumentHTML:
<html>
<head>
<linkrel="stylesheet"type="text/css“href=“numefisier.css">(stilurilegate)
<style>
H1{color:#008000;font-weight:bold}
P{font-family:Arial;color:#800080;font-size:14px}
</style>(stiluriîncapsulate)
</head>
<body>
<pstyle=”color:green;font-family;arial;font-weight:bold”>Text-uldinacestparagrafestescris
cufontarial,ingrosatdeculoareverde.</p>
<body>

193.4.4Atributulclass
Cuatributulclasssepotdefinielementedestiluridiferitepentruacelașielement.Săpresupunem
cădorimdouătipurideparagrafeîndocument:unulaliniatlastangașiunulcentrat.
Iatăcumsepotrealizaacestestiluri:
p.left{text-align:left}
p.center{text-align:center}
Trebuiefolositatributulclassîndocumentul.HTML:
<pclass="left">Paragrafaliniatlastanga</p>
<pclass="center">Paragrafaliniatpecentru</p>
3.4.5Atributulid
Atributulidtrebuiesăfieunicpepagină.Nupoateexistadecâtunelementcuuniddatîntr-un
document.ElestemarcatîndocumentulHTMLcuidînlocdeclass:
<pid=”intr”>Acestparagrafvafialiniatladreapta.</p>
Atributulidpoatefidefinitprindouămoduri.Poatefidefinitpentruasepotrivituturor
elementelorcuunidspecificsausăsepotriveascănumaiunuielementcuunidspecific.
Înurmatorulexemplu,atributulidsevaaplicatuturorelementelorcuid=„int”
#int{
font-size:110%;
font-weight:bold;
color:#0000ff;
background-color:transparent}
PseudoclasedestiluriCSSșimodalitățidemodificareacursorului
Pseudoclaseleajutafoartemultlafacereaunicaalegăturilor,atâtdetiptext,câtșidetipimagine.Ele
suntpuseintr-unstilprecum<style>…</style>sauîntr-unfișierdinafară.

20Exempledepseudoclase:
a:link{
color:navyblue;
}
a:visited{
color:lightblue;
}
a:hover{
color:red;
}
a:active{
color:orange;
3.5Bootstrap
BootstrapestecelmaipopularframeworkHTML,CSSșiJavaScriptfolositpentrudesign-ul
paginilorwebacărorinterfațăseadapteazălarezoluțiaecranuluidispozitivului(desktop,laptop,
tabletă,smartphone)depecareesteaccesatăpagină.Bootstrapoferănumeroasefacilități,punândla
dispozițiadezvoltatorilorșabloaneHTMLșiCSSpentruformulare,butoane,tabele,diferiteanimații,
etc.
jQueryestefoarteprezentinBootstrap,euștiucăleputemincludepetoate.Deasemenea,este
unframeworkcarearecaprincipalăsarcinăoferireaelementelornecesarepentrurealizareaunui
produsfinisatîntr-untimpscurt.Dezvoltatoruluirămânându-isarcinadeaparticularizașablonul
prespectiv,deexemplu,prinutilizareapropriuluifișier.css.PentrucafacilitățileoferitedeBootstrap
săpoatăfifolositeestenecesarăincludereafișierelor.cssși.jsspecificeBoostrapînfișierul.html.
3.6Linq
LINQ–LanguageIntegratedQueryșiînseamnă„Limbajintegratdeinterogareadatelor”.
LINQesteotehnologieMicrosoftcefurnizeazăunmecanismlaniveldelimbajpentruaexecuta
cereridedatedeoricetip.Acestetipuriincludtablourișicolecțiiinmemorie,bazededate,
documenteXML,etc.PrintrealteleLINQpoatefaceconversii,poatesorta,poateobțineo
submulțimeauneimulțimidate,etc.

21Dateleobținutesuntvăzutecaobiecte;undearelocomapare(traducere)aunordate
neobiectualeîntr-unformatușordefolositinlimbajelecarefolosescprogramareorientatăpeobiecte.
Linqesteindependentfațadelimbaj.Existăimplementărișipentrualtelimbaje:
LinqlaJavaScript
PHPLinq
Quaere
Glinq
Figura6ArhitecturaLinq
Exempledeinterogarilinq:
varquery=fromsinstudents
wheres.id==1
selects.nume
sau:
varresults=fromprodusinproduseCollection
whereprodus.PrețUnitar<100
selectnew{produs.NumeProdus,produs.PrețUnitar};

22foreach(varresultinresults)
{
Console.WriteLine(result);
}
LINQafostadăugatînversiunea3.5alui.NETFramework.Aceastacurprindeunsetdeunelte
caresuntutilizatepentrulucrucudateșiextensiiaduselimbajului.
Linqesteconstruitdin:
LINQtoObjects–seaducdatecareimplementeazăinterfațaIenumerable<T>;datelecare
aufostinterogateseaflădejaînmemoriaprocesului;
LINQtoXML–converteștedocumenteleXML ýntr–ocolecțiedeobiectedetipXelement;
LINQtoSQL–permiteconvertireainterogărilorLINQ ýncomenziSQL;
LINQtoDataSets–LINQtoDataSetsfoloseșteADO.NETpentrucomunicareacubazede
date;
LINQtoEntities–soluțieObject/RelationalMappingdelaMicrosoftcepermiteutilizarea
deEntities–introduseînADO.NET3.0–pentruaspecificadeclarativstructuraobiectelor
cemodeleazădomeniul¸sifoloseșteLINQpentruinterogare.
LaoraactualăexistăurmăatoriifurnizoridedateLINQ:
1.LINQtoMySQL,PostgreSQL,Oracle,Ingres,SQLite¸siMicrosoftSQLServer
2.LINQtoCSV
3.LINQtoGoogle
4.LINQtoNhibernate
5.LINQtoSystemSearch
3.6.1LinqtoSql

23LINQSQLesteocomponentăLINQșiopartedinADO.NET,careoferăoinfrastructurărun-
timepentrumapareadedaterelaționalecaobiecte.
LinqtoSqlstocheazabazededateintr-unservercaSQLServer2000,2005sau2008;se
permiteșiimplementareaunorfurnizoriLinqpentrualteserveredebazededate.
LinqtoSqlsuportăpedeplintranzitiile,vederileșiprocedurilestocate.
LinqtoSqlcompuneoasociereîntretabeleledinbazadedatesiclaselec#,clasenumiteentitați.
SepuneladispozițieclasaDataContextcarefacelegăturaîntrebazadedateșiclaseleentitate.
DataContextmenținestareaobiectelor,transformăunobiectîýntr–oînregistrare¸siinvers.
3.6.2ModelareabazeidedatefolosindLinqtoSqldetipDataContext
ObținereaentitațilordetipDataContextsefaceadăugandunobiectdetip„LINQtoSQL
Classes”,prin„Addnewitem”incadru-uluneiaplicațiidinVisualStudiolafelcaînimagineade
maijos.Vaapăreaunfișiercuextensiadbmllaaplicție.
PrinadăugareatabelelordinfereastradeServerExplorersevorcreașiclaseleentitateaferente
tabelelor.
ObținereaunuiobiectasociatetabeleiPersonsefaceprin:
PersonDataContextpdc=newPersonDataContext();

24
Figura7Obținereaunuicontextdedate
Dupaacestatotceramanedefacutestesatragempesuprafatadesigner-uluidinServerExplorer
tabeleledefiniteinbazadedate.Claselevorficreatepentrunoiinmodautomatșivorcorespunde
tabelelor.Totaicisepotdefinișirelatiiîntreclase,acesteasuntasemanatoarecurelatiiledintr-obaza
dedate.
Selectareatabelelorpebazacărorasevaconstruifișieruldbml:
Figura8BazădedateSql

25
Figura9Clasedefiniteinbazadedate
Claselecreatesegasescinfisierul:<nume_fisier_DBML>.Designer.cssiauunatribut
special:[Table(Name=”dbo.<nume_tabel>”)].
3.6.3InterogaricaresepotrealizacuLinqtoSql
3.6.3.1Adăugarea
Pentruaadăugaonouăînregistrare,sevacreaunobiectdetipulentitate-clasăaceastaestefurnizată
înmodautomatdecătreDBML–dupăcaresevaapelametodaInsertOnSubmitpentrutabelaîncare
sedoreșteinserarea.MetodaInsertOnSubmitseapeleazănumaicândsedoreșteonouăînregistrare
pentrucontextuldedate:
using(PersonDataContextpc=newPersonDataContext())
{
Personp=newPerson{
FirstName=„inserted”,
LastName=„fromcode„,IDRole=1
};
pd.Persons.InsertOnSubmit(p);

26pd.SubmitChanges(p);
}
Încazulîncarepentruobiectulpsestabilesteroluldar,nuprinasigurareadirectăavaloriicheii
străine,ciprincreareaunuiobiectnoudetipRole,atuncinoulobiectsevainseraautomat,cureferință
cătrerolulcreat:
using(PersonDataContextpd=newPersonDataContext()){
pd.Log=Console.Out;
Personp=newPerson{FirstName=„inserted„,LastName=„fromcode„,
Role=newRole{RoleDescripțion=„tester„}};
pd.Persons.InsertOnSubmit(p);
pd.SubmitChanges();
}
3.6.3.2Modificareauneiînregistrări
Modificareauneiînregistrărisevafaceprinobținereaobiectuluicarevafimodificat,semodifică
propietațileluișiapelulmetodeiSubmitChangespentrucontextuldedate:
using(PersonDataContextpd=newPersonDataContext())
{
pd.Log=Console.Out;
Personperson=pd.Persons.Where(p=>p.id==1).Single();
person.LastName=„Modified”;
pd.SubmitChanges();
}
Modificareasepoatefacedoarunuiobiectcareafostadusîntr-uncontextdeschisșiînchis
anterior,darcureatașarelacontext.

273.6.3.3Ștergereauneiînregistrări
Ștergereauneiînregistrărisefaceprintr-omanevrăasemănătoarecuSubmitChanges.Sevalua
înregistrareacaretrebuieștearsă,iarpentruobiectulprodussefaceștergereacumetoda
DeleteOnSubmit.Acestareprezentândtabeladincaresevaștergeobiectul:
using(PersonDataContextpd=newPersonDataContext()){
pd.Log=Console.Out;
Personperson=pdc.Persons.Where(p=>p.id==9).
DefaultIfEmpty().Single();
if(person!=null)
pd.Persons.DeleteOnSubmit(person);
}
pd.SubmitChanges();
}
3.6.3.4Selectareauneiînregistrări
varselection=frompinpd.Persons
Wherep.FirstName.Equals(”Popescu”)
Selectnew{
FirstName
LastName
IDRole
}

284 IMPLEMENTAREAȘIUTILIZAREAAPLICȚIEI
Creareabazeidedateaaplicației
CreareabazeidedateaaplicațieiafostrealizatăfolosindMicrosoftSqlServersiLinqtoSqldin
VisualStudio.Înfiguriledemaijossuntprezentatenumelecâmpurilorșitipurilededatealetabelelor
bazeidedate:
Tabel1Înregistrarestudenți
Codpentruinregistrarestudenți:

29
Figura10Codstudențiînregistrați

30
Figura11Înregistrarestudențipesite
Tabelînregistrareprofesoripewebsite:
Tabel2înregistrareprofesori

31Codpentruînregistrareprofesori:
Figura12Codînregistrareprofesori
Metodăsitepentruînregistrareprofesori:

32
Figura13Înregistrareprofesoripesite
Tabelînregistraredepartamente:
Tabel3Înregistraredepartamente

33Codînregistraredepartamente:
Figura14Codînregistraredepartamente
Tabelînregistrarenote:
Tabel4înregistrarenote

34
Figura15Înregistrarewebsitedepartamente
Codulpentruintroducereacursurilorșidepartamentulîncadrulcursulesteținut:
Figura16Codintroducerecursuri

35Versiunewebsitedeintroducerecursuri:
Figura17Websiteînregistrarecursurifațădeceledejaexistente
Tabelpentruintroducerecursuri
Tabel5IntroducereCursuri
Asignarebirouripentruprofesori(instructors)

36
Figura18Asignarebirouripentruprofesori(instructors)

37Asignareabirouluipewebsiteseproduceatuncicândseintroduceunprofesornousauseeditează
unuldejaprezent:
Figura19Aratămoduldeintroducerealbirouluipesite
Codulpentruasignareacursurilorpentrustudenți.

38
Figura20Aratăasignareacursurilorstudenților
Asignareacursurilorstudențilorfacutăpewebsite:

39
Figura21Asignareacursurilordirectpesite
4.1Diagramaentitate-asociere
Figura22Diagramaentitate-asociere

404.2Prezentareasite-ului
Site-ulwebdeevidențăastudențilorestedefinitcaosoluțieintegrată,inteligentășibazatăpeinternet
pentrusistemulactualdeînvațămant.Înacestsistemstudentulșiprofesorulvoraveaacceslanote,
departamente,cursurișiprofesori.
Sistemulseîmparteînmaimultepagini:
1.Home–paginapecaresedeschidesite-ul.Conțineinformațiidesprecesepetreceîn
facultate.AmluatcaexempluFacultateadeAutomatică.Paginaconțineșiunlinkextern
cătrefacultateasus-numităîncadrulrubricii„GettingintoourUniversity”.
2.Students–paginaStudentsnedăposibilitateadeavedeatotistundențiiînscrișisortați
alfabeticcâtșideaadaugastudenținoicuurmătoareleopțiuni:nume,prenumeșidata
înscrierii.ButoaneleCreateNewșiEdit,Delete,Detailssuntdeasemeneapepagină,
efectuândacțiunilenominale.
3.Courses–inaceastăcategorieneestepermisăvizualizareanumărulcursului,numele
acestuia,câtecreditesuntalocatepentruelcâtșidepartamentuldincarefaceparte.Sunt
prezenteșibutoaneledecrearecursurinoi(CreateNew)șiEdit,DetailsșiDeletecare
executăfuncțiilecăroralepoartănumele.
4.Instructors–aicisunttrecuțiprofesorii,biroulacestora,numelelor,datalacareaufost
angajaticâtșicecursuripredau.Lafelcaînpaginileprecedente,butoaneledemodificăriși
deadăugaresuntprezente.
5.Departments–categoriaDepartmentsprezintădepartamenteleFacultățiirespective,unde
dinnouamluatexemplulFacultățiideAutomaticădinCraiova.Esteprezentșibugetul
respectivșidatalacareaufostpuseînfuncțiunecâtșiadministratorulșibutoanecarefac
adăugareașimodificareaentitățilorfoarteaccesibile.
6.AcademicandEducationStatus–reprezintăpaginaundesuntafișatepeaceeașipagină
conținutulpaginilorCourses,InstructorsșiDepartmentsșideundesepoateefectuafiecare
operațiecubutoanelemenționatemaisuslafiecarepagină.
Opțiunileutilizatorilor
-Administrareutilizatori,ștergere,adăugare,editare
-Adaugănoteînlegaturăcusituațiașcolarăastudentilor;

41-Adaugă,modificășiștergecursuri;
-Vizualizeazădatedespreprofesori,studențișidepartamente.
4.3Interfațacuutilizatorul
AplicațiaprinrulareaeiproduceaparițiaferestreiprincipaleapaginiWeb,careseocupăcu
afișareanoutățilorsauasubiectelordeinteresmăritpentrustudențisauviitoristudenți.
Paginaesteutilizatăcapunctdeplecare,caoricealthome-page,pentruanavigapesite-ulde
evidențăastudenților.
Entitățilesite-uluiaudiferiteatribuții:
students:doareipotpriminote;
instructors:numaiaceastăentitatepoatefișefdedepartamenteșipotaveacursuriîn
atribuțiilelor.
4.3.1Header-ulsite-uluișibutoaneleprezente
Figura23Header-ulsite-ului
CraiovaUniversity
Students
Courses
Instructors
Departments

424.3.1.1Students:
PaginaStudentsafișeazăolistacunumele,prenumeleșidataînscrieriiastudenților.Înparteadreapta
suntbutoanedeEdit,DetailsșiDelete.Listaesteafișatăcucâte3studențipepaginăpentruo
vizibilitateușoară.Listaestedejasortatăalfabeitdarsepoateordonainvers-alfabeticdacăseface
clickpeLastNameșivice-versa.Paginaesteconstruităsimpludupăcumurmează:
Figura24paginaStudentsextensie
Încontinuare,accesândbutonulDetails,seobservăatributelestudentului:nume,prenume,data
înscrieriidarșicursurilelacarestudentulparticipăcâtșinotelelaacelcurs.Amurmatsistemulde
notareamericandeoareceunvisde-almeuestesămăextindcândvașiinSUA.

43
Figura25butonulDetails
4.3.1.2Courses
PaginaCoursesestefocusatăpedetaliereacursurilordincadrulunitățiideînvățământ.Așacumaeste
totsite-ul,paginaestesimplă.Prezintăunbutondecrearedecursurinoișilistacursurilorprezente.Se
potadaugaaltecursuridartrebuiespecificatnumărul,titlul,câtecreditesuntalocatepentruacelcurs
câtșidepartamentuldincareosăfacăparte.EuamluatmodelulFacultățiideAutomaticădinCraiova
șiamlistatcâtevadincursurilerespectivei.
Figura26reprezentândpaginaCoursesîmpreunăcubutonulCreateNew
4.3.1.3Instructors
PaginaInstructorsestepaginacuprofesoriiinstituțieideînvățământ.Aiciavemafișatnumele,
prenumele,datacândauintratînserviciulfacultății,numărulcabinetuluiundeaubiroulșicursurile
predate.Toateacestedatetrebuieintrodusedeasemeneadacăsevreaadăugareaunuinouprofesorcu

44ajutorulbutonuluiCreateNew.ButoaneleSelect,Edit,DeleteșiDetailssuntprezenteșiîndeplinesc
funcțiilenominale.
Figura27carearatăpaginaInstructors
Imagineacarearatăînregistrareaprofesorilorpesiteestearătatăînfigura2.4lapagina31.
Butonul„Select”estelocatlângăcelelaltebutoane,îndreaptainterfeței.Cândesteapăsat,sedeschide
onouărubricănumită„CoursesTaughtbySelectedInstructor”iarnumeleprofesoruluiselectatse
coloreazăînverde.
Figura28CoursesTaughtbySelectedInstructor
4.3.1.4Departments
PaginaDepartmentsaratădepartamenteleunitățiideînvățământ.Suntprezentenumele
departamentelor,bugetulalocatacestora,datalacareși-auînceputfuncționareacâtșinumele

45profesorilorcareadministreazădepartamentul.ButoaneleCreateNewpermiteadăugarea
departamentelornoiiarbutoaneleEdit,DetailsșiDeletepermitacțiunilecorespunzătoare.
Figura29cupaginaDepartments
Figura30meniulCreateNew
ButonulEditestearătatîncontinuare.Deșibugetulestearătatcudouăzecimale,cândsedoreștesăse
introducăoaltăsumă,sumarespectivătrebuiesăfieunnumărnatural,altfelvaapăreaeroarea„The
fieldBudgetmustbeanumber”.Cazulestearătatînfigura4dupăceesteapăsatbutonul„Save”.

46
Figura31aratăbutonulEditșicazuldeeroarecândesteintrodusunnumărnenatural
4.3.2Side-bar-ulsite-uluișibutoanelesale
Side-bar-ulconținedouăbutoane:HomeșiAcademic.„Academic”,larândulsău,conținebutonul
EducationStatus.Cândutilizatorulapasăpe„+”-uldesub„Academic”,unsub-butonîivaapăreape
side-bar.Butonul„EducationStatus”esteoadițieplăcutăalucrăriișinuîngreuneazăaccesibilitatea
site-ului.

47
Figura32cuside-bar-ulsite-ului
4.3.2.1Home
PaginaHomeestepaginapecaresedeschidesite-ul.Conțineinformațiidesprecesepetreceîn
facultate.AmluatcaexempluFacultateadeAutomaticășiamadăugatcâtevaștiridepesite-ul
facultății.Butoanele„Home”șiCraiovaUniversityducamândouăpepaginadeacasă.
.
Figura33butoaneleHomeșiCraiovaUniversity

48
Figura34careconstăînpreview-ulpaginiidestart
4.3.2.2AcademicEducationStatus
PaginaAcademicEducationStatusreprezintăevidențastudențilorșiaunitățiideînvățământ
împreunăcuprofesorișicursuritoatepeaceeașipagină.Toatebutoanelesuntprezentedeasemene.
CreateNew,Details,DeleteșiEditsuntfuncționalepentrutoateinstanțeledecaz.Utilizatorulare
posibilitateadeacomutapaginileCoursescuStudentsprinapăsareabutonuluirespectivînparteade
sus.ButonulStudentsesteînstângaiarCoursesesteîndreapta.

49
Figura35butonulEducationStatus
4.3.2.3„Loading”
Pentruaparențaproiectului,sefoloseștebutonul„Loading”atuncicândîncercămsăîncărcămpagini
depesite.Animațiaîșifaceaparițiacândcalculatorulestepuținmailent,atuncifiindmomentul
perfectpentruvizualizareasa.
Figura36Loading

504.3.2.4ButoaneledinEducationStatus–metodaradio
Pluginurilepotfiadăugateunulcâteunulsautoatelaunloc.Putemalegeîntrebootstrap.jsși
bootstrap.min.jspentrucăamândouăleconținpetoate.UnelepluginurișicomponentealeCSS-ului
audependențecualtele.Trebuiesăcăutămdependențeleîndocumente.Sepotfolositoateplugin-
urileBootstrapfărăsăscriinicimăcarosingurăliniedeJavaScript.
ÎnconținutulpaginiiEducationStatusamcontrolatstărilebutoanelorprezente:StudentsandCourses,
InstructorsșiDepartments.Laprimaaccesare,butoanelearatăastfel:
Figura37EducationStatuspasiv
ConceptulfolositlaapăsareabutoaneloresteceldeRadioșiesteexemplificatînimaginileurmătoare:
Figura38efectbutoane

515 BIBLIOGRAFIE
[Bra04]-BradleyL.Jones,SamsTeachYourselftheC#Languagein21Days,SAMS,2004,
InternationalStandardBookNumber:0-672-32546-2
[Mar06]-MarshallDonis,ProgrammingMicrosoftVisualC#2005:TheLanguage,MicrosoftPress
2006,ISBN:0735621810
[Mic05]-MicheldeCamplain,BrianG.Patrik,C#2.0:PracticalGuideforProgrammers,Elsevier,
2005,ISBN:0-12-167451-7

526 REFERINȚEWEB
[Adr08]–AdrianNiță,MariaNiță,NicolaeOlăroiu,RodicaCristina,SichimDaniela,Introducereîn
.NET framework, 2008, disponibil on-line la adresa
https://profs.info.uaic.ro/~adiftene/C_SHARP/Introducere%20in%20.Net%20Framework%20-
%20Suport%20de%20curs%20pentru%20profesori.pdf
[Cat15]-Cătălina-AlexandraRUSU,WEBinteractiv:tehnologiaASP.NET
[Ana08]-AnaÎntuneric,NicolaeOlãroiu,CristinaSichim,ProgramareaWEBcuMicrosoft.NET&
ASP.NET,disponibilon-linelaadresa
http://www.cs.ubbcluj.ro/~vcioban/Bistrita/Manuale/Manual_ASP.pdf
[CSS08]-***,CSS–Introducere,disponibilon-linelaadresahttp://nwwt.blogspot.com/2008/01/css-
introducere.html

53A.CODULSURSĂ
CoursesController.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Threading.Tasks;
usingMicrosoft.AspNetCore.Mvc;
usingMicrosoft.AspNetCore.Mvc.Rendering;
usingMicrosoft.EntityFrameworkCore;
usingContosoUniversity.Data;
usingContosoUniversity.Models;
namespaceContosoUniversity.Controllers
{
publicclassCoursesController:Controller
{
privatereadonlySchoolContext_context;
publicCoursesController(SchoolContextcontext)
{
_context=context;
}
//GET:Courses
publicasyncTask<IActionResult>Index()
{
varcourses=_context.Courses
.Include(c=>c.Department)
.AsNoTracking();
returnView(awaitcourses.ToListAsync());
}
//GET:Courses/Details/5

54publicasyncTask<IActionResult>Details(int?id)
{
if(id==null)
{
returnNotFound();
}
varcourse=await_context.Courses
.Include(c=>c.Department)
.AsNoTracking()
.SingleOrDefaultAsync(m=>m.CourseID==id);
if(course==null)
{
returnNotFound();
}
returnView(course);
}
//GET:Courses/Create
publicIActionResultCreate()
{
PopulateDepartmentsDropDownList();
returnView();
}
publicIActionResult_Create()
{
PopulateDepartmentsDropDownList();
returnView();
}
[HttpPost]
publicasyncTask<IActionResult>_Create(int[]CourseID,string[]Title,int[]Credits,int[]
DepartmentID)
{
List<Course>courses=newList<Course>();

55for(inti=0;i<CourseID.Length;i++)
{
Coursecourse=newCourse();
course.CourseID=CourseID[i];
course.Title=Title[i];
course.Credits=Credits[i];
course.DepartmentID=DepartmentID[i];
course.Department=_context.Departments.SingleOrDefault(x=>x.DepartmentID==
DepartmentID[i]);
courses.Add(course);
}
if(ModelState.IsValid)
{
_context.Courses.AddRange(courses);
await_context.SaveChangesAsync();
returnView("_Index",courses);
}
returnnull;
}
[HttpPost]
[ValidateAntiForgeryToken]
publicasyncTask<IActionResult>Create([Bind("CourseID,Credits,DepartmentID,Title")]
Coursecourse)
{
if(ModelState.IsValid)
{
_context.Add(course);
await_context.SaveChangesAsync();
returnRedirectToAction("Index");
}
PopulateDepartmentsDropDownList(course.DepartmentID);
returnView(course);
}

56publicasyncTask<IActionResult>Edit(int?id)
{
if(id==null)
{
returnNotFound();
}
varcourse=await_context.Courses
.AsNoTracking()
.SingleOrDefaultAsync(m=>m.CourseID==id);
if(course==null)
{
returnNotFound();
}
PopulateDepartmentsDropDownList(course.DepartmentID);
returnView("_Edit",course);
}
[HttpPost,ActionName("Edit")]
[ValidateAntiForgeryToken]
publicasyncTask<IActionResult>EditPost(int?id)
{
if(id==null)
{
returnNotFound();
}
varcourseToUpdate=await_context.Courses.Include(x=>x.Department)
.SingleOrDefaultAsync(c=>c.CourseID==id);
if(awaitTryUpdateModelAsync<Course>(courseToUpdate,
"",
c=>c.Credits,c=>c.DepartmentID,c=>c.Title))
{

57try
{
await_context.SaveChangesAsync();
}
catch(DbUpdateException/*ex*/)
{
//Logtheerror(uncommentexvariablenameandwritealog.)
ModelState.AddModelError("","Unabletosavechanges."+
"Tryagain,andiftheproblempersists,"+
"seeyoursystemadministrator.");
}
IList<Course>courses=newList<Course>();
courses.Add(courseToUpdate);
returnView("_Index",courses);
//returnRedirectToAction("Index");
}
PopulateDepartmentsDropDownList(courseToUpdate.DepartmentID);
returnView(courseToUpdate);
}
privatevoidPopulateDepartmentsDropDownList(objectselectedDepartment=null)
{
vardepartmentsQuery=fromdin_context.Departments
orderbyd.Name
selectd;
ViewBag.DepartmentID=newSelectList(departmentsQuery.AsNoTracking(),
"DepartmentID","Name",selectedDepartment);
}
//GET:Courses/Delete/5
publicasyncTask<IActionResult>Delete(int?id)
{
varcourse=await_context.Courses.SingleOrDefaultAsync(m=>m.CourseID==id);
_context.Courses.Remove(course);

58await_context.SaveChangesAsync();
returnJson(true);
}
//POST:Courses/Delete/5
[HttpPost,ActionName("Delete")]
[ValidateAntiForgeryToken]
publicasyncTask<IActionResult>DeleteConfirmed(intid)
{
varcourse=await_context.Courses.SingleOrDefaultAsync(m=>m.CourseID==id);
_context.Courses.Remove(course);
await_context.SaveChangesAsync();
returnRedirectToAction(nameof(Index));
}
publicIActionResultUpdateCourseCredits()
{
returnView();
}
[HttpPost]
publicasyncTask<IActionResult>UpdateCourseCredits(int?multiplier)
{
if(multiplier!=null)
{
ViewData["RowsAffected"]=
await_context.Database.ExecuteSqlCommandAsync(
"UPDATECourseSETCredits=Credits*{0}",
parameters:multiplier);
}
returnView();
}
privateboolCourseExists(intid)
{

59return_context.Courses.Any(e=>e.CourseID==id);
}
}
}
DepartmentsController.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Threading.Tasks;
usingMicrosoft.AspNetCore.Mvc;
usingMicrosoft.AspNetCore.Mvc.Rendering;
usingMicrosoft.EntityFrameworkCore;
usingContosoUniversity.Data;
usingContosoUniversity.Models;
namespaceContosoUniversity.Controllers
{
publicclassDepartmentsController:Controller
{
privatereadonlySchoolContext_context;
publicDepartmentsController(SchoolContextcontext)
{
_context=context;
}
//GET:Departments
publicasyncTask<IActionResult>Index()
{
varschoolContext=_context.Departments.Include(d=>d.Administrator);

60returnView(awaitschoolContext.ToListAsync());
}
//GET:Departments/Details/5
publicasyncTask<IActionResult>Details(int?id)
{
if(id==null)
{
returnNotFound();
}
stringquery="SELECT*FROMDepartmentWHEREDepartmentID={0}";
vardepartment=await_context.Departments
.FromSql(query,id)
.Include(d=>d.Administrator)
.AsNoTracking()
.SingleOrDefaultAsync();
if(department==null)
{
returnNotFound();
}
returnView(department);
}
//GET:Departments/Create
publicIActionResultCreate()
{
ViewData["InstructorID"]=newSelectList(_context.Instructors,"ID","FullName");
returnView();
}
//POST:Departments/Create

61//Toprotectfromoverpostingattacks,pleaseenablethespecificpropertiesyouwanttobindto,
for
//moredetailsseehttp://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult>
Create([Bind("DepartmentID,Name,Budget,StartDate,InstructorID,RowVersion")] Department
department)
{
if(ModelState.IsValid)
{
_context.Add(department);
await_context.SaveChangesAsync();
returnPartialView("_Index",department);
//returnRedirectToAction(nameof(Index));
}
ViewData["InstructorID"]=newSelectList(_context.Instructors,"ID","FullName",
department.InstructorID);
returnView(department);
}
//GET:Departments/Edit/5
publicasyncTask<IActionResult>Edit(int?id)
{
if(id==null)
{
returnNotFound();
}
vardepartment=await_context.Departments
.Include(i=>i.Administrator)
.AsNoTracking()
.SingleOrDefaultAsync(m=>m.DepartmentID==id);
if(department==null)

62{
returnNotFound();
}
ViewData["InstructorID"]=newSelectList(_context.Instructors,"ID","FullName",
department.InstructorID);
returnView(department);
}
//POST:Departments/Edit/5
//Toprotectfromoverpostingattacks,pleaseenablethespecificpropertiesyouwanttobindto,
for
//moredetailsseehttp://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
publicasyncTask<IActionResult>Edit(int?id,byte[]rowVersion)
{
if(id==null)
{
returnNotFound();
}
vardepartmentToUpdate=await_context.Departments.Include(i=>
i.Administrator).SingleOrDefaultAsync(m=>m.DepartmentID==id);
if(departmentToUpdate==null)
{
DepartmentdeletedDepartment=newDepartment();
awaitTryUpdateModelAsync(deletedDepartment);
ModelState.AddModelError(string.Empty,
"Unabletosavechanges.Thedepartmentwasdeletedbyanotheruser.");
ViewData["InstructorID"]=newSelectList(_context.Instructors,"ID","FullName",
deletedDepartment.InstructorID);
returnView(deletedDepartment);
}

63_context.Entry(departmentToUpdate).Property("RowVersion").OriginalValue=rowVersion;
if(awaitTryUpdateModelAsync<Department>(
departmentToUpdate,
"",
s=>s.Name,s=>s.StartDate,s=>s.Budget,s=>s.InstructorID))
{
try
{
await_context.SaveChangesAsync();
returnPartialView("_Index",departmentToUpdate);
//returnRedirectToAction("Index");
}
catch(DbUpdateConcurrencyExceptionex)
{
varexceptionEntry=ex.Entries.Single();
varclientValues=(Department)exceptionEntry.Entity;
vardatabaseEntry=exceptionEntry.GetDatabaseValues();
if(databaseEntry==null)
{
ModelState.AddModelError(string.Empty,
"Unabletosavechanges.Thedepartmentwasdeletedbyanotheruser.");
}
else
{
vardatabaseValues=(Department)databaseEntry.ToObject();
if(databaseValues.Name!=clientValues.Name)
{
ModelState.AddModelError("Name",$"Currentvalue:{databaseValues.Name}");
}
if(databaseValues.Budget!=clientValues.Budget)
{
ModelState.AddModelError("Budget",$"Currentvalue:
{databaseValues.Budget:c}");

64}
if(databaseValues.StartDate!=clientValues.StartDate)
{
ModelState.AddModelError("StartDate",$"Currentvalue:
{databaseValues.StartDate:d}");
}
if(databaseValues.InstructorID!=clientValues.InstructorID)
{
InstructordatabaseInstructor=await_context.Instructors.SingleOrDefaultAsync(i
=>i.ID==databaseValues.InstructorID);
ModelState.AddModelError("InstructorID",$"Currentvalue:
{databaseInstructor?.FullName}");
}
ModelState.AddModelError(string.Empty,"Therecordyouattemptedtoedit"
+"wasmodifiedbyanotheruserafteryougottheoriginalvalue.The"
+"editoperationwascanceledandthecurrentvaluesinthedatabase"
+"havebeendisplayed.Ifyoustillwanttoeditthisrecord,click"
+"theSavebuttonagain.OtherwiseclicktheBacktoListhyperlink.");
departmentToUpdate.RowVersion=(byte[])databaseValues.RowVersion;
ModelState.Remove("RowVersion");
}
}
}
ViewData["InstructorID"]=newSelectList(_context.Instructors,"ID","FullName",
departmentToUpdate.InstructorID);
returnView(departmentToUpdate);
}
publicasyncTask<IActionResult>_Delete(intid)
{
vardepartment=await_context.Departments.SingleAsync(m=>m.DepartmentID==id);
_context.Departments.Remove(department);
returnJson(await_context.SaveChangesAsync()>0);

65}
//GET:Departments/Delete/5
publicasyncTask<IActionResult>Delete(int?id,bool?concurrencyError)
{
if(id==null)
{
returnNotFound();
}
vardepartment=await_context.Departments
.Include(d=>d.Administrator)
.AsNoTracking()
.SingleOrDefaultAsync(m=>m.DepartmentID==id);
if(department==null)
{
if(concurrencyError.GetValueOrDefault())
{
returnRedirectToAction("Index");
}
returnNotFound();
}
if(concurrencyError.GetValueOrDefault())
{
ViewData["ConcurrencyErrorMessage"]="Therecordyouattemptedtodelete"
+"wasmodifiedbyanotheruserafteryougottheoriginalvalues."
+"Thedeleteoperationwascanceledandthecurrentvaluesinthe"
+"databasehavebeendisplayed.Ifyoustillwanttodeletethis"
+"record,clicktheDeletebuttonagain.Otherwise"
+"clicktheBacktoListhyperlink.";
}
returnView(department);
}

66[HttpPost]
[ValidateAntiForgeryToken]
publicasyncTask<IActionResult>Delete(Departmentdepartment)
{
try
{
if(await_context.Departments.AnyAsync(m=>m.DepartmentID==
department.DepartmentID))
{
_context.Departments.Remove(department);
await_context.SaveChangesAsync();
}
returnRedirectToAction("Index");
}
catch(DbUpdateConcurrencyException/*ex*/)
{
//Logtheerror(uncommentexvariablenameandwritealog.)
returnRedirectToAction("Delete",new{concurrencyError=true,id=
department.DepartmentID});
}
}
privateboolDepartmentExists(intid)
{
return_context.Departments.Any(e=>e.DepartmentID==id);
}
}
}
HomeController.cs
usingSystem;
usingSystem.Collections.Generic;

67usingSystem.Diagnostics;
usingSystem.Linq;
usingSystem.Threading.Tasks;
usingMicrosoft.AspNetCore.Mvc;
usingContosoUniversity.Models;
usingMicrosoft.EntityFrameworkCore;
usingContosoUniversity.Data;
usingContosoUniversity.Models.SchoolViewModels;
usingSystem.Data.Common;
namespaceContosoUniversity.Controllers
{
publicclassHomeController:Controller
{
privatereadonlySchoolContext_context;
publicHomeController(SchoolContextcontext)
{
_context=context;
}
publicIActionResultIndex()
{
returnView();
}
publicasyncTask<ActionResult>About()
{
List<EnrollmentDateGroup>groups=newList<EnrollmentDateGroup>();
varconn=_context.Database.GetDbConnection();
try
{
awaitconn.OpenAsync();
using(varcommand=conn.CreateCommand())
{

68stringquery="SELECTEnrollmentDate,COUNT(*)ASStudentCount"
+"FROMPerson"
+"WHEREDiscriminator='Student'"
+"GROUPBYEnrollmentDate";
command.CommandText=query;
DbDataReaderreader=awaitcommand.ExecuteReaderAsync();
if(reader.HasRows)
{
while(awaitreader.ReadAsync())
{
varrow=newEnrollmentDateGroup{EnrollmentDate=reader.GetDateTime(0),
StudentCount=reader.GetInt32(1)};
groups.Add(row);
}
}
reader.Dispose();
}
}
finally
{
conn.Close();
}
returnView(groups);
}
publicIActionResultContact()
{
ViewData["Message"]="Yourcontactpage.";
returnView();
}
publicIActionResultError()
{

69returnView(newErrorViewModel{RequestId=Activity.Current?.Id??
HttpContext.TraceIdentifier});
}
}
}
InstructorsController.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Threading.Tasks;
usingMicrosoft.AspNetCore.Mvc;
usingMicrosoft.AspNetCore.Mvc.Rendering;
usingMicrosoft.EntityFrameworkCore;
usingContosoUniversity.Data;
usingContosoUniversity.Models;
usingContosoUniversity.Models.SchoolViewModels;
namespaceContosoUniversity.Controllers
{
publicclassInstructorsController:Controller
{
privatereadonlySchoolContext_context;
publicInstructorsController(SchoolContextcontext)
{
_context=context;
}
//GET:Instructors
publicasyncTask<IActionResult>Index()
{
varInstructors=await_context.Instructors

70.Include(i=>i.OfficeAssignment)
.Include(i=>i.CourseAssignments)
.ThenInclude(i=>i.Course)
//.ThenInclude(i=>i.Department)
.OrderBy(i=>i.LastName)
.ToListAsync();
returnView(Instructors);
}
publicasyncTask<IActionResult>_Index1(intid)
{
varCourses=await_context.CourseAssignments.Where(x=>x.InstructorID==id).Include(x
=>x.Course)
.ThenInclude(x=>x.Department).ToListAsync();
returnPartialView(Courses.Select(x=>x.Course));
}
publicasyncTask<IActionResult>_Index2(intcourseID)
{
returnPartialView(await_context.Enrollments.Include(x=>x.Student).Where(x=>
x.CourseID==courseID).ToListAsync());
}
//GET:Instructors/Details/5
publicasyncTask<IActionResult>Details(int?id)
{
if(id==null)
{
returnNotFound();
}
varinstructor=await_context.Instructors
.SingleOrDefaultAsync(m=>m.ID==id);
if(instructor==null)
{
returnNotFound();

71}
returnView(instructor);
}
publicIActionResultCreate()
{
varinstructor=newInstructor();
instructor.CourseAssignments=newList<CourseAssignment>();
PopulateAssignedCourseData(instructor);
returnView();
}
//POST:Instructors/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult>
Create([Bind("FirstMidName,HireDate,LastName,OfficeAssignment")]Instructorinstructor,string[]
selectedCourses)
{
if(selectedCourses!=null)
{
instructor.CourseAssignments=newList<CourseAssignment>();
foreach(varcourseinselectedCourses)
{
varcourseToAdd=newCourseAssignment{InstructorID=instructor.ID,CourseID=
int.Parse(course)};
instructor.CourseAssignments.Add(courseToAdd);
}
}
if(ModelState.IsValid)
{
_context.Add(instructor);
await_context.SaveChangesAsync();
returnRedirectToAction("Index");

72}
PopulateAssignedCourseData(instructor);
returnView(instructor);
}
//GET:Instructors/Edit/5
publicasyncTask<IActionResult>Edit(int?id)
{
if(id==null)
{
returnNotFound();
}
varinstructor=await_context.Instructors
.Include(i=>i.OfficeAssignment)
.Include(i=>i.CourseAssignments).ThenInclude(i=>i.Course)
.AsNoTracking()
.SingleOrDefaultAsync(m=>m.ID==id);
if(instructor==null)
{
returnNotFound();
}
PopulateAssignedCourseData(instructor);
returnView(instructor);
}
privatevoidPopulateAssignedCourseData(Instructorinstructor)
{
varallCourses=_context.Courses;
varinstructorCourses=newHashSet<int>(instructor.CourseAssignments.Select(c=>
c.CourseID));
varviewModel=newList<AssignedCourseData>();
foreach(varcourseinallCourses)
{
viewModel.Add(newAssignedCourseData

73{
CourseID=course.CourseID,
Title=course.Title,
Assigned=instructorCourses.Contains(course.CourseID)
});
}
ViewData["Courses"]=viewModel;
}
//POST:Instructors/Edit/5
//Toprotectfromoverpostingattacks,pleaseenablethespecificpropertiesyouwanttobindto,
for
//moredetailsseehttp://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
publicasyncTask<IActionResult>Edit(int?id,string[]selectedCourses)
{
if(id==null)
{
returnNotFound();
}
varinstructorToUpdate=await_context.Instructors
.Include(i=>i.OfficeAssignment)
.Include(i=>i.CourseAssignments)
.ThenInclude(i=>i.Course)
.SingleOrDefaultAsync(m=>m.ID==id);
if(awaitTryUpdateModelAsync<Instructor>(
instructorToUpdate,
"",
i=>i.FirstMidName,i=>i.LastName,i=>i.HireDate,i=>i.OfficeAssignment))
{
if(String.IsNullOrWhiteSpace(instructorToUpdate.OfficeAssignment?.Location))
{

74instructorToUpdate.OfficeAssignment=null;
}
UpdateInstructorCourses(selectedCourses,instructorToUpdate);
try
{
await_context.SaveChangesAsync();
}
catch(DbUpdateException/*ex*/)
{
//Logtheerror(uncommentexvariablenameandwritealog.)
ModelState.AddModelError("","Unabletosavechanges."+
"Tryagain,andiftheproblempersists,"+
"seeyoursystemadministrator.");
}
returnRedirectToAction("Index");
}
UpdateInstructorCourses(selectedCourses,instructorToUpdate);
PopulateAssignedCourseData(instructorToUpdate);
returnView(instructorToUpdate);
}
privatevoidUpdateInstructorCourses(string[]selectedCourses,InstructorinstructorToUpdate)
{
if(selectedCourses==null)
{
instructorToUpdate.CourseAssignments=newList<CourseAssignment>();
return;
}
varselectedCoursesHS=newHashSet<string>(selectedCourses);
varinstructorCourses=newHashSet<int>
(instructorToUpdate.CourseAssignments.Select(c=>c.Course.CourseID));
foreach(varcoursein_context.Courses)
{
if(selectedCoursesHS.Contains(course.CourseID.ToString()))

75{
if(!instructorCourses.Contains(course.CourseID))
{
instructorToUpdate.CourseAssignments.Add(newCourseAssignment{InstructorID=
instructorToUpdate.ID,CourseID=course.CourseID});
}
}
else
{
if(instructorCourses.Contains(course.CourseID))
{
CourseAssignmentcourseToRemove=
instructorToUpdate.CourseAssignments.SingleOrDefault(i=>i.CourseID==course.CourseID);
_context.Remove(courseToRemove);
}
}
}
}
//GET:Instructors/Delete/5
publicasyncTask<IActionResult>Delete(int?id)
{
if(id==null)
{
returnNotFound();
}
varinstructor=await_context.Instructors
.SingleOrDefaultAsync(m=>m.ID==id);
if(instructor==null)
{
returnNotFound();
}

76returnView(instructor);
}
//POST:Instructors/Delete/5
[HttpPost,ActionName("Delete")]
[ValidateAntiForgeryToken]
publicasyncTask<IActionResult>DeleteConfirmed(intid)
{
Instructorinstructor=await_context.Instructors
.Include(i=>i.CourseAssignments)
.SingleAsync(i=>i.ID==id);
vardepartments=await_context.Departments
.Where(d=>d.InstructorID==id)
.ToListAsync();
departments.ForEach(d=>d.InstructorID=null);
_context.Instructors.Remove(instructor);
await_context.SaveChangesAsync();
returnRedirectToAction("Index");
}
privateboolInstructorExists(intid)
{
return_context.Instructors.Any(e=>e.ID==id);
}
}
}
SPAin1PlatformController.cs
usingSystem;
usingSystem.Collections.Generic;

77usingSystem.Linq;
usingSystem.Threading.Tasks;
usingMicrosoft.AspNetCore.Mvc;
namespaceContosoUniversity.Controllers
{
publicclassSPAin1PlatformController:Controller
{
publicIActionResultIndex()
{
returnView();
}
}
}
StudentsController.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Threading.Tasks;
usingMicrosoft.AspNetCore.Mvc;
namespaceContosoUniversity.Controllers
{
publicclassSPAin1PlatformController:Controller
{
publicIActionResultIndex()
{
returnView();
}
}
}
DbInitializer.cs

78usingSystem;
usingSystem.Linq;
usingMicrosoft.EntityFrameworkCore;
usingMicrosoft.Extensions.DependencyInjection;
usingContosoUniversity.Models;
namespaceContosoUniversity.Data
{
publicstaticclassDbInitializer
{
publicstaticvoidInitialize(SchoolContextcontext)
{
context.Database.EnsureCreated();
//Lookforanystudents.
if(context.Students.Any())
{
return;//DBhasbeenseeded
}
varstudents=newStudent[]
{
newStudent{FirstMidName="Marius",LastName="Manea",
EnrollmentDate=DateTime.Parse("2010-09-01")},
newStudent{FirstMidName="Ionut",LastName="Nicolescu",
EnrollmentDate=DateTime.Parse("2012-09-01")},
newStudent{FirstMidName="Madalin",LastName="Ostroveanu",
EnrollmentDate=DateTime.Parse("2013-09-01")},
newStudent{FirstMidName="Ionuel",LastName="Vaduva",
EnrollmentDate=DateTime.Parse("2012-09-01")},
newStudent{FirstMidName="Ioan",LastName="Voiculescu",
EnrollmentDate=DateTime.Parse("2012-09-01")},
newStudent{FirstMidName="Cristina",LastName="Jiga",
EnrollmentDate=DateTime.Parse("2011-09-01")},

79newStudent{FirstMidName="Danut",LastName="Iordache",
EnrollmentDate=DateTime.Parse("2013-09-01")},
newStudent{FirstMidName="Florin",LastName="Logofatu",
EnrollmentDate=DateTime.Parse("2005-09-01")}
};
foreach(Studentsinstudents)
{
context.Students.Add(s);
}
context.SaveChanges();
varinstructors=newInstructor[]
{
newInstructor{FirstMidName="Marius",LastName="Brezovan",
HireDate=DateTime.Parse("1995-03-11")},
newInstructor{FirstMidName="Eugen",LastName="Ganea",
HireDate=DateTime.Parse("2002-07-06")},
newInstructor{FirstMidName="Dan",LastName="Mancas",
HireDate=DateTime.Parse("1998-07-01")},
newInstructor{FirstMidName="Liana",LastName="Stanescu",
HireDate=DateTime.Parse("2001-01-15")},
newInstructor{FirstMidName="Cristian",LastName="Mihaescu",
HireDate=DateTime.Parse("2004-02-12")}
};
foreach(Instructoriininstructors)
{
context.Instructors.Add(i);
}
context.SaveChanges();
vardepartments=newDepartment[]
{
newDepartment{Name="ComputerScience",Budget=350000,

80StartDate=DateTime.Parse("2007-09-01"),
InstructorID=instructors.Single(i=>i.LastName=="Brezovan").ID},
newDepartment{Name="ComputerScience(romanian)",Budget=100000,
StartDate=DateTime.Parse("2007-09-01"),
InstructorID=instructors.Single(i=>i.LastName=="Ganea").ID},
newDepartment{Name="Systemengineering",Budget=350000,
StartDate=DateTime.Parse("2007-09-01"),
InstructorID=instructors.Single(i=>i.LastName=="Mancas").ID},
newDepartment{Name="Mechatronicsandrobotics",Budget=100000,
StartDate=DateTime.Parse("2007-09-01"),
InstructorID=instructors.Single(i=>i.LastName=="Mihaescu").ID},
newDepartment{Name="Electricalengineeringandtelecommunications",Budget=
100000,
StartDate=DateTime.Parse("2007-09-01"),
InstructorID=instructors.Single(i=>i.LastName=="Stanescu").ID},
};
foreach(Departmentdindepartments)
{
context.Departments.Add(d);
}
context.SaveChanges();
varcourses=newCourse[]
{
newCourse{CourseID=1050,Title="Softwareengineering",Credits=3,
DepartmentID=departments.Single(s=>s.Name=="Computer
Science").DepartmentID
},
newCourse{CourseID=4022,Title="Formalandautomatedlanguages",Credits=3,
DepartmentID=departments.Single(s=>s.Name=="Computer
Science").DepartmentID
},
newCourse{CourseID=4041,Title="Databasedesign",Credits=3,

81DepartmentID=departments.Single(s=>s.Name=="Electricalengineeringand
telecommunications").DepartmentID
},
newCourse{CourseID=1045,Title="Multimediaapplicationdevelopment",Credits
=4,
DepartmentID=departments.Single(s=>s.Name=="Electricalengineeringand
telecommunications").DepartmentID
},
newCourse{CourseID=3141,Title="Computerarchitecture",Credits=4,
DepartmentID=departments.Single(s=>s.Name=="System
engineering").DepartmentID
},
};
foreach(Coursecincourses)
{
context.Courses.Add(c);
}
context.SaveChanges();
varofficeAssignments=newOfficeAssignment[]
{
newOfficeAssignment{
InstructorID=instructors.Single(i=>i.LastName=="Brezovan").ID,
Location="303"},
newOfficeAssignment{
InstructorID=instructors.Single(i=>i.LastName=="Mancas").ID,
Location="305"},
newOfficeAssignment{
InstructorID=instructors.Single(i=>i.LastName=="Ganea").ID,
Location="N01"},
newOfficeAssignment{
InstructorID=instructors.Single(i=>i.LastName=="Mihaescu").ID,
Location="N01"},

82newOfficeAssignment{
InstructorID=instructors.Single(i=>i.LastName=="Stanescu").ID,
Location="113"},
};
foreach(OfficeAssignmentoinofficeAssignments)
{
context.OfficeAssignments.Add(o);
}
context.SaveChanges();
varcourseInstructors=newCourseAssignment[]
{
newCourseAssignment{
CourseID=courses.Single(c=>c.Title=="Softwareengineering").CourseID,
InstructorID=instructors.Single(i=>i.LastName=="Brezovan").ID
},
newCourseAssignment{
CourseID=courses.Single(c=>c.Title=="Formalandautomatedlanguages"
).CourseID,
InstructorID=instructors.Single(i=>i.LastName=="Brezovan").ID
},
newCourseAssignment{
CourseID=courses.Single(c=>c.Title=="Databasedesign").CourseID,
InstructorID=instructors.Single(i=>i.LastName=="Stanescu").ID
},
newCourseAssignment{
CourseID=courses.Single(c=>c.Title=="Multimediaapplicationdevelopment"
).CourseID,
InstructorID=instructors.Single(i=>i.LastName=="Stanescu").ID
},
newCourseAssignment{
CourseID=courses.Single(c=>c.Title=="ComputerArchitecture").CourseID,
InstructorID=instructors.Single(i=>i.LastName=="Mancas").ID
},

83};
foreach(CourseAssignmentciincourseInstructors)
{
context.CourseAssignments.Add(ci);
}
context.SaveChanges();
varenrollments=newEnrollment[]
{
newEnrollment{
StudentID=students.Single(s=>s.LastName=="Manea").ID,
CourseID=courses.Single(c=>c.Title=="Computerarchitecture").CourseID,
Grade=Grade.A
},
newEnrollment{
StudentID=students.Single(s=>s.LastName=="Manea").ID,
CourseID=courses.Single(c=>c.Title=="Multimediaapplicationdevelopment"
).CourseID,
Grade=Grade.A
},
newEnrollment{
StudentID=students.Single(s=>s.LastName=="Manea").ID,
CourseID=courses.Single(c=>c.Title=="ComputerArchitecture").CourseID,
Grade=Grade.B
},
newEnrollment{
StudentID=students.Single(s=>s.LastName=="Cristina").ID,
CourseID=courses.Single(c=>c.Title=="ComputerArchitecture").CourseID,
Grade=Grade.B
},
newEnrollment{
StudentID=students.Single(s=>s.LastName=="Cristina").ID,
CourseID=courses.Single(c=>c.Title=="Databasedesign").CourseID,

84Grade=Grade.B
},
newEnrollment{
StudentID=students.Single(s=>s.LastName=="Florin").ID,
CourseID=courses.Single(c=>c.Title=="ComputerArchitecture").CourseID,
Grade=Grade.B
},
newEnrollment{
StudentID=students.Single(s=>s.LastName=="Florin").ID,
CourseID=courses.Single(c=>c.Title=="Mobilecalculus").CourseID
},
newEnrollment{
StudentID=students.Single(s=>s.LastName=="Danut").ID,
CourseID=courses.Single(c=>c.Title=="Multimediaapplication
development").CourseID,
Grade=Grade.B
},
newEnrollment{
StudentID=students.Single(s=>s.LastName=="Ionut").ID,
CourseID=courses.Single(c=>c.Title=="Multimediaapplication
development").CourseID,
Grade=Grade.B
},
newEnrollment{
StudentID=students.Single(s=>s.LastName=="Ionut").ID,
CourseID=courses.Single(c=>c.Title=="ComputerArchitecture").CourseID,
Grade=Grade.B
},
newEnrollment{
StudentID=students.Single(s=>s.LastName=="Ioan").ID,
CourseID=courses.Single(c=>c.Title=="Multimediaapplication
development").CourseID,
Grade=Grade.B
},
newEnrollment{

85StudentID=students.Single(s=>s.LastName=="Ioan").ID,
CourseID=courses.Single(c=>c.Title=="Multimediaapplication
development").CourseID,
Grade=Grade.B
},
};
foreach(Enrollmenteinenrollments)
{
varenrollmentInDataBase=context.Enrollments.Where(
s=>
s.Student.ID==e.StudentID&&
s.Course.CourseID==e.CourseID).SingleOrDefault();
if(enrollmentInDataBase==null)
{
context.Enrollments.Add(e);
}
}
context.SaveChanges();
}
}
}
SchoolContext.cs
usingContosoUniversity.Models;
usingMicrosoft.EntityFrameworkCore;
namespaceContosoUniversity.Data
{
publicclassSchoolContext:DbContext
{
publicSchoolContext(DbContextOptions<SchoolContext>options):base(options)
{
}

86publicDbSet<Course>Courses{get;set;}
publicDbSet<Enrollment>Enrollments{get;set;}
publicDbSet<Student>Students{get;set;}
publicDbSet<Department>Departments{get;set;}
publicDbSet<Instructor>Instructors{get;set;}
publicDbSet<OfficeAssignment>OfficeAssignments{get;set;}
publicDbSet<CourseAssignment>CourseAssignments{get;set;}
publicDbSet<Person>People{get;set;}
protectedoverridevoidOnModelCreating(ModelBuildermodelBuilder)
{
modelBuilder.Entity<Course>().ToTable("Course");
modelBuilder.Entity<Enrollment>().ToTable("Enrollment");
modelBuilder.Entity<Student>().ToTable("Student");
modelBuilder.Entity<Department>().ToTable("Department");
modelBuilder.Entity<Instructor>().ToTable("Instructor");
modelBuilder.Entity<OfficeAssignment>().ToTable("OfficeAssignment");
modelBuilder.Entity<CourseAssignment>().ToTable("CourseAssignment");
modelBuilder.Entity<Person>().ToTable("Person");
modelBuilder.Entity<CourseAssignment>()
.HasKey(c=>new{c.CourseID,c.InstructorID});
}
}
}
AssignedCourseData.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Threading.Tasks;
namespaceContosoUniversity.Models.SchoolViewModels

87{
publicclassAssignedCourseData
{
publicintCourseID{get;set;}
publicstringTitle{get;set;}
publicboolAssigned{get;set;}
}
}
EnrollmentDateGroup.cs
usingSystem;
usingSystem.ComponentModel.DataAnnotations;
namespaceContosoUniversity.Models.SchoolViewModels
{
publicclassEnrollmentDateGroup
{
[DataType(DataType.Date)]
publicDateTime?EnrollmentDate{get;set;}
publicintStudentCount{get;set;}
}
}
InstructorIndexData.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Threading.Tasks;
namespaceContosoUniversity.Models.SchoolViewModels
{
publicclassInstructorIndexData

88{
publicIEnumerable<Instructor>Instructors{get;set;}
publicIEnumerable<Course>Courses{get;set;}
publicIEnumerable<Enrollment>Enrollments{get;set;}
}
}
Course.cs
usingSystem.Collections.Generic;
usingSystem.ComponentModel.DataAnnotations;
usingSystem.ComponentModel.DataAnnotations.Schema;
namespaceContosoUniversity.Models
{
publicclassCourse
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Display(Name="Number")]
publicintCourseID{get;set;}
[StringLength(50,MinimumLength=3)]
publicstringTitle{get;set;}
[Range(0,5)]
publicintCredits{get;set;}
publicintDepartmentID{get;set;}
publicDepartmentDepartment{get;set;}
publicICollection<Enrollment>Enrollments{get;set;}
publicICollection<CourseAssignment>CourseAssignments{get;set;}
}
}

89CourseAssigment.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel.DataAnnotations;
usingSystem.ComponentModel.DataAnnotations.Schema;
namespaceContosoUniversity.Models
{
publicclassCourseAssignment
{
publicintInstructorID{get;set;}
publicintCourseID{get;set;}
publicInstructorInstructor{get;set;}
publicCourseCourse{get;set;}
}
}
Department.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel.DataAnnotations;
usingSystem.ComponentModel.DataAnnotations.Schema;
namespaceContosoUniversity.Models
{
publicclassDepartment
{
publicintDepartmentID{get;set;}
[StringLength(50,MinimumLength=3)]
publicstringName{get;set;}
[DataType(DataType.Currency)]

90[Column(TypeName="money")]
publicdecimalBudget{get;set;}
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString="{0:yyyy-MM-dd}",ApplyFormatInEditMode=true)]
[Display(Name="StartDate")]
publicDateTimeStartDate{get;set;}
publicint?InstructorID{get;set;}
[Timestamp]
publicbyte[]RowVersion{get;set;}
publicInstructorAdministrator{get;set;}
publicICollection<Course>Courses{get;set;}
}
}
Enrollment.cs
usingSystem.ComponentModel.DataAnnotations;
usingSystem.ComponentModel.DataAnnotations.Schema;
namespaceContosoUniversity.Models
{
publicenumGrade
{
A,B,C,D,F
}
publicclassEnrollment
{
publicintEnrollmentID{get;set;}
publicintCourseID{get;set;}
publicintStudentID{get;set;}

91[DisplayFormat(NullDisplayText="Nograde")]
publicGradeGrade{get;set;}
publicCourseCourse{get;set;}
publicStudentStudent{get;set;}
}
}
ErrorViewModel.cs
usingSystem;
namespaceContosoUniversity.Models
{
publicclassErrorViewModel
{
publicstringRequestId{get;set;}
publicboolShowRequestId=>!string.IsNullOrEmpty(RequestId);
}
}
Instructor.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel.DataAnnotations;
usingSystem.ComponentModel.DataAnnotations.Schema;
namespaceContosoUniversity.Models
{
publicclassInstructor:Person
{
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString="{0:yyyy-MM-dd}",ApplyFormatInEditMode=true)]

92[Display(Name="HireDate")]
publicDateTimeHireDate{get;set;}
publicICollection<CourseAssignment>CourseAssignments{get;set;}
publicOfficeAssignmentOfficeAssignment{get;set;}
}
}
OfficeAssignment.cs
usingSystem.ComponentModel.DataAnnotations;
usingSystem.ComponentModel.DataAnnotations.Schema;
namespaceContosoUniversity.Models
{
publicclassOfficeAssignment
{
[Key]
publicintInstructorID{get;set;}
[StringLength(50)]
[Display(Name="OfficeLocation")]
publicstringLocation{get;set;}
publicInstructorInstructor{get;set;}
}
}
Person.cs
usingSystem.ComponentModel.DataAnnotations;
usingSystem.ComponentModel.DataAnnotations.Schema;
namespaceContosoUniversity.Models
{
publicabstractclassPerson

93{
publicintID{get;set;}
[Required]
[StringLength(50)]
[Display(Name="LastName")]
publicstringLastName{get;set;}
[Required]
[StringLength(50,ErrorMessage="Firstnamecannotbelongerthan50characters.")]
[Column("FirstName")]
[Display(Name="FirstName")]
publicstringFirstMidName{get;set;}
[Display(Name="FullName")]
publicstringFullName
{
get
{
returnLastName+","+FirstMidName;
}
}
}
}
Student.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel.DataAnnotations;
usingSystem.ComponentModel.DataAnnotations.Schema;
namespaceContosoUniversity.Models
{
publicclassStudent:Person

94{
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString="{0:yyyy-MM-dd}",ApplyFormatInEditMode=true)]
[Display(Name="EnrollmentDate")]
publicDateTimeEnrollmentDate{get;set;}
publicICollection<Enrollment>Enrollments{get;set;}
}
}

95C.CD/DVD
Autorulatașeazăînaceastăanexăobligatorie,versiuneaelectronicăaaplicației,aacestei
lucrări,precumșiprezentareafinalăatezei.

96INDEX
B
Bibliografie……………………………………………………9
C
CUPRINSUL…………………………………………………xi
D
Dimensiuni…………………………………………………….3
F
Figuri…………………………………………………………….4
Formulelematematice……………………………………..4
I
Ilustrațiile………………………………………………………4L
Legenda…………………………………………………………6
LISTAFIGURILOR……………………………………..xii
LISTATABELELOR…………………………………..xiii
R
Referințeweb………………………………………………..10
S
Structuradocumentului…………………………………….2
T
Tabele……………………………………………………………5

Similar Posts