ASP.NET MVC a parcurs un drum lung de când "The Gu" a notat câteva idei în timpul unei călătorii cu avionul la o conferință din 2007. În doar patru ani, ASP.NET MVC a văzut cea de-a patra versiune și oferă dezvoltatorilor un mediu care ușurează dezvoltarea, simplifică procesele și promovează modele moderne.
Jumping dreapta este una dintre cele mai bune moduri de a obține un mâner de noi tehnologii. Hai să mergem înainte și să ne aruncăm cu capul în cod!
Voi folosi Visual Studio 2012 Release Candidate, care este disponibil aici. De asemenea, vă recomandăm să descărcați SQL Server 2012 deoarece noul Management Studio este o îmbunătățire mult mai necesară față de versiunile anterioare.
Odată ce VS 2012 este în desfășurare, continuați și creați un nou proiect. Mergi la Fișier -> Proiect nou și alegeți un Aplicație Internet. Nu este un șablon perfect, dar va face treaba.
Notă: codul pentru această aplicație demo se află într-un replică Github. Nu voi trece prin fiecare bucată de cod în această aplicație, dar veți avea o bună înțelegere a unei aplicații MVC4 la sfârșitul acestui tutorial.
Voi folosi codul Entity Framework (EF) pentru modelul de date. Codul EF ne permite să generăm tabele de baze de date cu nimic mai mult decât câteva obiecte obișnuite CLR vechi (POCO). În plus, EF ne permite să folosim LINQ la expresii Entities și Lambda, facilitând interogarea și emiterea comenzilor. O victorie câștigătoare!
Cererea noastră va fi un site de recenzie pentru revizuirea ... chestii. Prin urmare, modelul de date trebuie să includă toate fragmentele necesare pentru o singură recenzie. Vom începe cu o clasă chemată Revizuire
. Scrieți următoarea clasă în fișierul propriu în modele director:
// Review.cs // https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Models/Review.cs Revizuirea clasei publice public int Id get; a stabilit; [Necesar] șir public Conținut get; a stabilit; [Obligatoriu] [StringLength (128)] șir public Topic get; a stabilit; [Necesar] șir public Email get; a stabilit; [Necesar] bool public IsAnonymous get; a stabilit; public int CategoriaId get; a stabilit; public virtual Categorie Categorie get; a stabilit; public IEnumerable virtualComentariile get; a stabilit;
Revizuire
clasa are id-ul
(cheia primară), Conţinut
proprietate pentru a stoca recenzia, a Subiect
cum ar fi numele unui restaurant (sau orice nume al unei organizații), un E-mail
proprietate, și un IsAnonymous
steag pentru a indica dacă recenzorul este anonim. categoryID
si Categorie
proprietățile creează o relație cheie străină pentru a lega o revizuire la o Categorie
(de exemplu: medici, stomatologi etc.). Și ultimul este o colecție de cometariu
obiecte.
Acum, scrieți cometariu
clasă. Încă o dată, adăugați noua clasă la modele director:
// Comment.cs // https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Models/Comment.cs clasă publică Comentariu public int Id get; a stabilit; [Necesar] șir public Conținut get; a stabilit; [Necesar] șir public Email get; a stabilit; [Necesar] bool public IsAnonymous get; a stabilit; public int ReviewId get; a stabilit; recenzie publică de opinie get; a stabilit;
Clasa de comentarii are un id-ul
proprietate pentru cheia primară, Conţinut
a comentariului, a E-mail
proprietate, și un IsAnonymous
pentru utilizatori. Apoi sunt ReviewId
și Revizuire
proprietăți pentru a crea o relație cheie străină între comentarii și recenzii.
Ultimul este Categorie
clasă. Iată codul său:
// Categorie.cs // https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Models/Category.cs clasa publica Categorie public int Id get; a stabilit; [Necesar] [StringLength (32)] șir public Numele get; a stabilit;
Această clasă este auto-explicativă.
Probabil ați observat utilizarea extensivă a [Necesar]
adnotări de date în clasele de mai sus. Acestea desemnează un câmp non-nullabil în baza de date și oferă validarea mai târziu pe drum. De asemenea, puteți crea propriile atribute de validare personalizate, dacă doriți. Pe lângă [Necesar]
, am folosit de asemenea virtual
cuvânt cheie pentru unele proprietăți; aceste proprietăți semnifică relații cheie străine cu alte tabele.
Pentru a crea tabelele corespunzătoare pentru aceste clase, va trebui să creați o DbContext
clasă. Următorul cod creează o clasă de context numită ReviewedContext
:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Models/ReviewedContext.cs Clasă publică revizuităContext: DbContext public DbSetRecenzii a lua; a stabilit; public DbSet Categorii get; a stabilit; public DbSet Comentariile get; a stabilit; publicul revizuitContext () Configuration.ProxyCreationEnabled = false;
Codul EF ne permite să generăm tabele de baze de date cu nimic mai mult decât câteva obiecte obișnuite CLR vechi (POCO).
Fiecare proprietate din această clasă corespunde unui tabel atunci când se generează baza de date. Configuration.ProxyCreationEnabled = false;
asigură că entitățile sunt preluate ca obiecte din clasele respective în loc de proxy-uri - făcând depanarea mult mai ușor.
Apoi, am creat un inițializator de bază de date. Un inițializator asigură că baza de date este creată corect atunci când modelul de date suferă modificări. Fără un inițializator, va trebui să ștergeți manual baza de date dacă faceți o schimbare la unul dintre POCO-urile dvs. Există câteva tipuri diferite de inițializatoare din care puteți alege: DropCreateDatabaseAlways
și DropCreateDatabaseIfModelChanges
. Numele sunt explicative. Cel pe care îl vom folosi este DropCreateDatabaseIfModelChanges
.
DropCreateDatabaseAlways
și DropCreateDatabaseIfModelChanges
inițializatorii au un efect secundar: scot tabelele (și astfel datele) în baza de date atunci când structura modelului se modifică. Dar Codul EF oferă mai întâi oa treia modalitate de a genera baze de date: migraţii. Această caracteristică nouă urmărește modificările aduse bazei de date și nu pierde date pe măsură ce se schimbă clasele POCO.
Iată codul pentru inițializatorul nostru:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Models/ReviewedContextInitializer.cs // http://slipsum.com/ public class ReviewedContextInitializer: DropCreateDatabaseIfModelChangesoverride protected void Seed (context reviewedContext) // Folosiți contextul pentru a însemna db.
ReviewedContextInitializer
clasa suprascrie Seed ()
metodă. Acest lucru ne oferă posibilitatea de a umple baza de date cu câteva date de testare. Acum, trebuie să vizităm Global.asax
fișier și adăugați următoarea linie la Application_Start ()
metodă:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Global.asax.cs Database.SetInitializer (noul ReviewedContextInitializer ());
Să creăm niște depozitări pentru recuperarea datelor din baza de date și vom continua și vom instala injectarea de dependență (DI) cu Ninject. Dacă nu știți exact ce înseamnă DI sau Inversion of Control (IoC), faceți puțin timp să citiți acest articol.
Practic, ideea de injectare a dependenței este de a injecta o dependență concretă într-o clasă, spre deosebire de codarea greu a clasei de a fi dependentă de dependența concretă. Cu alte cuvinte, este o decuplare a unei clase concrete de la alta. Dacă aceasta este încă clară ca noroi, să examinăm un scurt exemplu:
clasa publică Foo private Bar _bar; public Foo () _bar = Bar nou ();
Acest cod creează o clasă numită foo
. Aceasta depinde de funcționalitatea unui obiect de tip Bar
, si Bar
obiect este creat în cadrul foo
clasă. Acest lucru poate fi dificil de intretinut si testul unitar deoarece:
foo
și Bar
sunt strâns cuplate. Ca urmare, întreținerea este mai puțin decât ideală.foo
este dependentă de o implementare specifică a Bar
, făcând dificilă testarea unității.Acest cod poate fi îmbunătățit cu doar câteva modificări. Uitați-vă la revizuit foo
clasă:
clasa publica Foo private IBar _bar; public Foo (bar IBar) _bar = bar;
În doar patru ani, ASP.NET MVC și-a văzut cea de-a patra ediție ...
Acum foo
clasa nu depinde de o implementare specifică a Bar
. În schimb, un obiect al unei clase de implementare a Ibar
interfața este furnizată foo
prin constructorul acestuia. Această abordare îmbunătățește foarte mult mentenabilitatea, permițându-ne, de asemenea, să injectăm orice Ibar
obiect - ceea ce face mai ușor unitatea de testare codul nostru.
Cu o scurtă descriere atentă, hai să mergem la Ninge. Activați Consola Manager de pachete și executați Instalați-Pachetul Ninject.MVC3
. Acest lucru va adăuga Ninject la proiectul nostru.
Primul depozit pe care îl vom crea este ReviewsRepository
, și va implementa IReviewRepository
interfață. Iată interfața:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Models/Abstract/IReviewRepository.cs interfață publică IReviewRepository Review Get (int id); IQueryableIa tot(); Examinați Adăugați (Revizuire recenzie); Actualizare revizuire (revizuire recenzie); void Șterge (int reviewId); IEnumerable GetByCategory (Categorie categorie); IEnumerable Comenzile GetReview (int id);
Această interfață asigură că depozitele noastre de recenzii furnizează operațiunile CRUD de bază. Avem, de asemenea, utilitatea de a prelua recenzii de la o anumită categorie, precum și de a recupera comentariile pentru o anumită recenzie. Acum, să scriem o clasă concretă care implementează această interfață:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Models/Repos/ReviewRepository.cs clasă publică ReviewRepository: IReviewRepository private ReviewedContext _db get; a stabilit; publicReviewRepository (): acest (noul ReviewedContext ()) Revista de opinii publice (ReviewedContext db) _db = db; public Revista Obțineți (int id) returnați _db.Reviews.SingleOrDefault (r => r.Id == id); public IQueryableGetAll () return _db.Reviews; public Review Adăugați (recenzie de opinie) _db.Reviews.Add (recenzie); _db.SaveChanges (); revizuirea returnării; Actualizare publică de opinie (revizuire recenzie) _db.Entry (revizuire) .State = EntityState.Modified; _db.SaveChanges (); revizuirea returnării; public void Șterge (int reviewId) var review = Get (reviewId); _db.Reviews.Remove (revizuire); public IEnumerable GetByCategory (Categorie categorie) întoarcere _db.Reviews.Where (r => r.CategoryId == category.Id); public IEnumerable Comenzile GetReview (int id) returnați _db.Comments.Where (c => c.ReviewId == id);
WebAPI este un cadru asemănător MVC pe care îl putem folosi pentru a crea cu ușurință un API RESTful ...
Acest depozit se bazează pe ReviewedContext
obiect care este stocat ca variabilă de clasă. Acest lucru ne permite să folosim LINQ în oricare dintre metodele repozitorului, facilitând interacțiunea bazei de date.
WebAPI are o caracteristică plăcută care ne permite să adăugăm propriul cadru DI. Această caracteristică este dincolo de sfera de aplicare a acestui tutorial, așa că asigurați-vă că ați citit acest articol pentru a ajuta la obținerea acestei configurații.
Una dintre cele mai importante locații pentru codul nostru este App_Start
, care conține un fișier numit NinjectCommonWeb.cs
(instalarea programului Ninject adaugă automat acest fișier la App_Start
). Acest fișier conține o clasă statică numită NinjectWebCommon
, și are o metodă numită RegisterServices ()
. În această metodă, adăugați următorul cod:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/App_Start/NinjectWebCommon.cs kernel.Bind().La (); kernel.Bind ().La (); kernel.Bind ().La (); GlobalConfiguration.Configuration.DependencyResolver = noul NinjectResolver (kernel);
Primele trei declarații leagă o interfață la o implementare concretă a interfeței, iar a patra linie stabilește DI pentru WebAPI (caracteristica acoperită în articolul menționat mai sus).
Să creăm acum controlerele pentru API. WebAPI este un cadru de tip MVC pe care îl putem folosi pentru a crea cu ușurință un serviciu RESTful și poate rula în interiorul unei aplicații MVC4, în propriul său proiect sau poate fi găzduit în afara IIS. Dar asta nu este tot; are multe alte caracteristici, cum ar fi: negocierea conținutului (pentru a serializa automat datele în orice format este solicitat), modelul de legare, validarea și multe altele.
Mai întâi trebuie să creăm un punct final cu WebAPI și facem asta creând o clasă care moșteneste ApiController
. Noțiuni de bază cu acest lucru este destul de ușor. Visual Studio 2012 are o caracteristică nouă care creează un controler nou, parțial schele.
Aceasta va crea o clasă de controler cu câteva metode deja definite pentru dvs. Iată un exemplu:
// GET api / default1 public IEnumerableObțineți () returnați șirul nou [] "value1", "value2"; // GET api / default1 / 5 șir public Get (int id) return "value"; // POST api / default1 public void Post (valoare șir) // PUT api / default1 / 5 public void Puneți (int id, valoare șir) // DELETE api / default1 / )
Numele de metode corespund verbului HTTP pe care îl reprezintă. Vom crea acum ReviewsController
clasă. Codul un pic lung, dar destul de simplu.
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Controllers/ReviewsController.cs clasă publică ReviewsController: ApiController private ICategoriesRepository _categoriesRepository get; a stabilit; privat IReviewRepository _reviewRepository get; a stabilit; public ReviewsController (IReviewRepository reviewRepository, ICategoriesRepository categoriesRepository) _reviewRepository = reviewRepository; _categoriesRepository = categoriesRepository; // GET api / review public IEnumerableObțineți () var reviews = _reviewRepository.GetAll (); revizuiri returnate; // GET api / review / 5 public HttpResponseMessage Obțineți (int id) var category = _reviewRepository.Get (id); dacă (category == null) returnează Request.CreateResponse (HttpStatusCode.NotFound); returnați Request.CreateResponse (HttpStatusCode.OK, categorie); // POST api / revizuirea publicului HttpResponseMessage Post (Revizuire recenzie) var response = Request.CreateResponse (HttpStatusCode.Created, review); // Obțineți urlul pentru a prelua recenzia creată recent. answer.Headers.Location = nou Uri (Request.RequestUri, string.Format ("reviews / 0", review.Id)); _reviewRepository.Add (revizuire); return răspuns; // PUT api / review / 5 public void Put (Revizuire recenzie) _reviewRepository.Update (revizuire); // DELETE api / review / 5 public HttpResponseMessage Șterge (int id) _reviewRepository.Delete (id); returnează Request.CreateResponse (HttpStatusCode.NoContent); // GET api / reviews / categories / category public HttpResponseMessage GetByCategory (Categorie de șir) var findCategory = _categoriesRepository.GetByName (categorie); dacă (findCategory == null) returnează Request.CreateResponse (HttpStatusCode.NotFound); returnați Request.CreateResponse (HttpStatusCode.OK, _reviewRepository.GetByCategory (findCategory)); // GET api / comentarii / comentarii / id publice HttpResponseMessage GetReviewComments (int id) var reviewComments = _reviewRepository.GetReviewComments (id); dacă reviewComments == null) returnează Request.CreateResponse (HttpStatusCode.NotFound); returnează Request.CreateResponse (HttpStatusCode.OK, reviewComments);
Acest cod folosește IReviewRepository
și ICategoriesRepository
obiecte pentru a efectua acțiunea adecvată (de exemplu: preluarea datelor pentru cererile GET, adăugarea de date cu cererile POST etc.). Aceste depozite sunt injectate cu Ninject via Constructor Injecție.
Dacă nu aveți încă Fiddler, obțineți-l acum - chiar dacă nu sunteți dezvoltator .NET.
Observați că unele metode returnează diferite tipuri de date. WebAPI ne dă posibilitatea de a returna un tip de date non-string (cum ar fi IEnumerable
), și va serializa obiectul pentru a trimite răspunsul serverului. De asemenea, puteți utiliza noul HttpResonseMessage
pentru a returna un cod de stare specific HTTP împreună cu datele returnate. O modalitate de a crea un HttpResponseMessage
obiect este prin apelare Request.CreateResponse (răspunsCod, date)
.
Putem testa în mod corespunzător proiectul nostru WebAPI cu un instrument cum ar fi Fiddler2. Dacă nu aveți încă Fiddler, obțineți-l acum - chiar dacă nu sunteți dezvoltator .NET. Fiddler este un instrument fantastic de depanare HTTP. După ce executați Fiddler, faceți clic pe RequestBuilder și introduceți adresa URL API pe care doriți să o testați. Apoi alegeți tipul de solicitare corespunzător. Dacă faceți o solicitare POST, asigurați-vă că specificați a Tip de conținut: aplicație / json
antet și apoi plasați o structură JSON validă în corpul solicitării. Următoarea imagine demonstrează o cerere JSON POST brut către api / comentarii
Adresa URL:
Când trimiteți solicitarea, veți vedea ceva asemănător cu următoarea imagine:
Observați că codul de stare al solicitării POST este un număr de 201. WebAPI face o treabă excelentă de a returna codul de stare corect pentru un serviciu Web complet REST. Distrează-te cu Fiddler2, este un instrument fantastic!
Cu WebAPI, puteți specifica rutarea pentru controlere (la fel ca MVC). În MVC4, a RouteConfig.cs
fișierul este adăugat la App_Start
pliant. Rutele pentru un proiect WebAPI sunt la fel ca și rutele MVC.
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/App_Start/RouteConfig.cs routes.MapHttpRoute (nume: "GetReviewComments", routeTemplate: "api / reviews / comments / id", implicit : id = RouteParameter.Optional, controller = "Reviews", action = "GetReviewComments"); routes.MapHttpRoute (nume: "GetByCategories", routeTemplate: "api / reviews / categories / category", implicite: new category = RouteParameter.Optional, controller = "Recenzii", action = "GetByCategory"); routes.MapHttpRoute (nume: "DefaultApi", routeTemplate: "api / controller / id", implicit: new id = RouteParameter.Optional);
DefaultApi
ruta este generată automat de Visual Studio. Celelalte două rute sunt personalizate și hartă la anumite metode de pe controlerul Review. Există multe articole și tutoriale care oferă informații bune despre rutare. Asigurați-vă că o verificați.
Aceasta acoperă o mulțime de ceea ce WebAPI are de oferit. Apoi, vom scrie câteva metode pentru afișarea datelor. Vom consuma puțin API, dar deocamdată vom folosi depozitele din noi HomeController
. A HomeController
a fost creat de Visual Studio; hai să-i modificăm metodele pentru a afișa datele. În primul rând, să obținem o listă a categoriilor din Index
metodă.
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Controllers/HomeController.cs private ICategoriesRepository _categoriesRepository get; a stabilit; privat IReviewRepository _reviewRepository get; a stabilit; public HomeController (IC CategoriiRepository categoriesRepository, IReviewRepository reviewRepository) _categoriesRepository = categoriesRepository; _reviewRepository = recenzieRepository; public ActionResult Index () var categorii = _categoriesRepository.GetAll (); retur View (categorii);
Aici, vom continua să folosim DI acceptând depozitele ca parametri pentru HomeController
constructor. Ninject injectează automat clasele corespunzătoare de beton pentru noi. Apoi, să adăugăm un cod la Index
vizualizați pentru a afișa categoriile:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Views/Home/Index.cshtml @model IEnumerableAlege o categorie:
@foreach (categoria var în Model)
- @Numele categoriei
Aceasta generează o listă de categorii la care utilizatorii pot face clic. Acum adăugați o nouă metodă la HomeController
care recuperează a Revizuire
. Vom numi această metodă opinii
, prezentat aici:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Controllers/HomeController.cs Recenzii publice ActionResult (id de șir) Listrecenzii = Listă nouă (); dacă (! string.IsNullOrWhiteSpace (id)) reviews = _reviewRepository.GetByCategory (_categoriesRepository.GetByName (id)). ToList (); altceva reviews = _reviewRepository.GetAll (). ToList (); foreach (rev varianta în recenzii) var comments = _reviewRepository.GetReviewComments (review.Id); review.Comments = comments.ToList (); retur View (recenzii);
Deoarece există deja un traseu / Controler / acțiune / id
, puteți utiliza o adresă URL, cum ar fi Prima / Opinii / Doctori
. Motorul de rutare va trece "Doctorii" ca id
parametru la opinii
metodă. Noi folosim id
ca categorie și să preluați toate recenziile asociate cu acea categorie. Dacă nu este furnizată nicio categorie, cu toate acestea, vom prelua simplu toate recenziile din baza de date. Odată ce avem toate recenziile, trecem lista de examinare în vizualizare. Să ne uităm la punctul de vedere acum:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Views/Home/Reviews.cshtml@foreach (recenzie var în model)@ review.Topic
@ review.Content
var hasComments = review.Comments.Count> 0? "este-comentarii": null;@foreach (comentează în comentariu.Comments)
- @ (! comment.IsAnonymous? string.Format ("0 spune,", comment.Email): "")
@ comment.Content
Acest cod utilizează o nouă caracteristică a MVC4.
Element clasă
atributul nu va apărea în HTML dacă hasComments
este nul
. Citiți mai multe despre această funcție aici.
Nici o aplicație web modernă nu este completă fără JavaScript și o vom folosi pentru a consuma serviciul WebAPI. Vom folosi Backbone.js pentru acest lucru; așa că, înainte de peste și de a descărca Backbone și dependența sa Underscore. Plasați fișierele JavaScript în Scripturi director.
Vom profita de o altă caracteristică nouă MVC4 numită grupare de script-uri. În App_Start
dosarul, veți găsi BundleConfig.cs
fişier. În acest fișier, puteți configura MVC4 pentru a uni împreună fișierele JavaScript. Deschideți-l și adăugați un nou pachet, după cum urmează:
bundles.Add ("Scripts / underscore *", "~ / Scripts / backbone *"));
Apoi în /Views/Shared/_Layout.cshtml
fișier, adăugați următoarele în partea de jos a corpului paginii:
@ Scripts.Render ( "~ / mănunchiuri / coloana vertebrală")
Acest lucru va lega scripturile dacă aplicația dvs. este în modul de depanare sau le lasă singuri cu ea dezactivată.
Codul MVC4 pe care l-am scris pentru recuperarea listei de revizuiri este o modalitate foarte bună de a le afișa, dar toată noile hawtness utilizează Ajax. Deci, haideți să refactor codul pentru a utiliza Backbone.js. Prin JavaScript, vom prelua vizualizările în mod asincron după încărcarea paginii. Creați un fișier nou în Scripturi
director numit home.js
. Adăugați următorul cod în acel fișier:
var Revizuire = Backbone.Model.extend (); var Opinii = Backbone.Collection.extend (model: Review, url: '/ api / reviews'); var Comentariu = Backbone.Model.extend (); var Comentarii = Backbone.Collection.extend (model: Comentariu, url: '/ api / reviews / comments /');
Acestea sunt modelele de date JavaScript, fiecare corespunzând unei adrese URL pentru a prelua date de la serviciul WebAPI. Acum, să scriem vizualizarea:
var ListReviews = Backbone.View.extend (el: '.reviews', initialize: function () this.collection.on ('reset', this.render, this); this.collection.fetch renderItem: funcția (modelul) var view = new ReviewItem (model: model), acest. $ el.append (vizualizare. el););
Această vizualizare este pentru întreaga listă de recenzii. Când sunt colecțiile fetch ()
metoda se numește, declanșează restabili
eveniment și apoi apeluri face()
. Al treilea parametru a trecut la pe()
metoda este domeniul de aplicare, sau ceea ce acest
va fi în face()
suna inapoi. În face()
metodă, sunați la colecția fiecare()
metoda, trecerea renderItem ()
metodă. renderItem ()
metoda va fi apelată pe fiecare element din colecție, generând un nou ReviewItem
pentru fiecare revizuire.
Codul pentru ReviewItem
urmează:
var ReviewItem = Backbone.View.extend (evenimente: 'a face clic pe': 'getComments', tagName: 'li', initialize: function () this.template = _.template ($ 'reviewsTemplate') (), this.render ();, render: function () var html = aceasta (date: id: this.model.get ('Id (') ');, loadComments: function () var self = this, item; this.comments = this. $ el.find (' ul '); this.collection.each (function (comment) item = new CommentItem (model: comment); auto.comments.append (item.el);)); aceasta. $ el.find ('a') ascunde (););
WebAPI este o completare fantastică a stivei ASP.NET; un API bogat bazat pe caracteristici REST nu a fost niciodată mai ușor.
ReviewItem
vizualizare este responsabil pentru a face fiecare revizuire individuale. inițializa ()
metoda compilează șablonul utilizat pentru a afișa fiecare recenzie; acest șablon se află într-un element. Backbone scoate șablonul din
element și o combină cu revizuirea.
A clic
evenimentul handler este de asemenea configurat pentru încărcarea comentariilor pentru fiecare recenzie. Când se face clic pe link, getComments ()
metoda se numește, preluând comentariile prin trecerea unui id-ul
la serviciul WebAPI. fetch ()
metoda este doar o abstractizare a lui jQuery $ .ajax
metoda, parametrii normali Ajax, cum ar fi date
, poate fi trecut în fetch ()
apel. În cele din urmă, loadComments ()
metoda va declanșa și va crea un nou CommentItem
pentru fiecare comentariu trimis. nume eticheta
pe această vizualizare se asigură că vizualizarea este creată cu un ca a lui
$ el
proprietate.
Apoi, să ne uităm la CommentItem
vedere:
var Comentariu Backbone.View.extend (tagName: 'li', initialize: function () this.template = _.template ($ ('# commentsTemplate'). , render: funcția () var html = this.template (this.model.toJSON ()); aceasta. $ el.html (html););
Aceasta este o vizualizare simplă care face fiecare comentariu. Acum, să modificăm Review.cshtml
vizualizați după cum urmează:
@model IEnumerable@ script-uri de secțiune
Observați @ script-uri de secțiune
în codul de mai sus. Aceasta nu este o caracteristică nouă pentru MVC4, dar este un instrument excelent pentru a face anumite piese de JavaScript. În _layout.cshtml
fișier, există și o @RenderSection ("scripturi", necesare: false)
care face secțiunea definită în vizualizare. elementele sunt șabloane de Subverscore pentru redarea conținutului. Urmă o sintaxă Ruby-esque și ceva înăuntru
<% %>
este evaluată ca o declarație. Orice înăuntru <%= %>
va iesi la HTML. Buclele și instrucțiunile condiționale pot fi utilizate în felul următor:
Acesta este șablonul. Pentru ao folosi, procedați astfel:
var template = _.template ($ ('# șablon'). html ()); var html = șablon (someCondition: true, ieșire: 'hello world', list: ['foo', 'bar', 'bam']);
Există multe cadre de template-uri JavaScript disponibile pe Web: Handlebars.js, mustache.js și Hogan.js sunt destul de populare. Asigurați-vă că le verificați și alegeți unul care lucrează pentru dvs..
WebAPI este o completare fantastică a stivei ASP.NET; un API bogat bazat pe caracteristici REST nu a fost niciodată mai ușor. Există o mulțime de noi caracteristici noi în MVC4. Asigurați-vă că le verificați! După cum am menționat anterior, codul pentru acest exemplu este disponibil pe Github. Încărcați-l!