Aplicatii Web Moderne
Aplicații Web Moderne
Cuprins
Introducere
Capitolul 1. Framework-ul ASP.NET MVC
1.1 Model-View-Controller
1.2 Routing
1.3 Action Filters si Data Annotations
Razor View Engine
Security. Authentication.Authorization. Membership.
Deployment
Capitolul 2. MVC vs WebForms
2.1 Prezentare scurta ASP.NET WebForms
2.2 ASP.NET MVC vs ASP.NET Web Forms
Capitolul 3. Librarii externe folosite in dezvoltarea aplicatiei
3.1 Entity Framework
3.2 Twitter bootstrap
3.3 SignalR
3.4 Redis
Capitolul 4. Prezentarea aplicatiei
4.1 Structura aplicatiei
4.2 Scoruri in timp real
4.3 Detalii meci
4.4 Clasamente
4.5 Favorite
4.6 Alte elemente ale aplicatiei
Concluzii
Bibliografie
Tabelă de termeni folosiți:
Lista acronimelor (Abrevieri folosite)
ASP.NET ( Active Server Pages) – ”Instrument de programare pentru crearea paginilor Web dinamice, dezvoltat de Microsoft” (Anghel, Traian, Dictionar de Informatică – Editura Corint, 2010 București)
HTML (Hyper Text Markup Language) – ”limbaj de marcare pentru publicarea textului pe Web”
HTTPS (Hyper Text Transfer Protocol Secure) – ”Set de reguli care guvernează comunicarea dintre serverul Web și client”
MVC (Model-View-Controller) – ”Arhitectură utilizată de cadrele de lucru software (software framework) cu scopul separării datelor(Model) de interfață cu utilizatorul (View), astfel încât schimbările în interfață să nu afecteze datele, iar acestea să poată fi reorganizate fără schimbări în interfață. ”
URL (Uniform Resource Locator) – ”Descriptor care identifică resursele prin intermediul unei reprezentări a mecanismului de acces la aceste”
Lista figurilor
Entity Framework
UI
Browser
ValidateInput
HttpUnauthorizedResult
File Result
EmptyResult
ContentResult
Design Pattern
JavaScriptResult
JsonResult
Markup
antiforgery token
RedirectResult
cached.
Link
task
RedirectToRouteResult
root directory
site
aspx
RouteConstraints
runtime
ValidateAntiForgeryToken
Action Filtres și Data Annotation
pipeline
ActionFilterAttribute
AsyncTimeout
No AsyncTimeout
output
label
exception filters, authorization filters, și result filters
Authorize
Order
Server side
Introducere
Capitolul 1. Framework-ul ASP.NET MVC
Model-View-Controller
ASP:NET MVC este un framework gratuit pentru crearea aplicațiilor Web pe structura Model – View– Controller . Elementul caracteristic al acestui tip de proiectare al aplicației este izolarea operațiilorlogicede interfața cu utilizatorul astfel încât toată atenția trece în a avea o structură cât mai curată a aplicației, dar totodată testarea și mentenanța în timp, să fie cât mai ușoare.
În fiecare aplicație tip ASP.NET MVC, se regăsesc cele trei componenete definitorii: modele, view-uriși controllere. Modelul înglobează toate clasele care se referă la date și operații logice. Procesarea datelor folosind clasele din model este inițiată prin controller-ele care sunt disponibile la cererea utilizatorilor.În momentul în care procesarea datelor se încheie, controller-ul generează un răspuns utilizatorului, prin intemediul viewer-uluicare returnează HTML care este randat în browser.
Model
Modelele din MVC reprezintă părți din aplicație care implementează logica datelor din domeniu. Domeniul modelului poate proveni din generarea de clase ce reprezintă obiecte într-un magazin de date cum ar fi o bază de date. Un exemplu în acest caz sunt clasele de date din Entity Framework .
Un model după șablonul MVC poate fi clasificat fie ca un model de date, fie ca un model de operații logice sau ca un model pentru view-uri. Fiecare dintre aceste modele sunt diferite și specifice datorită scopului bine definit pe care il au. Datelele și modelele de operații logice sunt considerate ca fiind parte din modelul principal.Se consideră că modelul de interfață nu face parte din modelul principal pentru că scopul lui este de a transmite date între controller și interfațăîn ambele sensuri.
Modelul de date – Obiectele din cadrul modelului de date sunt clasele care interacționează cu baza de date. In context normal, se poate considera că modelele de date sunt setul de clase create de instrumente (instrument precum Entity Framework ).Aceste clase pot incepe fie ca tabele deja existente în baza de date, metodă denumită database – first – approach (pornind de la baza de date), fie ca și clase care vor fi utilizate pentru a genera tabelele din cadrul bazei de date metoda denumita code – first – approach (pornind de la clase). În cazul în care se dorește în cadrul aplicației o interacțiune particulară între baze de date, se pot crea în mod manual clase specifice nevoilor aplicației.
Modelul de operații logice – Clasele în cadrul modelului de operații logice implementează funcționaliăți, care reprezintă reguli sau prelucrarea operațiilor logice (un exemplu ar fi determinarea tuturor elevilor cu o anumită particularitate). Ca parte a prelucrării, clasele modelelor de operații logice, pot interacționa cu clasele modelelor de date pentru a prelua sau salva entități în baza de date.
Modelul View (de interfață) – Clasele modelului View furnizează informații trimise de la controllere la view-uri, astfel încât view-ul să știe ce să returneze în browserul utilizatorului. Un exemplu în acest sens, o clasă de model view poate conține informații a produsului care sunt folosite de un view ca să afișeze numele, prețul și imaginea produsului. Funcția unei clase a unui view model este de a stoca date și metadate pentru ca view – ul să poată afișa corect, și nu de a face procesare. Altmoment in care view modelul este folosit este acela în care un utilizator face o cerere dintr-un afisaj anterior.
Views
View – urile sunt elementele vizibile în cadrul aplicației. Acestea sunt cele care arata datele utilizatorilor din cadrul modelului. O pagina view in genere primște un obiect view model de la controller. (Pe view nu îl interesează în ce mod datele au fost obținute, e doar respomsabilitatea controller-ului). Pagina view conține HTML (și cod legat de UI) pentru a determina modul de afișare al modelului de date înapoi în browser. View-urile pot fi cu ușurință scrise. Acest lurcru înseamnă că un view primește view – ul primește ca și parametru un model definit transmis de controller prin intermediul acțiunilor sale. Folosirea view – uri cu cu modele predefinite are mai multe avantaje: IntelliSense, Automatic scaffolding, validare la compilare.
View – urile parțiale sunt parte a HTML – ului care pot fi refolosite în alteview-uri. De exemplu, un view parțial poarte afișa o diagramă creată pe baza unui set de date. Apoi, această diagramă poate fi parte din alte diferite view-uri, dar logica de la baza diagramei va fi stocată în view-ul parțial inițial. Dacă se modifica tipul diagramei inițiale, de la un grafic tip bara într-o diagrama radială, toate view-urilevor afișa graficul deja modificat: diagrama radială.
Controller
Controller-ele sunt clase care au funcționalitatea de a face managementul cererilor și abilitatea de a crea metode de acțiune metode care sunt metode obișnuite ce returnează obiecte tip ActionResult. Există mai multe tipuri de obiecte ActionResult precum view-uri, fișiere, o redirecționare către o alta actiune, etc. Tehnic, un obiect ActionResult reprezintă o comandă pe care framework-ul o va executa în numele acțiunii cerute de utilizator. Clasa ActionResult este clasa de bază pentru toate implementarile specifice rezultatelor returnate de metodele de tip acțiunilor. Urmatoarele clase mostenesc clasa AcțiunResult și pot fi folosite ca rezultat almetodelor de de tip actiune :
View Result. Cea mai întâlnită clasă de tip ActionResult. Se folosește pentru a returna un view cu scopul de a transmite HTML in browser.
PartialViewResult. Este o clasă similară View Result-ului. Aceasta returnează un view parțial.
ContentResult. Este folosită să returneze orice tip de conținut. Implicit, este folosită ca să retuneze text complet, dar tipul de conținut poate fi definit și în mod explicit.
EmptyResult (Rezultat Vid) Această clasă este echivalentul a unei metode vide. Este implicit un obiect rezultat, dar practic nu returneaza nimic.
File Result. Este folosită ca să retuneze un rezultat binar (un exemplu relevant este descărcarea fișierelor).
HttpUnauthorizedResult. Acest tip de obiect se returnează în momentul în care se încearcă accesarea unui conținut cu acces restrâns pentru o anumită categorie de utilizatori. În acees caz, browser-ul va fi redirecționat către o pagină de autentificare a utilizatorului.
JavaScriptResult – Folosit pentru a returna cod de Java Script
JsonResult – folosit pentru a returna un obiect in formatul JavaScript Object Notation.
RedirectResult – folosit pentru a efectua o redirecționare HTTP către un alt URL.
RedirectToRouteResult – folosit pentru a efectua o redirecționare HTTP, dar spre o rută specifică mai degrabă decât câtre un URL.
Routing
Arhitectura tradițională pentru comunicarea web mapează un URL către unfișier fizic din interiorul fișierelor de sistem. Ca exemplu, http://scoreservice.com/leagues/favorites.html tinde să mapeze către un fișier denumit favorites.html, în directorul ~/leagues/ ce se găsește în directorul root, pentru domeniulscoreservice.com. Ca răspuns la o cerere de tip HTTP pentru această resursă, fie se returnează conținutul (ca HTML, exemplul dat mai sus), fie codul asociat unui fișier se execută (de exemplu fișier de tip .aspx).
În cadrul framework-ului MVC, URL-urile sunt mai degrabă mapate în metode specifice care se execută ca răspuns la o cerere de intrare, în general returnând fie un View(MVC), fie un tip de date structurate ce corespund sursei interogate. Așadar, în loc de a fi direcționat spre resursele fizice reale în cadrul unui sistem de fișiere, rutele în MVC, direcționează către o abstracție, către o metodă care returnează elementul solicitat.
Această decuplare a URL-ului de la sistemul de fișiere real, permite programatorilor construcția mai clara, mai simplă a URL-urilor, care sunt mai apropiate utilizatorului, să fie optimizat pentru motorul de căutare, și în teorie mai persistente, ceea ce duce la faptul că URL-urile asociate unui conținut specific sunt mai puțin dispuse la schimbare și a împiedica accesul la viitoarele link-uri.
În MVC, există convenția de a mapa URL-uri spre o anumită acțiune, o metodă pe un controller specific. Acțiunea se execută și de obicei, dar nu întotdeauna va returna o instanță a ActionResult-ului. Clasa ActionResulteste responsabilă pentru logica framework-ului, precum randare de HTML sau JSON, și transmiterea spre HTTP a răspunsului care va fi returnat spre browserul utilizatorului. Cea mai de bază versiune a acestei convenții poate fi un URL de tipul: http://domeniu/numecontroller/numemetoda.
Într-un proiect MVC, convenția este realizată prin înregistrarea șabloanelor derută, care stabilesc modul in care URL-urile vor fi mapate la acțiunile si controllerele specifice. Un proiect specific MVC-ului, definește un fișier Global.asx, care conține o metodă singulară : Application_Start. Această metodă are rolul de a apela diferite metode de configurare pentru a inițializa aplicatia. Unul din aceste apeluri este către metoda clasei RouteConfig, și anume : RegisterRoutes.
Modul de apelare : RouteConfig.RegisterRoutes(RouteTable.Routes)
Clasa implicită MVC RouteConfig presupune:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new
{
controller = "Home",
action = "Index",
id = UrlParameter.Optional
}
);
}
}
Este de subliniat faptul că orice aplicație MVC trebuie să conțină cel puțin o definire de rută pentru a putea funcționa. În exemplul de mai sus, un șablon de rută denumit ”Default” este adăugat coleției de rute rRoutes.
Modul de apelare : RouteConfig.RegisterRoutes(RouteTable.Routes)
Clasa implicită MVC RouteConfig presupune:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new
{
controller = "Home",
action = "Index",
id = UrlParameter.Optional
}
);
}
}
Este de subliniat faptul că orice aplicație MVC trebuie să conțină cel puțin o definire de rută pentru a putea funcționa. În exemplul de mai sus, un șablon de rută denumit ”Default” este adăugat coleției de rute existente. Elementele conținuteînglobează parametrii pentru șablon și sunt reprezentate de denumirea parametrului ca substituent între paranteze. Segmentele de rută sunt separate prin barele oblice. Parametrii rutei pot fi denumiți oricum, totuși ASP.NET recunoaște denumiri specifice a unor parametrii ai rutei, în special ”{controller}” și ”{action}”, și le tratează în mod diferit față de alți parametri ai rutelor.
Când framework-ul de rutare găsește un parametru al rutei denumit ”{controller}”, îi adaugă sufixul ”Controller” valorii parametrulul și apoi scanează proiectul pentru pentru a găsi o clasă cu același nume care de asemenea implementează interfața System.Web.Mvc.IController. Este de remarcat faptul ca în căutarea controllerului cu același nume, nu se ține cont de majuscule.
O dată ce framework-ul a selectat controllerul, acesta încearcă să localizeze acțiunea controllerului care are același nume cu valoarea parametrului ”{action}”. Căutarea numelui este o acțiune ce nu ține cont de majuscule. Dacă există cazul în care mai multe acțiuni au același nume, ca în cazul metodelor multiple supraîncărcate pe același operator, framework-ul va selecta metoda pentru care cei mai mulți parametrii URL se potrivesc cu parametrii metodelor.
De exemplu, dacă aplicația primește solicitarea cu URL-ul http://soccerservice.com/match/details/1 , ruta va găsi și potrivi șablonul implicit. Stringul ”Controller” va fi adăugat segmentului ”match”, și runtime-ul va fi setat pentru a căuta în proiect după o clasă denumita MatchController. Dacă controllerul va fi gasit, MVC va examina atunci controllerul pentru o metodă publică denumită Details. Dacă și această metodă este găsită, MVC va încerca să găsească o metodacare să accepte un singur argument denumit ID, ca apoi să apeleze aceasta metodă.
Rămâne problemelecu ce se va întâmpla în cazul în care va fi nevoie să se trimită mai mult decât un ID ca și argument pentru metoda ”action” dorită sau ce se întâmplă dacă există una sau mai multe suprascrieripentru care se vor să se execute mai multe interogări complexe față de datele existente.
În timp ce se pot include întotdeauna parametrii de interogare ca parte a URL-ului, se poate personaliza și totodată extinde ruta implicită, și exercita un control ceva mai mare asupra modului cum și în ce fel aplicația va accepta înt-o cerere de tip HTTP prin personalizarea rutei.
Constrângerile de rută (route constraints) pot fi folosite pentru a limita în continuare URL-urile care sunt considerate o potrivire pentru o anumită rută. S-a discutat până acum despre rutele care se potriveau bazate pe structura URL-urilor și denumirea parametrilor, RouteConstraints permite adăugarea unor elemente specifice adiționale. Când un string este furnizat ca și constrângere, framework-ul MVCrecunoaște stringul ca și o expresie obișnuită care poate fi utilizată în limitarea modului în care URL-ul poate găsi potrivirea cu o anumită rută. Un scenariu des întâlnit este limitarea valorii parametrului unei rute la o valoare numerică.
routes.MapRoute(
name: "Custom",
url: "leagues/{leagueId}",
defaults: new
{
controller = "Leagues",
action = "Get",
},
new { leagueId = @"\d+" }
);
Action Filtres și Data Annotation
Action Filtres permit o metodă simplă dar totodată puternica de a modifica sau a mari valoarea pipeline-ului MVC din ASP.NET prin ”injectarea” logică în anumite puncte. Logarea în aplicație este un exemplu de preocupare ”cross-cutting” în care se poate aplica în mod egal oricăror componente din cadrul aplicației, indiferent de care este responsabilitatea primară a acelei componente.
Logica ActionFilters este în primul rând introdusă prin aplicarea unui ActionFilterAttributela o acțiune a unui controller cu scopul de a afecta modul în care acțiunea se execută. De exemplu:
[Authorize]
public ActionResult Index()
{
return View();
}
ActionFilters în funcție de task-urile pe care le realizează, sunt clasificate in diferite tipuri. Un ActionFilter este caracterizat printr-o interfață, iar pentru fiecare tip de filtru, interfața va fi specifică. Există ActionFilters speciali care sunt: exception filters (pentru excepții), authorization filters (pentru autorizare), și result filters (pentru rezultate).
Tabel 1.1. –ActionFilters speciali
Framework-ul ASP.NET MVC vine cu câțiva filteri predefiniți precum HandleError, Authorize, sau OutputCache.
Tabel 1.2. – Filters predefiniți
Fiecare metodă tip controller poate fi marcată cu multiple filtre. Prin urmare, ordineain care se parcug aceste filtre este importantă. Toate atributele mentionate în Tabelul 1.2, provin din clasa de bază Filter Attribute, care definește o proprietate numită Order. Calitatea principală a Order-ului este de a impune ordinea de aplicare a atributelor multiple. Implicit, proprietății Order-ului i se atribuie valoarea de -1, ceea ce înseamnă că în acel moment Order-ul este nespecificat. Totuși, orice filter cu order nespecificat va fi executat înaintea unui filtru cu order specificat. Dacă există doua sau mai multe filtre cu acelașiordine în cadrul aceleași metode, va fi aruncată o excepție.
Se pot aplica filtre pentru metodele individuale sau pentru toată clasa controller. Dacă se aplică filtru la clasa controller, aceste filtre vor avea repercursiuni asupra tuturor metodelor action expuse de către controller. Filtrele globale, care sunt inregistrate la pornirea aplicației, se aplică în mod implicit la orice metoda de tip action a oricărei a oricărui controller.
Implicit, filtrul HandleError este în mod global înregistrat în cadrul Global.asax, ceea ce implică unele capacități de tratare a erorilor pentru orice metodă action. Filtrele de tip global sunt filtre simple, care se diferențiază doar prin modul de înregistrare , după cum urmează:
GlobalFilters.Filters.Add(new HandleError());
În cadrul ASP.NET, MVC-ul oferă o gamă variată de filtre predefinite, dar face posibilă totodată și scrierea unei clase proprii. Clasa ActionMethodSelectorAttribute este special creată în acest sens si permite crearea de filtre personalizate. Aceasta moștenește clasa Attribute si oferă posibilitatea de implementare implicită pentru toate interfațele prezentate în cadrul Tabelului 1.1. Un exemplu în acest caz este restricționarea metodei de a fi apelată doar prin Ajax.
Metoda prin care o clasă moștenește ActionMethodSelectorAttribute și suprascrie IsValidForRequest se realizează astfel:
public class AjaxOnlyAttribute : ActionMethodSelectorAttribute
{
public override Boolean IsValidForRequest(ControllerContext context, MethodInfo methodInfo)
{
return context.HttpContext.Request.IsAjaxRequest();
}
}
Folosirea atributului se face astfel:
[AjaxOnly]
public ActionResult Details(int leagueId)
{
var model = …;
return PartialView(model);
}
Daca se încearcă invocarea URL-ului prin intermediul altui tip de request se va returna excepția 404 (Not found).
În cadrul ASP.NET MCV, șabloanele ajutătoare folosesc metadatele asociate cu membrii claselor pentru a putea decide modul in care se afișează sau se editeză datele existente. Metadatele sunt citite cu ajutorul obiectului furnizor specific metadatelor. Furnizorul implicit de metadate ia informații de la atributele adnotării de date. Atributele cele mai frecvent utilizate sunt prezentate în Tabelul 1.3.
Tabelul 1.3. – Atributele adnotării de date cele mai des utilizate
Razor View Engine
Framework-ul de MVC are un design modular și permite intervenția asupra fiecărui modul fie prin înlocuire, fie prin îmbunătățiea și personalizarea celui existent standard. Dintre modulele MVC, cel care prezintă un interes deosebit este view engine-ul (motor de interfață). Un motor de interfață este subsitemul MVC care definește sintaxe si reguli cu scopul de a converti server-side code în HTML markup. Comunitatea a creat cele mai multe motoare de interfață. Unele imită șabloane populare din cadrul altor platforme, iar altele sunt unic create specific pentru ASP.NET.
Fiecare motor de interfață conține trei componente principale funcționale:
Clasa Motorului de Interfață (View engine class) – implementează IViewEngine și oferă un mecanism pentru localizarea șabloanelor intefețelor
Clasa Interfață (View Class) – implementează interfața IView și oferă o metodă de combinarea șablonului cu datele din contextul curent și cu modelul markup de HTML
Șablonul de parcugere a motorului (Template parsing engine) – are rolul de a parcurge șablonul și compilează interfața în cod executabil
În cadrul ASP.NET MVC, cele mai importante motoare de interfață sunt: Razor, ASPX, Spark, Nhami, Ndjango, Hasic, Brail, Bellevue, SharpTiles, StringFormat, Wing Beats, SharpDOM.
Cea mai populară alegere în materie de motoare de interfață este Razor-ul. Se găseste în noile versiuni de Visual Studio si a apărut pentru prima oară inca versiunea 3.0 a framework-ului MVC. Principalele motive pentru care este atât de popular (chiar dacă este un motor de interfață standard) și pentru care este și cel ales de mine sunt următoarele:
Sintaxă simplă: Este compact, expresiv, fluid și ușor de învățat. Poate deduce în mod automat blocuri de cod server-side, fără necesitatea de a le îngloba în mod explicit în caractere speciale.
Suportă C # si VB.NET: blocurile de cod server-side pot fi scris în C# sau chiar Visual Basic
IntelliSense: Visual Studio oferă su suport foarte bun pentru autocompletare
Protecție automată XSS: XSS este o tehnică utilizată de către hackeri pentru a injecta cod în aplicații. Razor are un sistem de securitate împotriva acestui tip de atac prin codificarea codului de tip server-side
Layout: Acesta este un concept similar cu paginile de tip Master ASP.WEB Forms. Acesta vă permite să creați o pagină aspect care conține codul de șabloane care trebuie să fie puse la dispoziție pe un set de pagini.
Testabilitate: Razor parser și motorul de view poate fi instanțiat direct în interiorul unui test (Unit testing) fără a întampina probleme dependințe. Acest lucru poate fi folosit pentru a verifica dacă codul HTML rezultat este cel care trebuie pentru un anumit model.
Multitudine de exemple: majoritatea turorialelor si intrebărilor găsite pe internet se referă la Razor.
Un dezavantaj real al Razor-ului este doar pentru persoanele care au lucrat cu Web Forms, care vor avea nevoie de timp până să prindă subtilitățile lui. Pentru programatorii noi, Razor pare să fie mai ușor de învățat decât WebForms.
Modul de utilizare al Razor View Engine
Pentru a folosi o variabilă în cadrul unui view, se adaugă variabilei simbol: @ in prefix. Un exemplu simplu ar fi afișarea orei si datei curente în interiorul unui control de tip span:
<span>@DateTime.Now</span>
Un alt exemplu ar fi o declarare de tip if-else. Este de subliniat lipsa de delimitare explicită a codului HTML de cel server-side. Parser-ul folosit de Razor este construit astfel încat să determine automat acest lucru:
@if (Model.Match.IsLive)
{
<span>Match is in @Model.Match.Time minute</span>
}
else
{
<span>Match finished</span>
}
În această declarare, nu numai ca parser-ul detectează declararea if-ului, dar este în aceeași masura să recunoască variabilele din controlul <span>.
Exmplu de listare folosind foreach
<ol>
@foreach(var league in Model.Leagues)
{
<li>
Country : @league.Country.Name<br />
Name : @league.Name<br />
</li>
}
</ol>
În acest exemplu, sunt de remarcat etichetele pentru lista neordonată definite separat de foreach, față de datele care se refera la league. Lucrul surprinzător în folosirea Razor-ului cu Visual Studio este că utilizarea InteliSense-ului este similară cu lucrul într-un fișier de tip .cs. Se determinată automat că variabila league a fost de tipul League și automat sugerează membrii disponibili.
HTML Helpers
Framewrkul MVC vine la pachet cu un număr de HTML helpers (metode ce generează cod HTML) care împreună cu anotările, definite in cadrul modelului reduc semnificativ cantitatea de linii de cod scris pentru soluția optimă.
Folosirea HTML Helpers – pentru a simplifica crearea unui formular
@using (Html.BeginForm()) {
@Html.ValidationSummary()
<fieldset>
<legend>Registration Form</legend>
<ol>
<li>
@Html.LabelFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName)
</li>
<li>
@Html.LabelFor(m => m.Email)
@Html.TextBoxFor(m => m.Email)
</li>
<li>
@Html.LabelFor(m => m.Password)
@Html.PasswordFor(m => m.Password)
</li>
<li>
@Html.LabelFor(m => m.ConfirmPassword)
@Html.PasswordFor(m => m.ConfirmPassword)
</li>
</ol>
<input type="submit" value="Register" />
</fieldset>
}
Prima linie de cod al exemplului arată modul de folosire a helper-ului specializat in generarea de formuri.
Helperul @Html.ValidationSummary genereaază codul care afișează rezumatul validării create de jQuery sau validarea executată de controller.
Helperul @Html.LabelFor și helperul @Html.TextBox preiau o expresie lambda ca și parametru. Helperii HTML folosesc reflexia (reflection) pentru a își extrage datele din adnotări care decoreaza RegisterModelul și le combină cu datele conținute în cadrul obiectului trecut în expresie de tip lambda pentru a genera un element din cadrul formului,
Security. Authentication.Authorization. Membership.
Security
Termenul de Security implică o colecție variată de lucruri pentru programatori și utilizatori. În contextul web, securitatea se referă la prevenirea intervențiilor de cod dăunător. Totodată, securitatea se referă la confidențialitatea datelor și la modul de accesare a acestora – prevenirea divulgării datelor private. Nu în ultimul rând, securitatea se referă la construcția aplicației și la modulele acesteia, la care doar utilizatorii ce se autentifică au dreptul de a accesa date.
ASP.NET oferă o gamă largă de mecanisme de autorizare și autentificare implementate în colaborare cu Internet Information Services (IIS), frameworkul oferit de Microsoft.NET, și serviciile de bază a sistemului de operare. IIS și aplicația ASP.NET lucrează într-un mod intregrat astfel încât cererea merge printr-un singur pipeline ce include o etapă de autentificare și încă o etapă opțională de autorizare. Dacă ISS și ASP.NET rulează propriile procese, unele cereri pot fi de autentificare și autorizare la gate-ul IIS-ului, în timp ce alte cereri sunt preluate de ASP.NET împreună cu token-ul de securitate prin IIS al utilizatorului autentificat sau anonim.
Authentification
Autentificarea de tip Windows (Windows Authentication) este mult prea puțin practică în cadrul aplicațiilor de Internet actuale. Acest tip de autentificare este bazat pe conturile de Microsoft Windows și token-urile din NTFS ACL, și de asemenea, se presupune că utilizatorii folosesc dispozitive pe care rulează ca sistem de operare Windowsul. Deși se consideră că este eficient și util în cazul intranetului și câteodată în cazul extranetului, autentificarea în cadrul Windowsului este nerealistă în cele mai comune situații deoarece cei ce folosesc aplicațiile web li se cere să dețină un cont de Windows în domeniu aplicației. Acest tip de autenficare este folosit cel mai des in cazul aplicațiilor dezvoltare cu frameworkul Sharepoint.
Formularele de autentificare (Forms Authentication) sunt cele mai folosite moduri de a aduna și valida credentilalele utilizatorilor.
Atât în ASP.NET MVC cât și în Web Form, mecanismul de autentificare se alege prin definirea sectiunii ”authentification” din fișierul web.config. Implicit, aplicațiile ASP.NET MVC sunt configurate să folosească formularele de autentificare. Următoarea secvență de cod arată un extras din fișierul web.config autogenerat în ASP.NET.MVC.
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
Setat în acest mod, aplicația redirecționează utilizatorul la adresa specifică URL-ului de autentificare de fiecare dată când se încearcă accesarea URL-ului rezervat pentru utilizatori autentificați.
Authorization
Pentru a restricționa accesul la anunite actiuni sau controllere să necesite autentificare, se folosește atributul de Authorize.
[Authorize]
public ActionResult Index()
{
…
}
[Authorize]
public class HomeController
{
public ActionResult Index()
{
…
}
…
}
ASP.NET MVC oferă un alt atribut legat de securitate numit AllowAnonymous. Când se aplică unei metode sau controller, el specifică runtime-ul ASP.MVC-ului ca acesta să permită trecerea daca utilizatorul nu este autentificat. AllowAnonymous este la îndemână atunci când se aplică Authorize la controller-ului și dar se dorește accesul liber la anumite metode.
Totuși atributul Authorize nu se limitează la autentificare. El miai suportă o formă de bază a autorizării. Orice metodă marcată cu acest atribut poate fi executată doar de utilizatorii autentificaț. Astfel, se poate restricționa accesul la un anumit set de utilizatori autentificați cu un rol dat. Se poate realiza acest lucru prin adăugarea unui cuplu de parametrii:
[Authorize(Roles="admin", Users="user1, user2")]
public ActionResult Index()
{
…
}
Atributul Authorize previne accesarea metodelor de către un utilizator neautentificat sau un utizator fără rolurile necesare și rezultatul este redirecționarea către pagina de login. În exemplul de mai sus, doar utilizatorii user1 sau user2 pot avea acces la metoda (daca au rolul de adimistrator – Admin ). Este de reținut că utilizatorii și rolurile, în cazul în care sunt specificate, sunt combinate într-o operație de tip logic denumită AND.
Membership
Pentru a autentifica un utilizator este nevoie de un sistem gestionarea a membrilor care furnizează metode prin care se pot gestiona conturile utilizatorilor. Crearea unui sistem de membership implică scrierea unui modul pentru crearea unui utilizator și actualizarea sau ștergerea utilizatorilor existenți. Totodată necesită cod pentru editarea oricărei informații atribuite unui utilizator, precum parola, adresa de email, sau rolurile.
Minimul impus presupune existența unui controller care să știe să conecteze utilizatori și să-i deconecteze. Următorul exemplu conține o clasă denumită AuthController. Următoarea secvență de cod prelucrează controllerul AuthController creat de Visual Studio pentru ASP.NET MVC.
public class AuthController : Controller
{
[HttpGet]
public ActionResult Logon()
{
// Just displays the login view
return View();
}
[HttpPost]
public ActionResult Logon(LogonViewModel model, String returnUrl)
{
// Gets posted credentials and proceeds with
// actual validation
…
}
public ActionResult Logoff(String defaultAction="Index",
String defaultController="Home")
{
// Logs out and redirects to the home page
FormsAuthentication.SignOut();
return RedirectToAction(defaultAction, defaultController);
}
}
Actiunea de Logon trebuie divizată în două: o acțiune pentru afisarea paginii de logon si o acțiune pentru validarea datelor introduse de utilizator. Acțiunea de Logoff deconectează utilizatorul din aplicație și redirecționează spre o pagină specificată : aici pagina de start a aplicației. Pentru partea de deconectare a utilizatorului, se folosește serviciile de autentificare native a ASP.NET.
Având ca punct central clasa de Membership statică, membershipul ASP.NET-ului protejează de detalii de modul in care acreditările și alte informații ale utilizatorului sunt preluate și comparate. Clasa Memberschipului nu conține în mod direct nici o logicp cu privire la metodele expuse. Actuala logică este dată de componenta furnizor.
Selectarea membershipului în fișierul de configurare ASP.NET vine o dată cu un set de furnizori predefiniți care vizează fișierele de tip MDS in cadrul Microsoft SQL Server Express și Active Directory. Totuși, nu este neobișnuit ca programatorul să sfârșească prin a crea un furnizor de membership propriu astfel încât să se refolosească orice magazin existemt cu datele utilizatorilor și să fie în control în cadrul structuii de inmagazinare a datelor.
Definirea unui furnizor membership customizat nu este o operațiune dificilă. Metoda prin care se obține este prin derivarea unei clase noi în cadrul MembershipProvider și suprascrierea tuturor metodelor abstracte. La nivelul minimal, se suprascriu metode precul ValidateUser, GetUser, CreateUser și ChangePassword.
Membershipul API implicit a fost criticat pentru că este neclar și ăn neconcordanță cu Interface Segregation Principle – he “I” principle in the popular SOLID acronym (which stands for Single responsibility, Open-closed, Liskov substitution, Interface segregation and Dependency inversion principle) Membershipul API încearcă să acopăere un numar de situații rezonabil și probabil că este prea complex și nenecesar îmbunătățit pentru cele mai înâlnite situații actuale. Creând un furnizor membership customizat poate ajuta, dar nu va rezolva problema în întregime, deoarece acesta va construi doar o fațadă simplă.
Dacă nu se dorește crearea propriului nivel de membership de la zero, există o soluție de mijloc care presupune folosirea SimpleMembership API, ce sunt disponibile initial în ASP.NET Web Pages.
SimpleMembershipul API este doar un înveliș în partea de sus a membershipul ASP.NET API și a magazinului de date. Cu acest membership, se poate lucra cu orice magazin de date care este la îndemână, și necesita doar indicarea coloanei de operare ca și numele utilizatorului sau ID-ul acestuia.
Rolurile in ASP.NET ajută la implementarea aplicației care impune autorizare. Rolul este doar un atribut logic pe care orice utilizator il are atribuit. Un ASP.NET rol este un string care face referire la un rol logic pe care utilizatorul îl ocupă în contextul aplicației. Din punct de vedere al configurației, fiecărui utilizator i se pot desemna unul sau mai multe roluri. ASP.NET caută rolurile utilizatorilor curenți și desemnează informația unui obiect de tip utilizator. Pentru a gestiona informațiile referitoare la rolurile utizatorilor ASP.NET foloseste un sistem de furnizare a rolurilor (RoleProvider).
Gestionarea rolurilor se face prin intermediul unei clase care moștenește clasa RoleProvider. Modul de funcționare a unui role provider nu diferă cu mult față de un furnizor de membership și , de asemena, au aceleasi probleme complexe.
Deployment
Se poate petrece mult timp folosind ASP.NET MVC pentru a construi un website, dar acesta nu va servi nimanui până în momentul în care nu va fi găzduit de un server webastfel încât utilizatorii să aibă acces real la el. Termenul de Deployment desemnează acțiunea de a copia websiteul creat pe un server web și deschiderea acestuia spre folosirea de către utilizatori.
La nivel înalt. Se cunosc trei tipuri de dependințe pe care majoritatea aplicațiilor web le au, și anume: asamblurile de tip .NET și diversele fișiere care conțin partea logică pentru site, orice conținut customizat (de exemplu fișiere JavaScript sau CSS) pe care se bazează siteul, și orice tip de dependințe externe tipn runtime pe care websiteul le cere(de exemplu servicii externe sau baze de date).
Minim, fiecare aplicație ASP.NET trebuie șă conțină și un dosar binar care să conțină ansamblurile cu codul compilat(verificat?)și alte ansambluri .NET de care aplicația depinde. Deci, dosarul /bin ? este o parte esențială a oricărei strategii de dezvoltare a aplicatiei web tip ASP.NET. Mai există diverse alte fișiere considerate speciale, dar care nu sunt in totalitate cerute pentru buna funcționare a siteului, dar care de multe ori conțin informații importante ca și configurarea siteului. Aceste fișiere (pot fi fișiere ca și web.config sau global.asax) trebuie de cele mai multe ori incluse adițional față de dosarul /bin de care se amintea.
Adițional ansamblurilor aplicației, în dosarul /bin și în orice fișier special ce are legătură cu ASP.NET, aplicațiile web tip ASP.NET MVC trebuie să conțină copii locale a tuturor viewurilor, împreună cu restul conținutului deployed?
Conținutul static se poate referi la orice fel de fișier, dar majoritatea acestor fișiere vor fi fișiere de Java Script, CSS stylesheet? și imagini ce assigură partea de logică a clientului în aplicație și partea de design. Aceste fișiere se pot găsi în orice parte a dosarului structurii, dar se recomandă o structură de trei dosare ce conțin toate fișierele statice de care are nevoie siteul.?? (Although these files can technically live anywhere in your site’s folder structure, the default ASP.NET MVC project templates create the /Scripts, /Images, and /Content folders for you to place all of your JavaScript files and other content in. Therefore, if you use this out-of-the-box convention, these three folders will contain all of your site’s static content.)
Partea de deployment nu include nici un fișier de cod sursă care definește logica aplicației. Din moment ce proiectul este compilat înaintea facerii deployului , aceste coduri sursă sunt deja incluse în deploymentsub formă de ansambluri ale apilcației elaborate ? în directorul /bin. În funcție de aceasta, se poate crea orice fel de structură a directorului pentru că aceste dosare nu vor deveni pare a aplicației dupa deployment?.
Probabil cea mai folosită ASP.NET MVC aplicație implică crearea și configurarea unui site web folosind Internet Informatio Server (IIS)
O dată ce aplicația este creată și configurată în IIS, se pot folosi câteva tehnici de deploymentȘ la profilul publicat, se poate zica un dosar local, un server FTP, sau un web deploy care încarcă fișierele direct la aplicația IIS pe server și cele mai nouă opțiune este aceea de a îl publica direct într-un spațiu de găzduire –Azure.
Capitolul 2. MVC vs WebForms
2.1. Prezentare scurta ASP.NET WebForms
ASP.NET WebFOrms este o parte a frameworkului aplicației web tip ASP.NET și este inclus în Visual Studio. Este unul din cele patru modelel de programare folosite în crearea aplicațiilor web tip ASP.NET. Celălalte trei modele sunt: ASP.NET MVC, ASP.NET Web Pages și ASP.NET Page Application.
Web forms sunt pagini pentru care utilizatorii solicită folosirea browserului. Aceste pagini pot fi scrise prin folosirea combianției de HTMP, client-script, server controls și codul de server (server cod). Când utișizatorii solicită o pagina, se compilează li se execută pe server prin framework. Apoi, frameworkul generează maecarea HTML-ului astfel încât browserul să poată randa. O pagină ASP.NET web Form prezintă informații către utilizatori în orice browser sau dispozitiv.
Caracteristici ale ASP.Net Web Forms
Principale caracteristici care ajută în crearea unei aplicații cât mai complexe cu un specificât cât mai mare sunt:
Server Controls – ASP.Net Web Server controls sunt obiecte de ASP.NET Web pages care rulează când pagina este solicitată și markupul este randat în browser. Multe Web server controls sunt similare cu elemente ale familiei HTML cum sunt butoanele sau casetele de text. Alte controale cuprind un comportament complex, precum un control calendar și control care se poate folosi pentru a se conecta la sursa de date sau la datele de afișare.
Master Pages – Paginile master a ASP.NET permit crearea unui consistent layout pentru paginile din aplicație. O singură pagină master definește modul în care arată, modul în care se simte? Și comportamentul standard care se vrea în cadrul tuturor paginilor aplicației. Se pot crea în plus pagini individuale care să conțină particularitățile. Când utilizatorii solicită conținutul paginilor. Ei fuzioneazp cu pagina master pentru a produce pagina de ieșire ? care combină layoutul paginii master cu conținutul paginii curente.
Working with Data – ASP.Net oferă mai multe opțiuni pentru sticarea, recuperare și afișarea datelor. Într-o aplicație de tip ASP.NET Wb Forms, se folosesc controale data-bound în automatizarea prezentării sau introducerea de date în elemente ale paginii web tip UI precum tabele și casete de text și liste derulante.
Membershipul – ASP.NET Identify stochează acreditările utilizatorilor într=o bază de date creată prin aplicație. Când utilizatorii se autentifică, aplicația validează acreditările prin parcurgerea bazei de date. Dosarul din cadrul proiectului Account? conține fișierele care implementează părțile vartiabole alea membershipului :înregistrarea, logarea(autentificarea), schimbarea parolei, și autorizarea accesului. Adițional, ASP.NET Web Form suportă Oauth și OpenID. Aceste îmbunătățiri ale autenficării permit utilizatorilor să se autentifice în aplicatia web creată prin intermediul conturilor făcute pe Facebook, Twitter, Windows Live și Google. Implicit, șablonul crează in o bază de date membership utilizând numele bazei de date standard într-o instanță a SQL Server Ecpress LocalDB, serverul bazei de date dezvoltat care vine la pachet cu Visual Studio Express 2013 pentru Web.
Clinet Script și Client Frameworks – se pot îmbunătăți caracteristicile bazate pe server ale ASP.NET-ului prin includerea funcționalității client-scriptului în paginile de tip ASP.NET Web Form . Se poate folosi client-scriptul pentru a oferi o interfață mai prietenoasă și mai generoasă utilizatorului. Client scriptul mai poate fi folosit la efectuarea apelurilor asincrone pre serverul web cât timp pagina rulează în browser.
Routing – Routing URL permite configurarea aplicației astfel încât astfel încât să poată accepta cereare URL-urilor care să nu mapeze? la fișierele propriu-zise. O cerere URL este pur și simplu URL-ul cu care un utilizator intra in browserul lui ca să gasească o pagină de website. Routingul se folosește pentru a defini URLurile care sunt din punct de vedere semantic semnificative pentru utilizatori și asta poate ajuta cu motorul de căutare optimizat (Search Engine Optimization – SEO)
State Management – ASP.NET Web Forms includ mai multe opțiuni care ajută programatorul să păstreze datele atât în cadrul bazei paginii cât și în aplicație la o scară mai mare.
Security – O parte importantă a dezvoltării unei aplicații mai sigure se face prin înțelegerea anenițărilor asupra aplicației. Microsoft a dezvoltat un mod de a clasifica amenințările: Spoofing (actul de trimitere nelegitimă a unui pachet de așteptare ) , Tampering (manipulare), Repudation(repudiere), Information disclosure (dezvăluirea de informații), Denial of service (refuzul, blocarea serviciului) și Elevation of privilege (STRIDE – caz în care un utilizator mai cu un privilegiu mai scăzut sau aplicația accesează funcții sau conținut destinat unui utilizator cu privilegii mai mari) . În cadrul ASP.NET Web Forms, programatorul poate adăuga extensii sau configura opțiuni care permit customizarea diferitelor tipuri de comportamente în securitate?
Performance – Aceasta poate fi un factor cheie pentru un proiect web de succes. ASP.NET Web Forms permite modificarea performanțelor legate de pagină și procesarea controlului serverului ? , managementul de stare?, accesul datelor, configurarea și încărcarea aplicației și practicilor de codare eficientă.
Internationalization – ASP.NET Web Forms permite crearea unei pagini web care poate obține conținutul și alte date, bazându-se pe setarea limbii pentru browser sau bazându-se pe alegerea explicită a limbii de către utilizator. La conținut și alte date se face referire ca fiind resurse și datele cu acest statut pot fi stocate în fișiere resursă sau alte surse. În pagina de tip ASP.NET Web Forms, se configurează control? Pentru a primi valoarea propriu-zisă a resursei. În timpul execuției, expresia resursei este inlocuită cu resursa compatibilă din fișierul resursă localizat
Debugging și Eror Handling – ASP.NET include îmbunătățiri care ajută la diagnosticarea problemelor care pot apărea în aplicația Web Form. Acestea fac ca aplicația să compileze și să ruleze eficient.
Deployment și Hosting – Visual Studio, ASP.NET, Azure și IIS oferă intrumente care să ajute programatorul cu procesl de deploy și hosting(găzduire) a aplicației Web Form.
2.2. Comparație între ASP.NET MVC și ASP.NET ca si forme web
Orice formă tehnologică are plusuri și minusuri, puncte forte și puncte tarii care necesită înbunătățiri. Aici ne propunem să analizăm într-un mod obiectiv și să comparăm pe cele două mai sus menționate.
Avantajele Web Forms:
În cazul ASP.NET numărul lucrătorilor din domeniu este mai mare, astfel optarea pentru acest sistem este recomdabilă dacă se urmărește să se formeze o nouă echipă sau să se extindă una mai veche. În cazul MVC Framework acest lucru este mai anevoios.
Model de programare familiar: modelul de programare care presupune tragerea componentelor UI (user interface) pe suprafața de lucru si utilizarea unui dublu click pe ele pentru a implementa event handler, va fi cunoscută utilizatorilor de Visual Basic
Este nevoie doar de cunoștiințe de bază de HTML sau Java Script. Majoritatea detaliilor sofisticate sunt camuflate de interfață.
Beneficiază de o librarie extinsă de componete UserInterface numite „controls” orice componetă din meniuri se poate integra foarte usor in aplicatie (printr-un simplu drag and dropp)
Componeta de creare a elementelor de control pentru utilizator este foarte simplu de utilizat
Controalele de validare vă permite să creați formulare user-friendly, care a să asigure că datele introduse de utilizator sunt corecte înainte depunerii formuarului pe srever. Dacă utilizatorul este un bot non-uman sau un om care a dezactivat intenționat JavaScript pentru a ocoli formularulvalidare, controalele de validare verifică automat intrarea pe server.
Furnizorii Sitemap pot fi cuplați cu un control breadcrumb care generează automat navigarea de nivel secund pentru site-ul respectiv
Procedeul Code-behind-pages separă codul C# de logica de prezentare
ASP.NET Ajax permite o experiență modernă client-side menținând în același timp nivelul de abstractizare furnizate de Web Forms.
Dezavantaje Web Forms:
Programatorii care folosesc acest procedeu apartin generatiei trecute, la fel si calitățile lor. Deși poate fi adevărat că oameni care cunosc sintaxa și cadru MVC și Razor sunt mai greu de găsit decât cei care cunosc Web Forms, pe de altă parte, dacă sunteți încercarea de a crea o experiență de utilizare în stare proaspătă, competențele Web Forms nu sunt ceea ce cautați. Oamenii care creează experiența web de ultimă generație au îmbrățișat Web-ul, cunosc HTML, iubesc JavaScript , și pot folosi CSS ca panza lor virtuală. Pentru acest urmatoarea generatie de dezvoltatori web, abstractizarea Web este un lucru strain si neplăcut. Cadrul MVC, pe de altă parte, rezultatul HTML curat și model de programare failiară, care este similar cu alte cadre populare, cum ar fi Rails și Yii, va avea o tranziție mai naturală.
Comenzile ASP.NET nu sunt la fel de eficiente ca și bibliotecile client-side moderne. Marile biblioteci de widget-uri UI care vin impreună cu Web Forms, care păreau foarte eficiente acum cațiva ani isi pierd din pocularitate. Bibliotecile JavaScript UI, sunt disponibile în mod liber de jQuerysau alte surse, sunt pur și simplu mai bune decât ceea ce este disponibil in ASP.NET. Ei randează mai repede, nu se bazează pe temutul statut ASP.NET, și sunt frumoase. În timp ce multe dintre controalele au fost actualizate în cea mai recentă versiune de ASP.NET, cele mai multe dintre ele încă mai folosesc tehnici depreciate, cum ar fi utilizarea tabelelor HTML pentru layout-uri. Ele sunt atat de dificile încât este aproape imposibil să programăm dinspre codul de client-side.
validarea ASP.NET controlează mai putin eficient decât cadrele client-side: ASP.NET
Controalele de validare prezintă încă un avantaj asupra componentelor alternative de validare client-side, în care se validează pe server atât partea de intrare, precum și partea de client. Cu toate acestea, dacă utilizați practici precum protejarea codului back-end de inserții-injecții SQL și atacurile Cross Site Scripting, validarea server-side nu este la fel de critică. Pe de altă parte, biblioteci client-side, cum ar fi jQuery si plug-in-urile de validare, sunt foarte puternice, flexibile și ușor de utilizat. Acesta oferă 19 de metode de validare integrate, comparativ cu cinci în cazul ASP.NET Web Forms. JQuery plug-in este oarecum ușor să se extindă, în timp ce crearea de validatoare personalizate în Web Forms poate fi o sarcină greoaie si elementele sunt dificil de depanat. În plus, marcajul necesar aplicarii validarii unei forme folosind comenzile de validare ASP.NET este un procedeu este greoi și face HTML –ul dificil de citit. Această problemă este agravată dacă se utilizează ASP.NET Ajax si extensii de validare toolkit. Listarea 2-1 prezintă o formă simplă de validare folosing controale de validare ASP.NET.
Avantaje MVC
• Separarea netă a preocupărilor.
• Control deplin asupra HTML.
• Testabil în totalitate / poate utiliza TDD.
• Ușurință în a recrea REST API.
• Poate folosi orice interfață de utilizare cadru JavaScript.
• Curățați HTML, nu de stat vedere sau postback evenimente.
• cadru extensbil ce prezintă multe oportunități pentru dezvoltatori terți de a deyvolta framework-ul de bază.
• asa numitele schele integrate permit crearea rapidă a formularelor de introducere a datelor si intertinererea acestora la fel de usoară. Oferă un singur punct de întreținere atunci când este utilizat în legătură cu Cadrul Entitate.
Dezavantaje MVC
• Dacă veniți din Web Forms, este necesar un efort de învățare substanțial asociat cu trecerea la MVC, iar invățarea sub presiunea timpului a unei tehnologii noi este desigur dificil si inconfortabil.
• Codul MVC separă codul care produce o pagină (web) într-un minim de trei fișiere. Dacă nu luați în calcul faptul de a face testare per unitate, și nu agreați codatul în HTML, MVC nu poate fi cea mai buna alegere
• Nu există meniuri drag-and-drop pentru crearea de formulare: Dacă utilizați Cadrul MVC, va terbui să codați manula in HTML. De fapt, Visual Studio nu oferă nici un designer vizual pentru MVC atunci când se utilizează motorul vedere Razor.
Capitolul 3 – Entity Framework
Entity Framework e modul strategic de abordare a Microsoft în ceea ce priveste tehnologia “data access” (de accesare a datelor) pentru construirea aplicatiilor sotware. E vorba de Object Relational Mapping (ORM) ce permite ca developerii aplicaților să poată lucra cu date relaționale ca și modele de business. Spre deosebire de tehnologiile anterioare de “data access”, Entry Framework, cuplat cu Visual Studio, pot să ofere un fel de ecosystem mult mai complex, bazat pe modele și care permite astfel dezvoltarea unei game mult mai variate de aplicații data-orientate, inclusiv desktop, Internet, cloud și de asemanaea aplicații bazate pe servicii (service-based).Entity framework, cuplat cu Language – Integrated Query (LINQ) framework, ambele din cadrul Microsoft, ne oferă posibilitatea de a aborda în mod direct problemele de nepotrivire/neconcordanță.
Folosind Entity Framework, putem modela clase de entitate pentru aplicația noastra pe o suprafață de design sau direct în cod. Apoi putem modela relații (asociații) între aceste entitați. În codul nostru vom construi interogări LINQ pentru a programa împotriva acestor entități și a asociațiilor. LINQ ne permite să exprimăm direct seturile de baze de date relaționale în cod în timp ce lucrăm în tipuri de entități și asociații. . Toate acestea contribuie la eficientizarea experienței de development, reducând efortul în general. În loc de a coda mari cantități redundante de construcții “data-access” de tipul ADO.NET, ne putem exprima nevoia de date în simple interogari LINQ. În loc de a programa împotriva schemei unei baze de date foarte normalizate, vom coda împotriva claselor de entități. Entity Framework cartografiază clasele de entități până la baza de date fundamentală. Entity Framework e o tehnologie cu o puternică concentrare asupra modelării. În timp ce se modelează cu Entity Framwork, se pot observa o serie de marker genetici cunoscuți de la tehnologii și modele anterioare. De exemplu, se poate observa fără îndoială o asemanare cu diagramele de realții de entitate precum și modul de abordare stratificat, adoptat pe scară largă, sub forma de design conceptual, logic și fizic. Modelul care se creează în Entity Framework e caracterizat printr-o construcție numită Entitity Data Model (EDM) care permite codarea împotriva unor clase de entități puternic tipizate, nu schema de bază de date și obiecte. Entity Data Model permite customizarea mapărilor între clase de entități și tabele de baze de date, pentru a trece dincolo de metoda clasică de mapare unul la unul sau maparea clasa-tabel.Entity Data Model constă din trei straturi separate: cel conceptual, de stocare și de mapare/ cartografiere. Fiecare layer e decuplat de restul.
Clasele de entități sunt conținute în stratul (layerul) conceptual al Entity Data Model. Acest layer e acela în care lucrează developerii și orice părti interesate de proiect. În funcție de modul în care e implementat Entity Framework, stratul ( layerul) conceptual poate fi modelat cu un designer sau din cod. Odată ce se face această decizie, se poate demonta modelul de la o bază de date existentă, realizandu-se o pârghie pentru designer și cantitatea enorma de scule / tool-uri ce odata cu Entity Framework sau se poate crea modelul cu cod si să se permit apoi ca Entity Framework să genereze o bază de date. Sintaxa pentru layer-ul conceptual e definită în Conceptul Schema Definition Language (CSDL)
Fiecare aplicație utilă trebuie să coreleze obiecte la un mod de stocare a datelor. Layer-ul de stocare a Entity Data Model definește tabele, coloane, relații si tipuri de date ce fac legătura cu baze de date fundamentală. Store Schema Definition Language (SSDL) definește sintaxa pentru modelul de stocare.În final, layer-ele de mapping definesc modul de corelare între leyerul conceptual și cel de stocare. Printre alte lucruri, acest layer definește modul în care proprietăți ale claselor de entități se corelează cu coloanele din tabelele bazelor de date. Acest layer e expus developerilor prin fereastra de Mapping Details conținute în proiectantul Entity Framework sau în adnotările de date și API fluent dacă se alege o abordare bazată pe cod.
Entity Framework pune la dispoziție un support pentru stiluri și scenarii diferite de developare. Se știe că Entity Framework operează pe EDM și permite crearea acestui EDM în trei moduri:
Printr-o abordare Database First, principalul beneficiu care îl au developerii este faptul că dacă baza de date e creată, ei vor petrece foarte puțin timp scriind layer-ul de “data access” (accesare date). EDM poate fi creat de la baza de date și apoi se poate modifica în funcție de cerințele aplicației; layerul de “data access” (accesare date) e astfel pregătit de utilizare. Pot exista câteva scenarii unde bordarea Database First este extrem de utilă:
Când se lucrează cu o bază de date moștenită
Când se lucrează într-o ipostaza unde designul bazei de date e realizat de o altă echipă de
Cănd se lucrează asupra unei aplicații centrate pe date, astfel că domeniul de aplicație al DBA și odată ce baza de date e pregatită, începe dezvoltarea aplicației.modelului e însăși baza de date ce este astfel schimbată în mod frecvent pentru a satisfice mereu nolori cerințe. De exemplu, dacă tabelul e updatat in mod regulat și sunt adăugate în mod frecvent noi coloane, atunci se poate folosi cu usurință această abordare și codul de aplicație nu va ceda. În mod simplu, e nevoie de a scrie codul astfel încat să coreleze noile coloane adăugate.
Abordarea Code First e de obicei folositoare atunci când toată logica business, e implementată sub formă de clase iar baza de date e pur și simplu folosită ca un mecanism persistent pentru aceste modele. Aici sunt câteva motive pentru care s-ar putea alege abordarea Code First:
– Baza de date e pur și simplu un mechanism persistent pentru modele, astfel ca nu există o
– Control total asupra codului – astfel că nu există modele auto-generate sau cod de context
– Baza de date nu se va schimba manual. Clasele de model se vor schimba mereu si bazându-logică anume în baza de datese pe asta, baza de date ar trebui să se schimbe de la sine.Similar cu abordarea Data First, în abordarea Model First, vom ajunge în cele din urmă, cu EDM. Folosind EDM, putem crea propriul model conceptual și baza de date. Singurul motiv pentru care se alege abordarea Model First e când se dorește neapărat utilizarea de Visual Entity Designer. Nu există un alt motiv concret pentru a alege această metodă în detrimental celorlalte două.Clasa de arbitru central Object Context, permite realizarea diferitor operatiuni asupra entitaților. Object Context este obiectul principal din Entity Framework. Este clasa ce e responsabilă pentru: managementul conexiunilor bazei de date, presupune un support pentru a putea realiza operații CRUD, ține evidența modificărilor din modele astfel încat modele pot și updatate în baza de date.Există o altă clasă, DbContext, care e foarte asemănătoare cu clasa Object Context. De fapt clasa Db Context e doar un fel de ambalaj deasupra clasei Object Context. Este mai degraba un tip API mai recent și pune la dispoziție un mult mai bun API pentru managementul conexiunilor din baza de date și pentru a realiza operații CRUD.
Ulterior in Listing 2-3, creăm obiectul Db Context necesar pentru prima abordare First Code. Se observă ca în metoda OnModelCreating se mapează în mod explicit proprietatea SalaryId ca și primary key pentru AssociateSalary. Când folosim First Code, dacă o proprietate are numele Id sau <table name>Id. Entity Framework prespune că acesta este primary key-ul al tabelului. Altfel, trebuie specificat key-ul care în exemplul de mai jos:
Language- Integrated Query (LINQ) este o tehnică pentru interogarea datelor din limbajele .NET. LINQ to Entities este mecanismul care facilitează utilizarea LINQ pentru a scrie interogări asupra modelului
conceptual precum Data Model Entity.Când utilizăm LINQ to Entities pentru a executa interograri LINQ asupra Entity Data Model, aceste interogări LINQ sunt compilate întâi pentru a determina ce fel de date se doresc a fi căutate. Va fi apoi executat iar din perspectiva aplicației, rezultatele vor fi returnate sub formă de obiecte CLR, ceea ce .NET întelege.Efectuarea operatiunilor CRUD utilizând Entity Framework și LINQ:
-Pentru a crea un obiect al clasei DbContext:
-Pentru a relua o colecție de intrări
-pentru a relua o colecție de intrări ce îndeplinesc o condiție
-pentru a găsi un articol prin adăugarea valorilor cheie, utilizând funcția Find.
-pentru a găsi un articol prin utilizarea unei valori non-cheie utilizând funcția FirstOrDefault
-pentru a insera sau pentru a Șterge un articol.
IQueryable oferă funcții de evaluare a interogărilor asupra unei surse specifice de date atunci când tipul de date nu este specificat.Ienumerable spune un enumerator, care poate suporta o simplă iterație asupra unei colecții non-generice În timp ce se utilizează LINQ to Entities, este important să întelegem cand să folosim IEnumerable și IQueryable. Daca utilizăm IEnumerable, interogarea va fi executată imediat. Daca utilizăm IQueryable, interogarea va fi amânată până când aplicația va cere o enumerare.
3.2 Bootstrap.
Bootstrap este de departe cel mai popular framework pentru abilitarea și potențarea unul web design de front. Cu Versiunea 3, Bootstrap ajunge la o nouă etapa, introducănd un grid mobile-first receptiv, nui și mai puternic LESS mixins și o baza de cod svelta optimizată pentru browerele moderne.Motivul principal pentru a avea un bun freamwork CSS este pentru facilitățile din procesul de developare. Sunt multe sarcini comune pe care orice designer web le implementează în timp ce dezvoltă o pagină web. Sarcini precum curătarea setărilor din browser creearea unui sistem potrivit de grid pentru layoutul paginii web și atribuirea de reguli de tipografie poate deveni frustrant și să consume mult timp mai ales daca va fi facut pentru fiecare proiect în parte. Un CSS framework bun, pune la dispoziție un set de tool-uri / utilitati puternice/ de effect care facilitează aceste sarcini. Un web design sensibil, permite developerilor să ceereze o pagină web care permite schimbarea layoutului pe parcurs. Dezvoltatorii pot apoi crea un singur design care funcționează pe orice tip de dispozitiv: mobil, tablet, smart TV si PC-uri. Siteurile cu un design sensibil sunt in general designuri fluide. Se reajusteaza singure în funcție de mărimea ecranului în care sunt înfățisște și sunt de asemenea compatibile cu interfațe “touch” a dispozitivelor mobile. Utilizând un design sensibil , developerii pot crea aplicații web puternice care să înlocuiască aplicațiile native de pe platforme precum iOS, Android sau Windows Phone.
Una din cele mai importante caracterisitici ale Bootstrap este sistemul de grid, care permite găzduirea în mod corespunzator a conținutului site-ului. Împarte ecranul în mai multe rânduri și coloane care pot fi folosite pentru a crea diferite tipuri de layout. Odată ce avem rândurile și coloanele definite, se poate decide ce element HTML , unde va fi plasat. Sistemul de grid Bootstrap împarte ecranul în coloane – pana la 12 în fiecare rând. Latimea coloanelor variază în funcție de dimensiunea ecranului în care sunt afișate. Prin urmare, sistemul de grid Bootstrap e unul sensibil, din moment ce coloanele își modifică dimensiunea atunci cand dimensiunea ferestrei de browser se modifică. Se poate crea un număr infinit de rânduri în funcție de cerințele de design. Intersecția acestor randuri și coloane creează un grid dreptunghiular ce afisează conținutul site-ului. Pentru această caracteristică Bootstrap profită de Media Queries pentru a defini în mod corespunzător regulile CSS și pentru a deveni un framework receptiv.Bootstrap pune la dispoziție un toolkit de componente flexibile care pot fi utilizate în designul aplicațiilor de interfață, cracteristici web și multe altele. Toate plugin-urile sunt disponibile într-un fișier separat JavaScript, sau se poate folosi optiunea de customizare a Bootstrap pentru a alege plugin-uri. Cele mai importante componente sunt DropdownMenus, Options, Buttons, Navigation Elements, Forms, Breadcrumbs.
3.3 SignalR
SignalR este un framework care facilitează construirea de aplicații interactive, multiuser și real-time web, desktop sau de mobil, folosește în mod excesiv tehnicile de asincronie pentru a atinge o performanță maximă și imediată.SignalR se poate izola de detalii low-level și dă impresia că ar lucra pentru o conexiune permanent deschisă și persistentă. Pentru a îndeplini asa ceva, SignalR conține componenete specifice ambelor moduri de comunicare, care vor facilita livrarea și recepția mesajului în timp real.
Într-un mod ce e transparent pentru developer, SignalR este responsabil de a determina care e cea mai bună metodă existentă atat în cazul clientului cât și al serverului (Long Polling, Forever Frame, Websocket) si o utilizeaza pentru a crea o conexiune fundamental si pentru a o mentiune deschisa in mod continuu, de asemenea poate să gestioneze în mod automat, deconexiuni și reconexiuni atunci când este cazul.
SignalR de asemenea include un mecanism de mesagerie capabil de a gestiona transmisiile și recepțiile de date între server și clienții conectați la server. Aceasta se intamplă atunci cand serverul este capabil sa urmarească clienții și să le detecteze conexiunile și deconexiunile și va avea de asemenea mecanisme pentru a trimite usor mesaje catre toti clienții conectați sau poate doar o parte dintre aceștia.SignalR Hubs API permite realizarea de apeluri procedurale (RPCs) de la un server la clienții conectați și de la client la server. În cod de server, se definesc metodele care pot fi apelate de client și apoi se apelează metodele ce sunt rulate pe client. În codul client, se definesc metode care pot fi apelate de la server și se apelează metode ce rulează pe server. Signal R se coupă de toate lucrările de “instalație” între client și server.
3.4 Redis
Redis e o bază de date “in-memory” de la distantă care oferă o înaltă performanță, replicare, și un model unic de date pentru a produce o platformă pentru rezolvarea problemelor. Prin faptul că permite cinci tipuri de structuri de date, Redis adăpostește o mare varietate de probleme care pot fi în mod natural mapate/ cartografiate în ceea ce oferă Redis, permițând astfel solutionarea problemelor fără a fi nevoie de a efectua gimnasticile conceptuale necesare de alte baze de date. Caracteristici aditionale precum replicarea, persistența și “client-side sharding”, permit Redis să scaleze de la un traseu convenabil la un prototip de sistem, până la sute de gigabytes și de milioane de cereri pe secundă.
Cele 5 structuri disponibile in Redis: string, list, set, hash, zset
STRING – string, integer sau valori floating-point – operează pe întregul string, părti, incrementează/decrementeaza integerii și valorile float LIST – liste de string conectate – articole push sau pop din ambele parti, decupaje bazate pe compensate, citirea de articole individuale sau multiple, găsirea sau stergerea articolelor prin valoare SET – colecții unice de string neordonate – adunare, adăugare sau inlăturare de articole, verificare de apartenenta, intersectie, uniune, diferență, adaugarea de articole aleatorii HASH – tabel hash de de taste la valori neordonate – adunare, găsire sau înlaturarea de articole individuale
ZSET – mapare ordonată de string, membrii de scor floating-point, ordonate dupa scor – adunare sau înlăturare de valuri individuale sau adunare de articole bazate pe interval de scor sau valori de membru.Redis nu permite interograrea valorii unui obiect. Pentru a interactiona cu obiectele stocate, Redis oferă o listă de comenzi pentru fiecare tip de date existent, comenzi precum: append, del, exec, exist, dump, discard, debug, hget, hset, hkeys etc.
Bibliografie
Cărți:
Aguilar, Jose M. – SignalR Programming in Microsoft ASP.NET Editura Microsoft Press, Washington 2014
Aguilar, Jose M. – ASP.NET SignalR – Incredibly simple real-time features for your web apps, Editura Campus MVD.NET, 2013
Angel, Traian, Dictionar de informatică, Editura Corint, Bucuresti 2010
Chadwick, Jess și Snyder, Todd – ProgrammingASP.NET.MVC4, Editura Oreilly, Sebastopol California, 2012
Carlson, Josiah L, Redis in Action, Editura Manning Publications Co, New York, 2013
Ciliberti, John,ASP.NET.MVC.4.Recipes – A problem-Solution Approach, Editura Apress, New York, 2013
Driscoll, Brian, Gupta Nitin, Vettor Robert, Hirani Zeeshan și Tenny Larry Entity Framework 6 Recipes A doua ediție, Editura Apress, New York, 2013
Dykstra, Tom și Andreson Rick, Getting Started with Entity Framework 6 Code First using MVC 5. Editura Microsoft, aprilie 2014
Esposito, Dino, Programming Microsoft ASP.NET.MVC.,3rd.Edition, Editura Microsoft Press, California, Feb.2014
Freeman, Adam – Pro ASP.Net MVC 5, editura Apress, New York, 2013
Freeman, Adam-Pro-ASP-Net-MVC-5Platform, Editura Apress, New York, 2014
Galloway, Jon, Matson, David, Wilson, Brad, Allen, K. Scott, Professional ASP.NET MVC 5, Editura Wrox:Programmer to programmer, Indianapolis, 2014
Guay Paz, Jose Rolando, Beginning ASP.NET MVC 4, editura Apress, 2013, New York
Rahman, Syed Fazle – Jump Start Bootstrap, Editura Sitepoint, Australia, 2014
Singh, Rahul Rajat, Mastering Entity Framework , Editura Packt Publishing Enterprise, Mumbai, februarie 2015
Spurlock, Jake, Bootstrap, Editura O*Relly, Sebastopol, Mai 2013
Articole
Seguin, Karl – The Little Redis Book, Publicat pe www. Creatice Commons.com
Surse Web
http://www.dotnetcurry.com/showarticle.aspx?ID=814
http://typecastexception.com/post/2013/07/21/Routing-Basics-in-ASPNET-MVC.aspx#What-makes-a-good-URL
http://www.typecastexception.com/post/2013/08/21/Customizing-Routes-in-ASPNET-MVC.aspx
http://channel9.msdn.com/Blogs/matthijs/ASPNET-MVC-2-Basics-Introduction-by-Scott-Hanselman
http://blog.stevensanderson.com/2009/10/08/aspnet-mvc-learning-resource-request-handling-pipeline-poster/
http://www.asp.net/visual-studio/overview/2013/aspnet-scaffolding-overview
http://www.codeproject.com/Articles/467850/ASP-NET-MVC-view-engines
http://www.asp.net/web-forms/what-is-web-forms
Bibliografie
Cărți:
Aguilar, Jose M. – SignalR Programming in Microsoft ASP.NET Editura Microsoft Press, Washington 2014
Aguilar, Jose M. – ASP.NET SignalR – Incredibly simple real-time features for your web apps, Editura Campus MVD.NET, 2013
Angel, Traian, Dictionar de informatică, Editura Corint, Bucuresti 2010
Chadwick, Jess și Snyder, Todd – ProgrammingASP.NET.MVC4, Editura Oreilly, Sebastopol California, 2012
Carlson, Josiah L, Redis in Action, Editura Manning Publications Co, New York, 2013
Ciliberti, John,ASP.NET.MVC.4.Recipes – A problem-Solution Approach, Editura Apress, New York, 2013
Driscoll, Brian, Gupta Nitin, Vettor Robert, Hirani Zeeshan și Tenny Larry Entity Framework 6 Recipes A doua ediție, Editura Apress, New York, 2013
Dykstra, Tom și Andreson Rick, Getting Started with Entity Framework 6 Code First using MVC 5. Editura Microsoft, aprilie 2014
Esposito, Dino, Programming Microsoft ASP.NET.MVC.,3rd.Edition, Editura Microsoft Press, California, Feb.2014
Freeman, Adam – Pro ASP.Net MVC 5, editura Apress, New York, 2013
Freeman, Adam-Pro-ASP-Net-MVC-5Platform, Editura Apress, New York, 2014
Galloway, Jon, Matson, David, Wilson, Brad, Allen, K. Scott, Professional ASP.NET MVC 5, Editura Wrox:Programmer to programmer, Indianapolis, 2014
Guay Paz, Jose Rolando, Beginning ASP.NET MVC 4, editura Apress, 2013, New York
Rahman, Syed Fazle – Jump Start Bootstrap, Editura Sitepoint, Australia, 2014
Singh, Rahul Rajat, Mastering Entity Framework , Editura Packt Publishing Enterprise, Mumbai, februarie 2015
Spurlock, Jake, Bootstrap, Editura O*Relly, Sebastopol, Mai 2013
Articole
Seguin, Karl – The Little Redis Book, Publicat pe www. Creatice Commons.com
Surse Web
http://www.dotnetcurry.com/showarticle.aspx?ID=814
http://typecastexception.com/post/2013/07/21/Routing-Basics-in-ASPNET-MVC.aspx#What-makes-a-good-URL
http://www.typecastexception.com/post/2013/08/21/Customizing-Routes-in-ASPNET-MVC.aspx
http://channel9.msdn.com/Blogs/matthijs/ASPNET-MVC-2-Basics-Introduction-by-Scott-Hanselman
http://blog.stevensanderson.com/2009/10/08/aspnet-mvc-learning-resource-request-handling-pipeline-poster/
http://www.asp.net/visual-studio/overview/2013/aspnet-scaffolding-overview
http://www.codeproject.com/Articles/467850/ASP-NET-MVC-view-engines
http://www.asp.net/web-forms/what-is-web-forms
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: Aplicatii Web Moderne (ID: 149536)
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.
