Les sources du Preview d’ASP.NET MVC actualisées

Nous avons récemment ouvert un nouveau Projet CodePlex ASP.NET que nous utiliserons pour distribuer des Previews (avec code source compilable) pour plusieurs fonctionnalités et distribution d’ASP.NET.

Le mois dernier, nous l’avons utilisé pour publier le premier dépôt de code source d'ASP.NET MVC.  Ce premier dépôt incluait le code source pour le Preview 2 d’ASP.NET MVC que nous que nous avons livré à la conférence MIX, conjointement avec les fichiers projets Visual Studio qui vous permettent de le compiler et de le mettre à jour par vous-même.

Il y a quelques heures, nous avons publié une actualisation du code source d’ASP.NET MVC sur ce site.  Cette actualisation des sources n’est pas une nouvelle livraison officielle d’un aperçu d’ASP.NET MVC. Il s’agit plutôt d’un dépôt intérimaire qui donne une idée de l’état actuel de l’arborescence des sources. Nous allons procéder à la livraison officielle du Preview 3 d’ASP.NET MVC d’ici quelques semaines après avoir mis un peu plus de travail (plus de fonctionnalités et améliorations de certaines existantes, meilleur outil d’intégration VS, support des versions express de VS documentation, etc.). Si vous êtes à la recherche d’une installation sans embuches d’ASP.NET MVC qui vient avec une documentation et des outils de support complet, vous devriez probablement attendre cette version officielle du Preview d’ASP.NET MVC. Si vous êtes quelqu’un qui désire avoir la chance de voir un aperçu du Preview et de commencer à utiliser et donner des commentaires sur certaines fonctionnalités immédiatement, les sources d’aujourd’hui seront intéressantes pour vous.

Améliorations apportées dans cette actualisation des sources d’ASP.NET MVC

La mise à jour de cette semaine (que vous pouvez télécharger ici) comprend un certain nombre d’améliorations à ASP.NET MVC. Parmi celles-ci on retrouve :

  • En plus de rendre disponible le code source pour le cadriciel d’ASP.NET MVC, nous allons aussi rendre disponible le code source pour les tests unitaires que nous avons utilisés pour le tester.  Ces testes sont implémenter en utilisant MSTest et le cadriciel de ‘mocking’ open source Moq. Un fichier projet VS 2008 pour les tests unitaires est inclus afin de faciliter leur compilation et exécution localement à l’intérieur de votre environnement de développement VS2008.
  • Support amélioré de façon significative pour les tests de classes contrôleur. Vous pouvez maintenant effectuer des tests unitaires pour les scénarios de Controller communs sans avoir à faire de mock d’objet (plus de détails sur le fonctionnement de cela ci-dessous).
  • Ajout de plusieurs fonctionnalités pratiques et améliorations au niveau de l’usabilité au niveau du système de routage d’URL (plus de détails ci-dessous).

Créer un nouveau ASP.NET MVC projet

Vous pouvez compiler votre propre copie des librairies d’ASP.NET MVC en téléchargeant les sources MVC et en les compilant localement ou, en téléchargeant un template VS pour obtenir une version précompilée de ces librairies ainsi que les modèles de projet Visual Studio que vous pouvez compilé rapidement un nouveau projet ASP.NET MVC qui utilise les bits les plus récents.

Après avoir installé les sources actualisées d’ASP.NET MVC.VSI template, un nouveau projet modèle « ASP.NET MVC Application » va apparaître sous la section "My Templates" du dialogue "New Project".

clip_image002

Cette nouvelle version du projet MVC dans « My Templates » cohabite côte à côte avec la version précédente Preview 2 d’ASP.NET MVC (que vous pouvez voir dans la section principale du dialogue ci-haut). Ceci vous permet de créer sans crainte des nouveaux projets et utiliser les 2 versions des sources et la dernière version officielle du Preview sur la même machine.

Lorsque vous créez un nouveau projet en utilisant cette version actualisée du modèle de projet ASP.NET MVC vous obtiendrez par défaut un projet qui ressemble à l’exemple ci-dessous :

clip_image004

Cette nouvelle solution de projet contient un Controller ("HomeController ») sous le répertoire « \Controllers» et de modèles de vue (« About» et « Index») sous le sous-répertoire « \Views\Home».  Les deux templates View sont basés sur une page maître commune pour le site (« Site.master») don’t tous les styles sont définis dans le fichier « Site.css» classé sous le répertoire « \Content».

Lorsque vous exécuterez l’application, le serveur web built-in démarrera automatiquement et vous verrez le contenu « Home» du site :

clip_image006

Cliquer sur l’onglet «About us» affichera le contenu «About» :

clip_image008

La classe « HomeController» est responsable du maniement des URL ci-dessus et possède deux méthodes comme ci-dessous :

clip_image010

Le template par défaut «Site.master» cherche pour la valeur «Title» dans la collection ViewData et l’utilise pour faire le rendu de l’élément <title> de la page HTML. Le template vu par défaut «Index» cherche pour la valeur «Message» et l’utilise pour faire le rendu du message de bienvenue de la page d’accueil. Vous pouvez évidemment personnaliser ces fichiers comme vous le désirez.

Changement au Controller avec ce dépôt d’ASP.NET MVC

Si vous faite la lecture du code ci-dessus attentivement vous aurez probablement remarqué quelques changements sur la façon dont les classes Controller sont implémenté par défaut en utilisant ce nouveau dépôt des sources actualisées d’ASP.NET MVC. 

Avec la livraison du Preview 2 d’ASP.NET MVC, le code ci-dessus des méthodes d’actions HomeController auraient été implémenté comme ci-dessous :

clip_image012

L’équipe fonctionnalités MVC expérimente présentement avec quelque idées avec le dépôt de cette semaine et font aussi l’essai de certaines idées nouvelles:

  1. Les méthodes Action des Controller retournent maintenant par défaut un objet de type « ActionResult » (au lieu de void). Cet objet ActionResult indique le résultat d’une Action (une View à rafraichir, une URL à rediriger vers, une autre Action/route à exécuter, etc.) 
  2. Les méthodes d’aides RenderView(), RedirectToAction(), et Redirect() de la classe de base Controller retournent désormais des objets typés ActionResult (que vous pouvez manipuler à votre guise ou retourné d’une méthode Action).
  3. La méthode d’aide RenderView() peut maintenant être appelée sans avoir à passer de façon explicite le nom du template View dont il faut exécuter le rendu. Quand vous omettez le nom du template, la méthode RenderView() va utiliser par défaut le même nom que la méthode Action ainsi que pour le template View dont il faut exécuter le rendu. Donc, faire l’appel de ”RenderView()" sans paramètres à l’intérieur de la méthode Action "About()" est identique à écrire explicitement "RenderView('About')".

Il est très facile de mettre à jour les classes Controller existantes compilées avec la Preview 2 pour utiliser ce nouveau patron (juste à changer void pour ActionResult et ajouter une instruction de retour devant tous appels de méthodes d’aides RenderView ou RedirectToAction).

Retourner des objets ActionResult des méthodes Action

Donc pourquoi changer les méthodes Action des Controller pour qu’elles retournent des objets ActionResults par défaut au lieu de retourner void? Un certain nombre de cadriciels Web-MVC populaires utilise l’approche qui prone le retour d’objet (incluant Django, Tapestry et autres), et nous trouvons que pour ASP.NET MVC apporte quelques bénéfices important:

  1. Cela permet un support beaucoup plus clair et simple des tests unitaires pour les Controller. Vous n’avez plus à faire le mocking des méthodes base sur l’objet Response ou ViewEngine de façon à faire le test unitaire du comportement Response des méthodes Action. A la place, vous pouvez simplement faire un Assert des conditions en utilisant l’objet ActionResult retourné par l’appel de la méthode Action situé dans votre test unitaire (voir la section ci-dessous).
  2. Cela peut rendre les flux d’intentions logique plus clair et plus explicite dans les cas où il pourrait y avoir deux résultats différents selon certaines conditions (par exemple: rediriger si la condition A est vrai, sinon rafraichir un template View si faux). Ceci peut simplifier la lecture et le suivit du code des méthodes Action des Controller.
  3. Ceci permet de beaux scénarios de composition dans lesquels un FilterActionAttribute peut accepter le résultat d’une méthode Action et la modifié ou la transformer avant de l’exécuter. Par exemple: une Action « Browse » sur un Controller ProductCatalog pourrait retourner un RenderActionResult qui indiquerait son intention de rafraichir une View « List » de produits. Un FilterActionAttribute déclaré sur la classe contrôleur peut alors avoir la chance de personnaliser le template View « List » afin que son rendu soit List-html.aspx ou List-xml.aspx selon le type MIME préféré du client. Plusieurs FilterActionAttributes peuvent aussi être de façon optionnelle, liée directement au flux de résultats d’un à l’autre.
  4. Cela donne accès à un excellent mécanisme d’extensibilité pour les gens (en nous incluant) qui veulent ajouter des fonctionnalités dans le futur. De nouveaux types d’ActionResult peuvent être créés facilement en créant une sous-classe de la classe de base ActionResult et en remplaçant la méthode « ExecuteResult ». Il serait facile, par exemple, de créer une méthode d’aide « RenderFile() » qu’un développeur qui écrit une méthode Action pourrait appeler pour retourner un nouvel objet « FileActionResult ».
  5. Cela permet de bons scénarios d’exécution asynchrone dans le futur. Les méthodes Action seront capable de retourner un objet AsyncActionResult qui indique qu’ils sont en attente d’une opération réseau et veulent céder le thread de travail de sorte que ASP.NET peut l’utiliser pour exécuter une autre requête jusqu’à ce que le l’appel réseau ce complète. Ceci permet aux développeurs de ne pas avoir à bloquer les threads sur un serveur et donc de supporter du code très efficace et évolutif.

Un des buts de ce Preview intérimaire est de donner aux gens la chance d’expérimenter avec cette nouvelle approche et de concevoir des applications réelles et apprendre de celle-ci.
Nous allons aussi publier une classe de base Controller alternative à titre d’exemple que vous pouvez utiliser si vous préférez l’approche, Action « void ». Nous avons délibérément omis d’inclure cette classe de base Controller alternative dans ce dépôt des sources actualisées, car nous voulons vous encourager à faire l’essai de l’approche qui retourne un « ActionResult » et de nous envoyer leurs commentaires.

Comment exécuter les tests unitaires des méthodes Action Contrôleur

J’ai mentionné ci-dessus que la nouvelle approche ActionResult facilite l’exécution de tests unitaires des Controller grandement (et évite la nécessité de faire le « mocking » de scénarios commun).  Faisons le tour d’un exemple de cette Action.

Considérons la classe simple NumberController ci-dessous :

clip_image014

Cette classe Controller à une méthode Action "IsEvenNumber" qui accepte un nombre comme argument URL.  La méthode Action IsEvenNumber vérifie tout d’abord si le nombre est négatif, dans un tel cas elle redirige vers une page erreur. S’il s’agit d’un nombre positif, elle détermine si le nombre est pair ou impair et rafraichit le template View qui affiche le message approprié :

clip_image016

Écrire des tests unitaires pour notre méthode Action « IsEvenNumber » est très facile grâce à la nouvelle approche ActionResult.

Ci-dessous, un exemple de test unitaire qui vérifie que la bonne redirection Http se produit lorsqu’un nombre négatif est passé (par exemple : /Number/IsEvenNumber/-1):

clip_image018

Remarquez ci-dessus comment il n’est pas nécessaire de faire le mocking d’aucun objet pour tester notre méthode Action. Plutôt, nous avons simplement instancié la classe NumberController et appelé la méthode Action directement (en y passant un nombre négatif) et en assignant la valeur de retour à une variable locale « result ». J’ai utilisé la syntaxe « as type» de C# ci-dessus afin de convertir la variable « result » vers un type "HttpRedirectResult" fortement typé.

Ce qu’il y a de bien à propos du mot clé « as » de C# est qu’il va assigné la valeur « null » au lieu de lancer une exception si la conversion échoue (par exemple: si une méthode Action retourne un RenderViewResult à la place). Cela implique donc que je peux facilement ajouter une vérification Assert pour valider que le résultat ne soit pas null afin de s’assurer que la bonne redirection Http est survenue. Je peux donc par la suite ajouter une seconde vérification Assert pour valider que la bonne URL de redirection ait été fournie.

Tester pour les scénarios dans lesquelles des nombres différents de zéro sont passés est aussi très facile. Pour faire cela, nous allons créer deux méthodes de tests, une pour le test de nombre pair et l’autre pour le test de nombre impair. Dans les deux tests, nous allons faire un Assert qu’un RenderViewResult ait été retourné. Par la suite nous allons vérifier que le bon string « Message» est passé dans le ViewData associé avec la View :

clip_image020

Nous pouvons alors faire un clique droit sur notre classe NumberControllerTest directement dans VS 2008 pour ensuite choisir l’item menu « Run Tests » :

clip_image022

Ceci exécutera nos trios tests unitaires en mémoire (aucun serveur web requis) pour ensuite nous informer si notre méthode Action NumberController.IsEvenNumber() se comporte correctement:

clip_image024

Note: Avec le dépôt de sources de cette semaine, vous devez tout de même faire le mocking du test de la propriété TempData sur les Controllers. Notre plan est de rendre optionnel le mocking pour faire ces tests avec le dépôt du Preview 3 d’ASP.NET MVC dans quelques semaines.

Méthode d’aide MapRoute

Les règles de routage d’URL dans les applications ASP.NET MVC sont typiquement déclarées dans la méthode « RegisterRoutes » de la classe Global.asax.

Avec ASP.NET MVC Preview 1 et 2, les routes étaient ajoutées dans des collections de routes en instanciant un objet Route directement tout en le liant à une classe MvcRouteHandler et en activant les propriétés appropriées pour déclarer les règles de routages :

clip_image026

Le code ci-dessus va continuer de fonctionner à l’avenir. Par contre, vous pouvez tirer avantage de la nouvelle méthode d’aide « MapRoute » qui offre une syntaxe grandement simplifiée pour arriver au même résultat. Ci-dessous, la route URL définit par convention et configure par défaut lorsque vous créer un nouveau projet ASP.NET MVC (ce qui remplace le code ci-dessus) :

clip_image028

La méthode d’aide MapRoute() est surchargée et accepte deux, trois ou quatre paramètres (nom de la route, Syntaxe URL, paramètre URL par défaut et des paramètres restrictifs pour les URL avec des expressions régulières). 

Vous pouvez appelé MapRoute() aussi souvent que vous désirez enregistrer plusieurs routes nommées dans le système. Par exemple, en plus de la règle conventionnelle par défaut, nous pourrions ajouter une règle nommée « Products-Browse » comme ci-dessous :

clip_image030

Nous pouvons ensuite référencer cette la règle « Products-Browse » explicitement dans nos controllers et View lorsque nous désirons y générer un URL. Par exemple, nous pourrions utiliser la View d’aide Html.RouteLink pour indiquer que nous voulons lier notre route « Products-Browse » et lui passer un paramètre de catégorie "Food" en utilisant le code dans notre template View comme ci-dessous :

clip_image032

Cette View d’aide va donc accède le système de routage et générer l’hyperlien HTML approprié comme ci-dessous (note : voyez comment la substitution automatique du paramètre de la catégorie dans l’URL ces produites en utilisant la règle de routage):

clip_image034

Note: Avec le dépôt de sources de cette semaine, vous devez passer le Controller et le paramètre Action (en plus du paramètre Category) à la méthode d’aide Html.RouteLink() pour résoudre la bonne route URL à générer. Dans le dépôt d’ASP.NET MVC Preview 3 d’ici quelques semaines, ceci ne sera plus nécessaire et il vous sera possible d’utiliser Html.RouteLink exactement comme je l’ai écrit ci-dessus pour résoudre la route.

Autres fonctionnalités de mappage de route URL

Le dépôt de source MVC de cette semaine supporte plusieurs nouvelles fonctionnalités de mappage de route URL. Vous pouvez maintenant inclure « - », « . », « ; » ainsi que n'importe quels autres caractères que vous désirez au sein de vos règles de routes.

Par exemple, en utilisant un séparateur « - » vous pouvez maintenant analyser la langue et les valeurs locales séparément en utilisant une règle comme ci-dessous :

clip_image036

Ceci passerait les paramètres « language », « locale » et « category » appropriés à la méthode Action ProductsController.Browse quand elle est invoquée :

Règle de routage URL

Exemple d’URL

Paramètres passés à la règle

{language}-{locale}/products/browse/{category}

/en-us/products/browse/food

language=en, locale=us, category=food

/en-uk/products/browse/food

language=en, locale=uk, category=food

Ou vous pouvez utiliser le type d’extension de fichier « . » à la fin d’un URL pour déterminer s’il faut produite le résultat en format XML ou HTML :

clip_image038

Ceci passerait un paramètre « category» et un paramètre « format» à la méthode Action ProductsController.Browse lorsque qu’invoquée :

Règle de routage URL

Exemple d’URL

Paramètres passés à la règle

products/browse/{category}.{format}

/products/browse/food.xml

category=food, format=xml

/products/browse/food.html

category=food, format=html

ASP.NET MVC Preview 2 faisait l’introduction des wildcard dans les règles de routage. Par exemple, vous pouvez indiquez dans une règle de passer tout le contenu URI restant en tant que paramètre nommé à une méthode Action :

clip_image040

Ceci passerait un paramètre « contentUrl » à la méthode Action WikiController.DisplayPage, lorsqu’invoquée :

Règle de routage URL

Exemple d’URL

Paramètres passés à la règle

Wiki/Pages/{*contentUrl}

/Wiki/Pages/People/Scott

contentUrl="People/Scott"

/Wiki/Pages/Countries/UK

contentUrl="Countries/UK"

Ces wildcard de routes fonctionnent toujours bien avec le Preview de cette semaine et peuvent être très pratiques lorsque que vous développez des applications de blogage,wiki, cms ou autre système base sur le contenu.

Prenez note qu’en plus d’utiliser le nouveau système de routage pour les scénarios ASP.NET MVC, nous utilisons maintenant le même système de routage pour ASP.NET Dynamic Data (qui utilise les web forms d’ASP.NET).

En résumé

Espérons que l’article ci-dessus apporte un aperçu de quelques-unes des nouvelles fonctionnalités et changement exposé dans le dépôt de sources actualisées d’ASP.NET MVC de cette semaine. 

Vous pouvez le télécharger ici et commencer à l’utiliser dès maintenant. Vous pouvez aussi attendre quelques semaines pour le dépôt officiel d’ASP.NET MVC Preview 3 qui devrait inclure encore plus de fonctionnalités (dont les commentaires reçus des usagers à propos du dépôt de cette semaine), un installateur simplifié, une meilleure intégration dans VS et une documentation mise à jour.

Pour toutes questions/problèmes concernant le dépôt de cette semaine d’ASP.NET MVC, assurez-vous de consulter le forum ASP.NET MVC sur www.asp.net.

En espérant que ceci vous soit pratique,

Scott

Alexandre Mensi - Article original par Scott Guthrie

Published Tuesday, April 22, 2008 10:51 AM by loicbar
Filed under: , ,

Comments

# re: Les sources du Preview d’ASP.NET MVC actualisées

Wednesday, March 4, 2009 1:11 AM by ...

Interessante Informationen.

# re: Les sources du Preview d’ASP.NET MVC actualisées

Sunday, March 15, 2009 5:42 PM by ...

Sehr wertvolle Informationen! Empfehlen!

# re: Les sources du Preview d’ASP.NET MVC actualisées

Wednesday, October 31, 2012 11:23 PM by canada goose jacket

Thanks for your whole labor on this blog. My mother take interest in getting into research and it's easy to see why. Almost all notice all about the dynamic means you present simple secrets on this website and therefore strongly encourage response from other ones on this subject matter then my daughter is in fact learning a whole lot. Have fun with the remaining portion of the year. You're conducting a remarkable job.

# re: Les sources du Preview d’ASP.NET MVC actualisées

Thursday, December 6, 2012 8:16 AM by moncler schweiz

as usual during a ceasefire, makes it more unlikely that this war on Gaza will end soon. Al-Jaffari was somewhat Israel's subcontractor because he was

# re: Les sources du Preview d’ASP.NET MVC actualisées

Tuesday, April 16, 2013 7:46 PM by jfkd

I believe  avoiding processed foods will be the first step for you to lose weight. They could taste very good, but processed foods contain very little nutritional value, making you take more simply to have enough vitality to get throughout the day. If you're constantly having these foods, converting to whole grains and other complex carbohydrates will help you to have more vitality while having less. Great blog post.