ASP.NET MVC a parcouru un long chemin depuis que "The Gu" a noté quelques idées lors d'un trajet en avion pour une conférence en 2007. En un peu moins de quatre ans, ASP.NET MVC a vu sa quatrième version, et fournit aux développeurs un environnement qui facilite le développement, rationalise les processus et favorise les modèles modernes.
Sauter directement est l’un des meilleurs moyens de maîtriser les nouvelles technologies. Allons-y et plongeons dans le code!
J'utiliserai la version candidate de Visual Studio 2012, disponible ici. Je recommande également de télécharger SQL Server 2012 car le nouveau Management Studio est une amélioration indispensable par rapport aux versions précédentes..
Une fois que VS 2012 est opérationnel, créez-vous un nouveau projet. Aller à Fichier -> Nouveau projet et choisissez un Application Internet. Ce n'est pas un modèle parfait, mais ça va faire le travail.
Remarque: le code de cette application de démonstration est situé dans un dépôt Github. Je ne vais pas passer en revue chaque élément de code dans cette application, mais vous aurez une bonne compréhension d'une application MVC4 à la fin de ce tutoriel..
Je vais utiliser le code First d'Entity Framework (EF) pour le modèle de données. EF Code First nous permet de générer des tables de base de données avec rien de plus que quelques objets Plain Old CLR Objects (POCO). De plus, EF nous permet d'utiliser les expressions LINQ to Entities et Lambda, facilitant ainsi l'interrogation et l'émission de commandes. Une victoire gagnant!
Notre application sera un site de révision pour la révision… de choses. Par conséquent, le modèle de données doit incorporer tous les éléments nécessaires à un seul examen. Nous allons commencer avec une classe appelée La revue
. Écrivez la classe suivante dans son propre fichier dans le Des modèles annuaire:
// Review.cs // https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Models/Review.cs classe publique Review public int Id get; ensemble; [Obligatoire] chaîne publique Content get; ensemble; [Obligatoire] [StringLength (128)] chaîne publique Sujet get; ensemble; [Obligatoire] chaîne publique Email get; ensemble; [Obligatoire] public bool IsAnonymous get; ensemble; public int CategoryId get; ensemble; public virtual Category Catégorie get; ensemble; public virtuel IEnumerableCommentaires get; ensemble;
le La revue
la classe a c'est Id
(la clé primaire), le Contenu
propriété pour stocker la revue, un Sujet
comme un nom de restaurant (ou tout autre nom d’organisation), un Email
propriété, et un IsAnonymous
flag pour indiquer si le réviseur est anonyme. le CatégorieId
et le Catégorie
propriétés créent une relation de clé étrangère pour lier une révision à une Catégorie
(par exemple: médecins, dentistes, etc.). Et dernier est une collection de Commentaire
objets.
Maintenant, écris le Commentaire
classe. Encore une fois, ajoutez la nouvelle classe à la Des modèles annuaire:
// Comment.cs // https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Models/Comment.cs public class Commentaire public int Id get; ensemble; [Obligatoire] chaîne publique Content get; ensemble; [Obligatoire] chaîne publique Email get; ensemble; [Obligatoire] public bool IsAnonymous get; ensemble; public int ReviewId get; ensemble; public Review Review get; ensemble;
La classe de commentaire a un Id
propriété pour la clé primaire, Contenu
du commentaire, un Email
propriété, et un IsAnonymous
drapeau pour les utilisateurs. Puis il y a ReviewId
et La revue
propriétés pour créer une relation de clé étrangère entre les commentaires et les critiques.
Le dernier est le Catégorie
classe. Voici son code:
// Category.cs // https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Models/Category.cs public class Catégorie public int Id get; ensemble; [Obligatoire] [StringLength (32)] chaîne publique Nom get; ensemble;
Cette classe est explicite.
Vous avez probablement remarqué une utilisation intensive du [Champs obligatoires]
annotation de données dans les classes ci-dessus. Ceux-ci désignent un champ non nullable dans la base de données et permettent une validation ultérieure. Vous pouvez également créer vos propres attributs de validation personnalisés si vous le souhaitez. En plus de [Champs obligatoires]
, nous avons également utilisé le virtuel
mot-clé pour certaines propriétés; ces propriétés signifient des relations de clé étrangère avec d'autres tables.
Pour créer les tables correspondantes pour ces classes, vous devez créer un DbContext
classe. Le code suivant crée une classe de contexte appelée CommentéContext
:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Models/ReviewedContext.cs public class RéviséContext: DbContext public DbSetAvis get; ensemble; DbSet public Catégories get; ensemble; DbSet public Commentaires get; ensemble; public CommentedContext () Configuration.ProxyCreationEnabled = false;
EF Code First nous permet de générer des tables de base de données avec rien de plus que de simples objets POCO (Plain Old CLR Objects).
Chaque propriété de cette classe correspond à une table lors de la génération de la base de données. le Configuration.ProxyCreationEnabled = false;
s'assure que les entités sont récupérées en tant qu'objets de leurs classes respectives au lieu de mandataires - ce qui facilite grandement le débogage.
Ensuite, nous configurons un initialiseur de base de données. Un initialiseur garantit que la base de données est créée correctement lorsque le modèle de données est modifié. Sans initialiseur, vous devrez supprimer manuellement la base de données si vous modifiez l'un de vos POCO. Il existe différents types d'initialisateurs parmi lesquels choisir: DropCreateDatabaseAlways
et DropCreateDatabaseIfModelChanges
. Les noms sont explicites. Celui que nous allons utiliser est DropCreateDatabaseIfModelChanges
.
le DropCreateDatabaseAlways
et DropCreateDatabaseIfModelChanges
Les initialiseurs ont un effet secondaire: ils suppriment les tables (et donc les données) dans la base de données lorsque la structure du modèle change. Mais EF Code First fournit un troisième moyen de générer des bases de données: Migrations. Cette nouvelle fonctionnalité permet de suivre les modifications apportées à la base de données et ne perd pas de données lorsque les classes POCO changent..
Voici le code pour notre initialiseur:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Models/ReviewedContextInitializer.cs // http://slipsum.com/ classe publique CommentéeContextInitializer: DropCreateDatabaseIfModelChangesprotected override void Seed (contexte examinéContext) // Utilisez le contexte pour créer la base de données.
le CommentéContextInitialiseur
la classe annule la La graine()
méthode. Cela nous donne la possibilité de remplir notre base de données avec certaines données de test. Maintenant, nous devons visiter le Global.asax
déposer et ajouter la ligne suivante à la Application_Start ()
méthode:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Global.asax.cs Database.SetInitializer (nouveau ReviewContextInitializer ());
Créons des référentiels pour extraire des données de la base de données, puis configurons l’injection de dépendance (DI) avec Ninject. Si vous ne savez pas exactement ce que sont DI ou Inversion of Control (IoC), prenez le temps de lire cet article..
Fondamentalement, l’idée de l’injection de dépendance consiste à injecter une dépendance concrète dans une classe, par opposition à coder en dur la classe pour qu'elle soit dépendante de la dépendance concrète. En d'autres termes, il s'agit du découplage d'une classe concrète d'une autre. Si cela reste clair comme de la boue, regardons un bref exemple:
classe publique Foo private Bar _bar; public Foo () _bar = new Bar ();
Ce code crée une classe appelée Foo
. Cela dépend de la fonctionnalité d'un objet de type Bar
, et le Bar
l'objet est créé dans le Foo
classe. Cela peut être difficile à maintenir et à tester unitaire pour les raisons suivantes:
Foo
et Bar
sont étroitement couplés. En conséquence, la maintenance est loin d'être idéale.Foo
dépend d'une mise en œuvre spécifique de Bar
, rendant les tests unitaires difficiles.Ce code peut être amélioré avec juste quelques modifications. Regardez la version révisée Foo
classe:
classe publique Foo private IBar _bar; public Foo (IBar bar) _bar = bar;
En un peu moins de quatre ans, ASP.NET MVC a vu sa quatrième version…
Maintenant le Foo
classe ne dépend pas d'une mise en œuvre spécifique de Bar
. Au lieu de cela, un objet d'une classe implémentant le IBar
l'interface est fournie à Foo
via le constructeur de ce dernier. Cette approche améliore considérablement la maintenabilité, tout en nous permettant d’injecter IBar
object - facilite le test unitaire de notre code.
Avec cette brève description, faisons en sorte que Ninject soit opérationnel. Lancez la console du gestionnaire de packages et exécutez Paquet d'installation Ninject.MVC3
. Cela ajoutera Ninject à notre projet.
Le premier référentiel que nous allons créer est le AvisDépôt
, et il mettra en œuvre le IReviewRepository
interface. Voici l'interface:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Models/Abstract/IReviewRepository.cs interface publique IReviewRepository Review Get (id id); IQueryableAvoir tout(); Review Ajouter (Review Review); Examen de mise à jour (examen d'examen); void Delete (int reviewId); IEnumerable GetByCategory (catégorie catégorie); IEnumerable GetReviewComments (int id);
Cette interface garantit que nos référentiels d’examen fournissent les opérations CRUD de base. Nous avons également l’utilité de récupérer les avis d’une catégorie spécifique, ainsi que les commentaires d’un commentaire donné. Maintenant écrivons une classe concrète implémentant cette interface:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Models/Repos/ReviewRepository.cs, classe publique ReviewRepository: IReviewRepository private CommentedContext _db get; ensemble; public ReviewRepository (): this (nouvelle ReviewContext ()) public ReviewRepository (base de données ReviewContext) _db = db; public Review Obtenir (id int) return _db.Reviews.SingleOrDefault (r => r.Id == id); public IQueryableGetAll () return _db.Reviews; public Review Add (examen critique) _db.Reviews.Add (examen); _db.SaveChanges (); avis de retour; public Review Update (Révision de révision) _db.Entry (révision) .State = EntityState.Modified; _db.SaveChanges (); avis de retour; public void Delete (int reviewId) var review = Get (reviewId); _db.Reviews.Remove (examen); public IEnumerable GetByCategory (catégorie catégorie) return _db.Reviews.Where (r => r.CategoryId == category.Id); public IEnumerable GetReviewComments (int id) return _db.Comments.Where (c => c.ReviewId == id);
WebAPI est un framework de type MVC que nous pouvons utiliser pour créer facilement une API RESTful…
Ce référentiel repose sur un CommentéContext
objet stocké en tant que variable de classe. Cela nous permet d’utiliser LINQ dans n’importe laquelle des méthodes du référentiel, facilitant ainsi l’interaction de la base de données..
WebAPI a une fonctionnalité intéressante qui nous permet d'ajouter notre propre framework DI. Cette fonctionnalité dépasse le cadre de ce didacticiel. Assurez-vous donc de lire cet article pour obtenir cette configuration..
L’un des emplacements les plus importants de notre code est le App_Start
dossier, qui contient un fichier appelé NinjectCommonWeb.cs
(l'installation de Ninject ajoute automatiquement ce fichier à App_Start
). Ce fichier contient une classe statique appelée NinjectWebCommon
, et il a une méthode appelée RegisterServices ()
. Dans cette méthode, ajoutez le code suivant:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/App_Start/NinjectWebCommon.cs kernel.Bind().À (); kernel.Bind ().À (); kernel.Bind ().À (); GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver (kernel);
Les trois premières instructions lient une interface à une implémentation concrète, et la quatrième ligne configure la DI pour WebAPI (fonctionnalité décrite dans l'article susmentionné)..
Créons maintenant les contrôleurs pour l'API. WebAPI est un framework de type MVC que nous pouvons utiliser pour créer facilement un service RESTful. Il peut être exécuté dans une application MVC4, dans son propre projet ou être auto-hébergé en dehors d'IIS. Mais ce n'est pas tout; il comporte de nombreuses autres fonctionnalités, telles que: la négociation de contenu (pour sérialiser automatiquement les données dans le format demandé), la liaison de modèle, la validation, etc..
Nous devons d’abord créer un noeud final avec WebAPI, et nous le faisons en créant une classe qui hérite ApiController
. Commencer avec ceci est plutôt facile. Visual Studio 2012 a une nouvelle fonctionnalité qui crée un nouveau contrôleur partiellement échafaudé.
Cela créera une classe de contrôleur avec quelques méthodes déjà définies pour vous. Voici un exemple:
// GET api / default1 public IEnumerableGet () retourne une nouvelle chaîne [] "valeur1", "valeur2"; // GET api / default1 / 5 chaîne publique Get (int id) return "value"; // POST api / default1 public void Post (valeur de chaîne) // PUT api / default1 / 5 public void Put (id int, valeur de chaîne) // DELETE api / default1 / 5 public void Supprimer (int id )
Les noms de méthodes correspondent au verbe HTTP qu'ils représentent. Nous allons maintenant créer le AvisContrôleur
classe. Le code un peu long, mais assez simple.
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Controllers/ReviewsController.cs classe publique ReviewsController: ApiController private ICategoriesRepository _categoriesRepository get; ensemble; IReviewRepository privé _reviewRepository get; ensemble; public ReviewsController (IReviewRepository reviewRepository, ICategoriesRepository categoriesRepository) _reviewRepository = reviewRepository; _categoriesRepository = categoriesRepository; // GET api / review public IEnumerableGet () var reviews = _reviewRepository.GetAll (); renvoyer les avis; // GET api / review / 5 public HttpResponseMessage Obtenir (id int) var category = _reviewRepository.Get (id); if (category == null) return Request.CreateResponse (HttpStatusCode.NotFound); return Request.CreateResponse (HttpStatusCode.OK, catégorie); // POST api / review public HttpResponseMessage Post (Review review) var response = Request.CreateResponse (HttpStatusCode.Created, review); // Récupère l'URL permettant de récupérer la révision nouvellement créée. response.Headers.Location = new Uri (Request.RequestUri, string.Format ("reviews / 0", review.Id)); _reviewRepository.Add (review); retour de réponse; // 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 / reviews / categories / category public HttpResponseMessage GetByCategory (catégorie de chaîne) var findCategory = _categoriesRepository.GetByName (catégorie); if (findCategory == null) return Request.CreateResponse (HttpStatusCode.NotFound); return Request.CreateResponse (HttpStatusCode.OK, _reviewRepository.GetByCategory (findCategory)); // GET api / reviews / comments / id public HttpResponseMessage GetReviewComments (int id) var reviewComments = _reviewRepository.GetReviewComments (id); if (reviewComments == null) return Request.CreateResponse (HttpStatusCode.NotFound); return Request.CreateResponse (HttpStatusCode.OK, reviewComments);
Ce code utilise IReviewRepository
et ICatégoriesRepository
objets permettant d'effectuer l'action appropriée (par exemple: récupération de données pour des requêtes GET, ajout de données avec des requêtes POST, etc.). Ninject via ces repositories est injecté via Injection de constructeur.
Si vous n'avez pas encore Fiddler, procurez-vous-le maintenant, même si vous n'êtes pas un développeur .NET.
Notez que certaines méthodes renvoient des types de données différents. WebAPI nous permet de renvoyer un type de données non-chaîne (tel que IEnumerable
), et il sérialisera l'objet à envoyer dans la réponse du serveur. Vous pouvez également utiliser le nouveau HttpResonseMessage
classe à renvoyer un code d’état HTTP spécifique avec les données renvoyées. Une façon de créer un HttpResponseMessage
l'objet est en appelant Request.CreateResponse (code de réponse, données)
.
Nous pouvons tester correctement notre projet WebAPI avec un outil tel que Fiddler2. Si vous n'avez pas encore Fiddler, procurez-vous-le maintenant, même si vous n'êtes pas un développeur .NET. Fiddler est un fantastique outil de débogage HTTP. Une fois que vous exécutez Fiddler, cliquez sur RequestBuilder et entrez l'URL de l'API que vous souhaitez tester. Ensuite, choisissez le type de demande approprié. Si vous faites une demande POST, assurez-vous et spécifiez un Type de contenu: application / json
en-tête, puis placez une structure JSON valide dans le corps de la demande. L’image suivante illustre une demande JSON POST brute au serveur api / critiques
URL:
Lorsque vous envoyez la demande, vous verrez quelque chose comme l'image suivante:
Notez que le code de statut de la demande POST est 201. WebAPI renvoie très bien le code de statut correct pour un service Web RESTfull. Amusez-vous avec Fiddler2, c'est un outil fantastique!
Avec WebAPI, vous pouvez spécifier le routage des contrôleurs (tout comme MVC). Dans MVC4, un RouteConfig.cs
le fichier est ajouté au App_Start
dossier. Les routes pour un projet WebAPI ressemblent aux routes MVC.
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/App_Start/RouteConfig.cs routes.MapHttpRoute (nom: "GetReviewComments", routeTemplate: "api / reviews / comments / id", defaults : new id = RouteParameter.Optional, controller = "Avis", action = "GetReviewComments"); itinéraires.MapHttpRoute (nom: "GetByCategories", routeTemplate: "api / reviews / catégories / catégorie", par défaut: nouveau category = RouteParameter.Optional, controller = "Avis", action = "GetByCategory"); routes.MapHttpRoute (nom: "DefaultApi", routeTemplate: "api / contrôleur / id", par défaut: new id = RouteParameter.Optional);
le DefaultApi
route est automatiquement généré par Visual Studio. Les deux autres itinéraires sont personnalisés et mappés à des méthodes spécifiques sur le contrôleur Reviews. De nombreux articles et tutoriels fournissent de bonnes informations sur le routage. Assurez-vous de vérifier celui-ci.
Cela couvre beaucoup de ce que WebAPI a à offrir. Ensuite, nous écrirons quelques méthodes pour afficher les données. Nous allons utiliser l'API dans un petit moment, mais pour le moment, nous allons utiliser les référentiels de notre AccueilContrôleur
. UNE AccueilContrôleur
a été créé par Visual Studio; modifions simplement ses méthodes pour afficher les données. D'abord, obtenons une liste des catégories dans le Indice
méthode.
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Controllers/HomeController.cs private ICategoriesRepository _categoriesRepository get; ensemble; IReviewRepository privé _reviewRepository get; ensemble; public HomeController (ICategoriesRepository categoriesRepository, IReviewRepository reviewRepository) _categoriesRepository = categoriesRepository; _reviewRepository = reviewRepository; public ActionResult Index () var categories = _categoriesRepository.GetAll (); retourner la vue (catégories);
Ici, nous continuons à utiliser DI en acceptant les référentiels en tant que paramètres de la AccueilContrôleur
constructeur. Ninject nous injecte automatiquement les classes concrètes appropriées. Ensuite, ajoutons du code à la Indice
voir pour afficher les catégories:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Views/Home/Index.cshtml @model IEnumerableChoisissez une catégorie:
@foreach (catégorie var dans Model)
- @Nom de catégorie
Cela génère une liste de catégories sur lesquelles les utilisateurs peuvent cliquer. Maintenant, ajoutez une nouvelle méthode à AccueilContrôleur
qui récupère un La revue
. Nous appellerons cette méthode Avis
, montré ici:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Controllers/HomeController.cs public Avis sur ActionResult (string id) Listreviews = nouvelle liste (); if (! string.IsNullOrWhiteSpace (id)) reviews = _reviewRepository.GetByCategory (_categoriesRepository.GetByName (id)). ToList (); else reviews = _reviewRepository.GetAll (). ToList (); foreach (var review dans les reviews) var comments = _reviewRepository.GetReviewComments (review.Id); review.Comments = comments.ToList (); retour Voir (revues);
Parce qu’une route existe déjà pour / contrôleur / action / id
, vous pouvez utiliser une URL telle que Accueil / Avis / Médecins
. Le moteur de routage passera "Doctors" en tant que identifiant
paramètre à la Avis
méthode. Nous utilisons le identifiant
en tant que catégorie et récupérer toutes les critiques associées à cette catégorie. Cependant, si aucune catégorie n'est fournie, nous récupérons simplement toutes les revues de la base de données. Une fois que nous avons toutes les critiques, nous passons la liste des critiques à la vue. Regardons la vue en ce moment:
// https://github.com/jcreamer898/NetTutsMvcEf/blob/master/Reviewed/Views/Home/Reviews.cshtml@foreach (var review dans Model)@ review.Topic
@ review.Content
var hasComments = review.Comments.Count> 0? "is-comments": null;@foreach (var commentaire dans review.Comments)
- @ (! comment.IsAnonymous? string.Format ("0 dit,", comment.Email): "")
@ comment.Content
Ce code utilise une nouvelle fonctionnalité de MVC4. le
éléments classe
attribut n'apparaîtra pas dans le code HTML si hasComments
est nul
. En savoir plus sur cette fonctionnalité ici.
Aucune application web moderne n'est complète sans JavaScript, et nous l'utilisons pour utiliser notre service WebAPI. Nous allons utiliser Backbone.js pour cela; Alors, avancez et téléchargez Backbone et sa dépendance Underscore. Placez les fichiers JavaScript dans le Les scripts annuaire.
Nous allons tirer parti d'une autre nouvelle fonctionnalité de MVC4 appelée «groupement de scripts». dans le App_Start
dossier, vous trouverez le BundleConfig.cs
fichier. Dans ce fichier, vous pouvez configurer MVC4 pour regrouper des fichiers JavaScript. Ouvrez-le et ajoutez un nouveau paquet, comme ceci:
bundles.Add (nouveau ScriptBundle ("~ / bundles / Backbone"). Include ("~ / Scripts / underscore *", "~ / Scripts / Backbone *"));
Puis dans le /Views/Shared/_Layout.cshtml
fichier, ajoutez ce qui suit au bas du corps de la page:
@ Scripts.Render ("~ / bundles / backbone")
Cela regroupera vos scripts si votre application est en mode débogage, ou les laissera seuls avec elle désactivée.
Le code MVC4 que nous avons écrit pour récupérer la liste de critiques est un bon moyen de les afficher, mais toute la nouvelle approche utilise Ajax. Refactorisons donc le code pour utiliser Backbone.js. Grâce à JavaScript, nous allons récupérer les vues de manière asynchrone après le chargement de la page. Créer un nouveau fichier dans le Les scripts
dossier appelé home.js
. Ajoutez le code suivant à ce fichier:
var Review = Backbone.Model.extend (); var Reviews = Backbone.Collection.extend (model: Review, url: '/ api / reviews'); var Comment = Backbone.Model.extend (); var Comments = Backbone.Collection.extend (model: Comment, url: '/ api / reviews / comments /');
Il s'agit des modèles de données JavaScript, chacun correspondant à une URL permettant d'extraire des données du service WebAPI. Maintenant écrivons la vue:
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 (modèle) var view = new ReviewItem (modèle: modèle); ceci. $ el.append (vue. el););
Cette vue concerne la liste complète des avis. Quand la collection est chercher ()
méthode est appelée, elle déclenche la réinitialiser
événement et appelle ensuite rendre()
. Le troisième paramètre passé à la sur()
méthode est la portée, ou quoi ce
sera dans le rendre()
rappeler. dans le rendre()
méthode, appelez la collection chaque()
méthode, en passant le renderItem ()
méthode. le renderItem ()
La méthode sera appelée sur chaque élément de la collection, générant une nouvelle ReviewItem
pour chaque revue.
Le code pour ReviewItem
suit:
var ReviewItem = Backbone.View.extend (events: 'cliquez sur un': 'getComments', tagName: 'li', initialisez: function () this.template = _.template ($ ('# commentairesTemplate') .html ()); this.collection = new Comments (); this.collection.on ('reset', this.loadComments, this); this.render ();, render: 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 = new CommentItem (modèle: comment); self.comments.append (item.el);); this. $ el.find ('a'). mas (););
WebAPI est un ajout fantastique à la pile ASP.NET. une API basée sur REST riche en fonctionnalités n'a jamais été aussi simple.
le ReviewItem
view est responsable du rendu de chaque révision individuelle. le initialiser()
méthode compile le modèle utilisé pour afficher chaque avis; ce modèle réside dans un élément. La colonne vertébrale tire le gabarit du
élément et le combine avec l'examen.
UNE Cliquez sur
Un gestionnaire d'événements est également configuré pour charger les commentaires de chaque révision. Lorsque le lien est cliqué, le getComments ()
méthode est appelée, récupérer les commentaires en passant un Id
au service WebAPI. le chercher ()
méthode est simplement une abstraction de jQuery $ .ajax
méthode, paramètres Ajax si normaux, comme Les données
, peut être passé dans le chercher ()
appel. Enfin, le loadComments ()
méthode va tirer et créer un nouveau CommentItem
Voir pour chaque commentaire retourné. le tagName
sur cette vue assure que la vue est créée avec un comme son
$ el
propriété.
Ensuite, regardons le CommentItem
vue:
var CommentItem = Backbone.View.extend (tagName: 'li', initialize: function () this.template = _.template ($ ('# commentairesTemplate'). html ()); this.render (); , render: function () var html = this.template (this.model.toJSON ()); this. $ el.html (html););
Ceci est une vue simple qui rend chaque commentaire. Modifions maintenant le Review.cshtml
voir comme suit:
@model IEnumerable@section scripts
Remarquez le scripts de section
dans le code ci-dessus. Ce n'est pas une nouvelle fonctionnalité de MVC4, mais c'est un excellent outil pour restituer des éléments spécifiques de JavaScript. dans le _layout.cshtml
fichier, il y a aussi un @RenderSection ("scripts", requis: false)
qui rend la section définie dans la vue. le les éléments sont des modèles de soulignement pour le rendu du contenu. Ils suivent une syntaxe Ruby-esque, et n'importe quoi à l'intérieur
<% %>
est évalué comme une déclaration. Quelque chose à l'intérieur de <%= %>
affichera le code HTML. Les boucles et les instructions conditionnelles peuvent être utilisées comme ceci:
C'est le modèle. Pour l'utiliser, procédez comme suit:
var template = _.template ($ ('# template'). html ()); var html = template (someCondition: true, sortie: 'hello world', list: ['foo', 'bar', 'bam']);
Il existe de nombreux frameworks de templates JavaScript disponibles sur le Web: Handlebars.js, moustache.js et Hogan.js sont très populaires. Soyez sûr et vérifiez-les et choisissez celui qui fonctionne pour vous.
WebAPI est un ajout fantastique à la pile ASP.NET. une API basée sur REST riche en fonctionnalités n'a jamais été aussi simple. Il y a beaucoup de nouvelles fonctionnalités intéressantes dans MVC4. Soyez sûr et vérifiez-les! Comme je l'ai mentionné précédemment, le code de cet exemple est disponible sur Github. Fourche-le!