Ș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
4Operatorideatribuire
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
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Șeflucr.dr.ing.Marius-AdrianMarian Septembrie2019 CRAIOVA ii UNIVERSITATEADINCRAIOVA FACULTATEADEAUTOMATICĂ,CALCULATOAREȘI ELECTRONICĂ… [615414] (ID: 615414)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
