ASP.NET MVC ha fatto molta strada da quando "The Gu" ha buttato giù alcune idee durante una corsa in aereo a una conferenza nel 2007. In poco meno di quattro anni, ASP.NET MVC ha visto la sua quarta versione e fornisce agli sviluppatori un ambiente che facilita lo sviluppo, snellisce i processi e promuove modelli moderni.
Saltare a destra è uno dei modi migliori per farsi un'idea della nuova tecnologia. Andiamo avanti e tuffiamoci nel codice!
Userò Visual Studio 2012 Release Candidate, che è disponibile qui. Raccomando anche di scaricare SQL Server 2012 perché il nuovo Management Studio è un miglioramento molto necessario rispetto alle versioni precedenti.
Una volta che VS 2012 è attivo e funzionante, andare avanti e creare un nuovo progetto. Vai a File -> Nuovo progetto e scegli un Applicazione Internet. Non è un modello perfetto, ma porterà a termine il lavoro.
Nota: il codice per questa applicazione demo si trova in un repository Github. Non passerò attraverso ogni singolo pezzo di codice in questa app, ma avrai una buona conoscenza di un'applicazione MVC4 alla fine di questo tutorial.
Userò il codice Entity Framework (EF) First per il modello di dati. Codice EF In primo luogo ci consente di generare tabelle di database con nient'altro che alcuni oggetti Plain Old CLR (POCO). Inoltre, EF ci consente di utilizzare LINQ per le entità e le espressioni Lambda, semplificando la ricerca e l'emissione di comandi. Una vittoria vincere!
La nostra applicazione sarà un sito di recensioni per la revisione di ... cose. Pertanto, il modello di dati deve incorporare tutti i bit e i pezzi necessari per una singola revisione. Inizieremo con una classe chiamata Revisione
. Scrivi la seguente classe nel suo file nel file Modelli directory:
// Review.cs // https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Models/Review.cs Revisione della classe pubblica public int Id get; impostato; [Obbligatorio] stringa pubblica Contenuto get; impostato; [Obbligatorio] [StringLength (128)] public string Argomento get; impostato; [Obbligatorio] stringa pubblica Email get; impostato; [Obbligatorio] bool pubblico IsAnonymous get; impostato; public int CategoryId get; impostato; Categoria categoria pubblica virtuale get; impostato; IEnumerable virtuale pubblicoCommenti ottieni; impostato;
Il Revisione
la classe ha è Id
(la chiave primaria), il Soddisfare
proprietà per archiviare la recensione, a Argomento
come un nome di ristorante (o qualsiasi nome di un'organizzazione), a E-mail
proprietà e un IsAnonymous
flag per indicare se il revisore è anonimo. Il CategoryId
e il Categoria
le proprietà creano una relazione di chiave esterna per legare una revisione a a Categoria
(es .: Medici, Dentisti, ecc.). E l'ultimo è una raccolta di Commento
oggetti.
Ora scrivi il Commento
classe. Ancora una volta, aggiungi la nuova classe al Modelli directory:
// Comment.cs // https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Models/Comment.cs public class Commento public int Id get; impostato; [Obbligatorio] stringa pubblica Contenuto get; impostato; [Obbligatorio] stringa pubblica Email get; impostato; [Obbligatorio] bool pubblico IsAnonymous get; impostato; public int ReviewId get; impostato; recensione pubblica recensione get; impostato;
La classe di commento ha un Id
proprietà per la chiave primaria, Soddisfare
del commento, a E-mail
proprietà e un IsAnonymous
bandiera per gli utenti. Poi ci sono ReviewId
e Revisione
proprietà per creare una relazione chiave esterna tra commenti e recensioni.
L'ultimo è il Categoria
classe. Ecco il suo codice:
// Category.cs // https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Models/Category.cs public class Categoria public int Id get; impostato; [Obbligatorio] [StringLength (32)] stringa pubblica Nome get; impostato;
Questa classe è auto-esplicativa.
Probabilmente hai notato un uso esteso del [Necessario]
annotazione dei dati nelle classi precedenti. Questi designano un campo non annullabile nel database e forniscono la convalida in un secondo momento lungo la strada. Se lo desideri, puoi anche creare i tuoi attributi di convalida personalizzati. Inoltre [Necessario]
, abbiamo anche usato il virtuale
parola chiave per alcune proprietà; tali proprietà indicano relazioni con le chiavi esterne con altre tabelle.
Per creare le tabelle corrispondenti per queste classi, dovrai creare un DbContext
classe. Il codice seguente crea una classe di contesto chiamata ReviewedContext
:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Models/ReviewedContext.cs public class ReviewedContext: DbContext public DbSetRecensioni ottieni; impostato; DbSet pubblico Categorie ottieni; impostato; DbSet pubblico Commenti ottieni; impostato; public ReviewedContext () Configuration.ProxyCreationEnabled = false;
Codice EF In primo luogo ci consente di generare tabelle di database con nient'altro che alcuni oggetti Plain Old CLR (POCO).
Ogni proprietà in questa classe corrisponde a una tabella durante la generazione del database. Il Configuration.ProxyCreationEnabled = false;
fa in modo che le entità vengano recuperate come oggetti delle rispettive classi anziché proxy, rendendo molto più facile il debugging.
Successivamente, impostiamo un inizializzatore del database. Un inizializzatore assicura che il database sia creato correttamente quando il modello di dati subisce modifiche. Senza un inizializzatore, dovrai cancellare manualmente il database se apporti una modifica a uno dei tuoi POCO. Esistono diversi tipi di inizializzatori tra cui scegliere: DropCreateDatabaseAlways
e DropCreateDatabaseIfModelChanges
. I nomi sono auto esplicativi. Quello che useremo è DropCreateDatabaseIfModelChanges
.
Il DropCreateDatabaseAlways
e DropCreateDatabaseIfModelChanges
Gli inizializzatori hanno un effetto collaterale: rilasciano le tabelle (e quindi i dati) nel database quando la struttura del modello cambia. Ma EF Code First fornisce un terzo modo per generare database: migrazioni. Questa nuova funzione tiene traccia delle modifiche al database e non perde i dati man mano che le classi POCO cambiano.
Ecco il codice per il nostro inizializzatore:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Models/ReviewedContextInitializer.cs // http://slipsum.com/ public class ReviewedContextInitializer: DropCreateDatabaseIfModelChangesprotected override void Seed (contesto ReviewedContext) // Usa il contesto per inizializzare il db.
Il ReviewedContextInitializer
la classe ha la precedenza su Seed ()
metodo. Questo ci dà la possibilità di riempire il nostro database con alcuni dati di test. Ora, dobbiamo visitare il global.asax
file e aggiungere la seguente riga al file Application_Start ()
metodo:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Global.asax.cs Database.SetInitializer (new ReviewedContextInitializer ());
Creiamo alcuni repository per il recupero dei dati dal database, e andremo avanti e imposteremo dependency injection (DI) con Ninject. Se non sai esattamente cosa sono DI o Inversion of Control (IoC), prenditi un momento per leggere questo articolo.
Fondamentalmente, l'idea di iniezione di dipendenza è a iniettare una dipendenza concreta in una classe, in contrasto con la codifica hard della classe per dipendere dalla dipendenza concreta. In altre parole, è un disaccoppiamento di una classe concreta da un'altra. Se è ancora chiaro come fango, diamo un'occhiata a un breve esempio:
public class Foo private Bar _bar; public Foo () _bar = new Bar ();
Questo codice crea una classe chiamata foo
. Dipende dalla funzionalità di un oggetto di tipo Bar
, e il Bar
l'oggetto è creato all'interno del foo
classe. Questo può essere difficile da mantenere e unit test perché:
foo
e Bar
sono strettamente accoppiati. Di conseguenza, la manutenzione è meno che ideale.foo
dipende da una specifica implementazione di Bar
, rendere difficile il test dell'unità.Questo codice può essere migliorato con poche modifiche. Dai un'occhiata alla revisione foo
classe:
classe pubblica Foo private IBar _bar; public Foo (barra IBar) _bar = bar;
In poco meno di quattro anni, ASP.NET MVC ha visto la sua quarta versione ...
Ora il foo
la classe non dipende da una specifica implementazione di Bar
. Invece, un oggetto di una classe che implementa il IBar
l'interfaccia è fornita a foo
tramite il costruttore di quest'ultimo. Questo approccio migliora notevolmente la manutenibilità, consentendoci anche di iniettare qualsiasi IBar
oggetto - rendendo più facile testare il nostro codice unitario.
Con questa breve descrizione fuori mano, facciamo in modo che Ninject sia attivo e funzionante. Avvia la console di Gestione pacchetti ed esegui Installa-pacchetto Ninject.MVC3
. Questo aggiungerà Ninject al nostro progetto.
Il primo repository che creeremo è il ReviewsRepository
, e implementerà il IReviewRepository
interfaccia. Ecco l'interfaccia:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Models/Abstract/IReviewRepository.cs interfaccia pubblica IReviewRepository Review Get (int id); IQueryablePrendi tutto(); Rivedi Aggiungi (Rivedi recensione); Aggiorna recensione (recensione recensione); void Delete (int reviewId); IEnumerable GetByCategory (categoria categoria); IEnumerable GetReviewComments (int id);
Questa interfaccia garantisce che i nostri repository di recensioni forniscano le operazioni CRUD di base. Abbiamo anche l'utilità di recuperare le recensioni da una categoria specifica, oltre a recuperare i commenti per una determinata recensione. Ora scriviamo una classe concreta che implementa questa interfaccia:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Models/Repos/ReviewRepository.cs ReviewRepository classe pubblica: IReviewRepository privato ReviewedContext _db get; impostato; public ReviewRepository (): this (new ReviewedContext ()) public ReviewRepository (ReviewedContext db) _db = db; public Review Get (int id) return _db.Reviews.SingleOrDefault (r => r.Id == id); IQueryable pubblicoGetAll () return _db.Reviews; recensione pubblica Aggiungi (Revisione) _db.Reviews.Add (recensione); _db.SaveChanges (); recensione di ritorno; Aggiornamento recensione pubblica (Revisione) _db.Entry (review) .State = EntityState.Modified; _db.SaveChanges (); recensione di ritorno; public void Delete (int reviewId) var review = Get (reviewId); _db.Reviews.Remove (recensione); IEnumerable pubblico GetByCategory (categoria Categoria) return _db.Reviews.Where (r => r.CategoryId == category.Id); IEnumerable pubblico GetReviewComments (int id) return _db.Comments.Where (c => c.ReviewId == id);
WebAPI è un framework MVC che possiamo usare per creare facilmente un'API RESTful ...
Questo repository si basa su a ReviewedContext
oggetto che è memorizzato come variabile di classe. Ciò ci consente di utilizzare LINQ in qualsiasi metodo del repository, facilitando l'interazione con il database.
WebAPI ha una bella funzionalità che ci consente di aggiungere il nostro framework DI. Questa funzione va oltre lo scopo di questo tutorial, quindi assicurati di leggere questo articolo per ottenere questa impostazione.
Uno dei luoghi più importanti per il nostro codice è il App_Start
cartella, che contiene un file chiamato NinjectCommonWeb.cs
(l'installazione di Ninject aggiunge automaticamente questo file a App_Start
). Questo file contiene una classe statica chiamata NinjectWebCommon
, e ha un metodo chiamato RegisterServices ()
. In questo metodo, aggiungi il seguente codice:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/App_Start/NinjectWebCommon.cs kernel.Bind().A (); kernel.Bind ().A (); kernel.Bind ().A (); GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver (kernel);
Le prime tre istruzioni collegano un'interfaccia a un'implementazione concreta dell'interfaccia e la quarta riga imposta la DI per WebAPI (la funzionalità trattata nell'articolo precedente).
Creiamo ora i controller per l'API. WebAPI è un framework MVC che possiamo usare per creare facilmente un servizio RESTful e può essere eseguito all'interno di un'applicazione MVC4, nel proprio progetto, oppure può essere ospitato autonomamente al di fuori di IIS. Ma non è tutto; ha molte altre caratteristiche, come ad esempio: negoziazione del contenuto (per serializzare automaticamente i dati in qualsiasi formato richiesto), modello di associazione, convalida e molti altri.
Prima dobbiamo creare un endpoint con WebAPI e lo facciamo creando una classe che eredita ApiController
. Iniziare con questo è piuttosto facile. Visual Studio 2012 ha una nuova funzionalità che crea un nuovo controller parzialmente scaffoldato.
Questo creerà una classe controller con alcuni metodi già definiti per te. Ecco un esempio:
// GET api / default1 public IEnumerableGet () return new string [] "value1", "value2"; // GET api / default1 / 5 stringa pubblica Get (int id) return "value"; // POST api / default1 public void Post (valore stringa) // PUT api / default1 / 5 public void Put (int id, valore stringa) // DELETE api / default1 / 5 public void Elimina (int id )
I nomi dei metodi corrispondono al verbo HTTP che rappresentano. Ora creeremo il ReviewsController
classe. Il codice un po 'lungo, ma piuttosto semplice.
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Controllers/ReviewsController.cs public class RecensioniController: ApiController private ICategoriesRepository _categoriesRepository get; impostato; IReviewRepository privato _reviewRepository get; impostato; public ReviewsController (IReviewRepository reviewRepository, ICategoriesRepository categoriesRepository) _reviewRepository = reviewRepository; _categoriesRepository = categoriesRepository; // GET api / esamina pubblico IEnumerableGet () var reviews = _reviewRepository.GetAll (); restituire recensioni; // GET api / review / 5 public HttpResponseMessage Get (int id) var category = _reviewRepository.Get (id); if (category == null) return Request.CreateResponse (HttpStatusCode.NotFound); return Request.CreateResponse (HttpStatusCode.OK, category); // POST api / revision pubblico HttpResponseMessage Post (Revisione recensione) var response = Request.CreateResponse (HttpStatusCode.Created, review); // Ottieni l'url per recuperare la recensione appena creata. response.Headers.Location = new Uri (Request.RequestUri, string.Format ("recensioni / 0", review.Id)); _reviewRepository.Add (recensione); risposta di ritorno; // PUT api / review / 5 public void Put (Review review) _reviewRepository.Update (review); // DELETE api / review / 5 public HttpResponseMessage Delete (int id) _reviewRepository.Delete (id); return Request.CreateResponse (HttpStatusCode.NoContent); // GET api / recensioni / categorie / categoria pubblico HttpResponseMessage GetByCategory (categoria stringa) var findCategory = _categoriesRepository.GetByName (categoria); if (findCategory == null) return Request.CreateResponse (HttpStatusCode.NotFound); return Request.CreateResponse (HttpStatusCode.OK, _reviewRepository.GetByCategory (findCategory)); // GET api / recensioni / commenti / id pubblico HttpResponseMessage GetReviewComments (int id) var reviewComments = _reviewRepository.GetReviewComments (id); if (reviewComments == null) return Request.CreateResponse (HttpStatusCode.NotFound); return Request.CreateResponse (HttpStatusCode.OK, reviewComments);
Questo codice utilizza IReviewRepository
e ICategoriesRepository
oggetti per eseguire l'azione appropriata (es: recupero di dati per richieste GET, aggiunta di dati con richieste POST, ecc.). Questi respositori sono iniettati con Ninject via Costruttore di iniezione.
Se non hai ancora Fiddler, prendilo subito - anche se non sei uno sviluppatore .NET.
Si noti che alcuni metodi restituiscono diversi tipi di dati. WebAPI ci dà la possibilità di restituire un tipo di dati non stringa (come IEnumerable
) e serializzerà l'oggetto da inviare nella risposta del server. Puoi anche usare il nuovo HttpResonseMessage
classe per restituire un codice di stato HTTP specifico insieme ai dati restituiti. Un modo per creare un HttpResponseMessage
l'oggetto è chiamando Request.CreateResponse (responseCode, data)
.
Possiamo testare correttamente il nostro progetto WebAPI con uno strumento come Fiddler2. Se non hai ancora Fiddler, prendilo subito - anche se non sei uno sviluppatore .NET. Fiddler è un fantastico strumento di debug HTTP. Una volta eseguito Fiddler, fai clic su RequestBuilder e inserisci l'URL dell'API che desideri testare. Quindi scegli il tipo di richiesta appropriato. Se si effettua una richiesta POST, assicurarsi e specificare a Content-Type: application / json
intestazione e quindi inserire una struttura JSON valida nel corpo della richiesta. L'immagine seguente mostra una richiesta JSON POST non elaborata su API / recensioni
URL:
Quando invii la richiesta, vedrai qualcosa come la seguente immagine:
Si noti che il codice di stato della richiesta POST è un 201. WebAPI fa un ottimo lavoro nel restituire il codice di stato corretto per un servizio web RESTfull. Divertiti con Fiddler2, è uno strumento fantastico!
Con WebAPI, è possibile specificare il routing per i controller (proprio come MVC). In MVC4, a RouteConfig.cs
il file viene aggiunto al App_Start
cartella. Le rotte per un progetto WebAPI sono proprio come le rotte MVC.
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/App_Start/RouteConfig.cs routes.MapHttpRoute (nome: "GetReviewComments", routeTemplate: "api / recensioni / commenti / id", valori predefiniti : new id = RouteParameter.Optional, controller = "Recensioni", action = "GetReviewComments"); routes.MapHttpRoute (nome: "GetByCategories", routeTemplate: "api / recensioni / categorie / categoria", valori predefiniti: new category = RouteParameter.Optional, controller = "Recensioni", action = "GetByCategory"); routes.MapHttpRoute (nome: "DefaultApi", routeTemplate: "api / controller / id", valori predefiniti: new id = RouteParameter.Optional);
Il DefaultApi
il percorso viene generato automaticamente da Visual Studio. Le altre due rotte sono personalizzate e mappano a metodi specifici sul controller Reviews. Ci sono molti articoli e tutorial che forniscono buone informazioni sul routing. Assicurati di controllare questo fuori.
Ciò copre molto di ciò che WebAPI ha da offrire. Successivamente, scriveremo alcuni metodi per visualizzare i dati. Consumeremo l'API in un po ', ma per ora utilizzeremo i repository nel nostro HomeController
. UN HomeController
è stato creato da Visual Studio; modifichiamo i suoi metodi per visualizzare i dati. Per prima cosa, prendiamo una lista delle categorie in Indice
metodo.
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Controllers/HomeController.cs private ICategoriesRepository _categoriesRepository get; impostato; IReviewRepository privato _reviewRepository get; impostato; HomeController pubblico (ICategoriesRepository categorieRepository, IReviewRepositoryRepositoryRepository) _categoriesRepository = categoriesRepository; _reviewRepository = reviewRepository; public ActionResult Index () var categories = _categoriesRepository.GetAll (); return View (categorie);
Qui, continuiamo a usare DI accettando i repository come parametri per il HomeController
costruttore. Ninject inserisce automaticamente le classi concrete appropriate per noi. Successivamente, aggiungiamo del codice al Indice
visualizzare per visualizzare le categorie:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Views/Home/Index.cshtml @model IEnumerableScegli una categoria:
@foreach (categoria var nel modello)
- @Nome della categoria
Questo genera un elenco di categorie su cui gli utenti possono fare clic. Ora aggiungi un nuovo metodo a HomeController
che recupera a Revisione
. Chiameremo questo metodo Recensioni
, mostrato qui:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Controllers/HomeController.cs Public ActionResult Reviews (stringa id) Listrecensioni = nuova lista (); if (! string.IsNullOrWhiteSpace (id)) recensioni = _reviewRepository.GetByCategory (_categoriesRepository.GetByName (id)). ToList (); else reviews = _reviewRepository.GetAll (). ToList (); foreach (var review nelle recensioni) var comments = _reviewRepository.GetReviewComments (review.Id); review.Comments = comments.ToList (); return View (recensioni);
Perché esiste già un percorso per / Controller / action / id
, puoi usare un URL come Home / Recensioni / Medici
. Il motore di routing passerà "Medici" come id
parametro al Recensioni
metodo. Noi usiamo il id
come categoria e recuperare tutte le recensioni associate a quella categoria. Se non viene fornita alcuna categoria, tuttavia, è semplice recuperare tutte le recensioni nel database. Una volta che abbiamo tutte le recensioni, passiamo la lista di revisione alla vista. Diamo un'occhiata alla vista in questo momento:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Views/Home/Reviews.cshtml@foreach (var review in Model)@ review.Topic
@ review.Content
var hasComments = review.Comments.Count> 0? "is-comments": null;@foreach (var comment in review.Comments)
- @ (! comment.IsAnonymous? string.Format ("0 dice", comment.Email): "")
@ comment.Content
Questo codice utilizza una nuova funzionalità di MVC4. Il
elementi classe
l'attributo non apparirà nell'HTML se hasComments
è nullo
. Leggi di più su questa funzione qui.
Nessuna app web moderna è completa senza JavaScript e la useremo per consumare il nostro servizio WebAPI. Useremo Backbone.js per questo; quindi avanti e scarica Backbone e la sua dipendenza Underscore. Inserire i file JavaScript nel Script elenco.
Trarremo vantaggio da un'altra nuova funzionalità MVC4 chiamata script bundling. Nel App_Start
cartella, troverai il BundleConfig.cs
file. In questo file, puoi configurare MVC4 per unire insieme i file JavaScript. Aprilo e aggiungi un nuovo pacchetto, come questo:
bundles.Add (new ScriptBundle ("~ / bundles / backbone"). Include ("~ / Scripts / underscore *", "~ / Scripts / backbone *"));
Quindi nel /Views/Shared/_Layout.cshtml
file, aggiungi quanto segue nella parte inferiore del corpo della pagina:
@ Scripts.Render ( "~ / fasci / spina dorsale")
Questo raggrupperà i tuoi script se la tua applicazione è in modalità di debug, o li lascerà da solo con questa disattivata.
Il codice MVC4 che abbiamo scritto per recuperare l'elenco di revisioni è un ottimo modo per visualizzarli, ma tutta la nuova hawtness utilizza Ajax. Rifacciamo il codice per utilizzare Backbone.js. Attraverso JavaScript, recupereremo le viste in modo asincrono dopo il caricamento della pagina. Crea un nuovo file nel Script
cartella chiamata home.js
. Aggiungi il seguente codice a quel file:
var Review = Backbone.Model.extend (); var Reviews = Backbone.Collection.extend (model: Review, url: '/ api / reviews'); var Comment = Backbone.Model.extend (); var Commenti = Backbone.Collection.extend (model: Comment, url: '/ api / reviews / comments /');
Questi sono i modelli di dati JavaScript, ciascuno corrispondente a un URL per recuperare i dati dal servizio WebAPI. Ora scriviamo la vista:
var ListReviews = Backbone.View.extend (el: '.reviews', initialize: function () this.collection.on ('reset', this.render, this); this.collection.fetch ();, render: function () this.collection.each (this.renderItem, this);, renderItem: function (model) var view = new ReviewItem (model: model); this. $ el.append (view. el););
Questa vista è per l'intero elenco di recensioni. Quando la collezione è fetch ()
il metodo è chiamato, innesca il reset
evento e poi chiama render ()
. Il terzo parametro è passato a sopra()
il metodo è lo scopo o cosa Questo
sarà nel render ()
richiama. Nel render ()
metodo, chiama la raccolta ogni()
metodo, passando il renderItem ()
metodo. Il renderItem ()
il metodo verrà chiamato su ogni elemento della raccolta, generando un nuovo ReviewItem
per ogni recensione.
Il codice per ReviewItem
segue:
var ReviewItem = Backbone.View.extend (events: 'click su': 'getComments', tagName: 'li', initialize: function () this.template = _.template ($ ('# reviewsTemplate') .html ()); this.collection = new Comments (); this.collection.on ('reset', this.loadComments, this); this.render ();, rendering: function () var html = this .template (this.model.toJSON ()); this. $ el.append (html);, getComments: function () this.collection.fetch (data: Id: this.model.get ('Id '));, loadComments: function () var self = this, item; this.comments = this. $ el.find (' ul '); this.collection.each (function (comment) item = nuovo CommentItem (model: comment); self.comments.append (item.el);); this. $ el.find ('a'). hide (););
WebAPI è un'aggiunta fantastica allo stack ASP.NET; una ricca API basata su REST non è mai stata così semplice.
Il ReviewItem
la vista è responsabile del rendering di ogni singola recensione. Il inizializzare()
il metodo compila il modello utilizzato per visualizzare ogni revisione; questo modello risiede in a elemento. Backbone estrae il modello dal
elemento e lo combina con la recensione.
UN clic
anche il gestore di eventi è impostato per caricare i commenti per ogni recensione. Quando si fa clic sul collegamento, il getComments ()
viene chiamato il metodo, recuperando i commenti passando un Id
al servizio WebAPI. Il fetch ()
il metodo è semplicemente un'astrazione per jQuery $ .ajax
metodo, quindi normali parametri Ajax, come dati
, può essere passato nel fetch ()
chiamata. Infine, il loadComments ()
il metodo sparerà e creerà un nuovo CommentItem
visualizza per ogni commento restituito. Il tagName
su questa vista assicura che la vista sia creata con un come suo
$ EL
proprietà.
Avanti, diamo un'occhiata al CommentItem
vista:
var CommentItem = Backbone.View.extend (tagName: 'li', initialize: function () this.template = _.template ($ ('# commentsTemplate'). html ()); this.render (); , render: function () var html = this.template (this.model.toJSON ()); this. $ el.html (html););
Questa è una semplice vista che rende ogni commento. Ora modifichiamo il Review.cshtml
vedere come segue:
@model IEnumerable@ script di sezioni
Notare il @ script di sezioni
nel codice sopra. Questa non è una nuova funzionalità di MVC4, ma è un ottimo strumento per il rendering di parti specifiche di JavaScript. Nel _layout.cshtml
file, c'è anche a @RenderSection ("scripts", obbligatorio: false)
che rende la sezione definita nella vista. Il gli elementi sono modelli Underscore per il rendering del contenuto. Seguono una sintassi di tipo Ruby e qualsiasi cosa all'interno
<% %>
è valutato come una dichiarazione. Qualcosa dentro <%= %>
uscirà in HTML. I cicli e le istruzioni condizionali possono essere utilizzati in questo modo:
Questo è il modello. Per usarlo, fai questo:
var template = _.template ($ ('# template'). html ()); var html = template (someCondition: true, output: 'hello world', lista: ['foo', 'bar', 'bam']);
Ci sono molti framework di template JavaScript disponibili sul Web: Handlebars.js, mustache.js e Hogan.js sono abbastanza popolari. Assicurati di controllarli e scegli quello che funziona per te.
WebAPI è un'aggiunta fantastica allo stack ASP.NET; una ricca API basata su REST non è mai stata così semplice. Ci sono molte nuove fantastiche funzionalità in MVC4. Assicurati e dai un'occhiata! Come ho già detto, il codice per questo esempio è disponibile su Github. Forchetta!