Sortie d’ASP.Net MVC 3 RC2

Il y a quelques jours est sortie la version RC2 d’ASP.Net MVC 3, cette troisième, et toujours plus aboutie, version du modèle Modèle-Vue-Contrôleur appliqué au Web et utilisant la technologie ASP.Net.

Bien avant de travailler pour Microsoft, j’avais pour métier de développer des applications Web pour le milieu bancaire. Dans ce contexte, j’utilisais exclusivement ASP.Net standard et fut tout excité à la sorte de première version d’ASP.Net MVC. Malheureusement, je me suis rapidement confronté à des limitations qui m’empêchaient de faire facilement avec ce nouveau ASP.Net MVC ce que je faisais en ASP.Net standard.

Les choses ont bien changées car aujourd’hui, ASP MVC 3 est plus complet que jamais et améliore une version 2 qui faisait déjà partie du fleuron du développement Web. Ceux qui comme moi avaient parié sur ASP.Net MVC devraient être rassurés sur leur choix.

Voici donc une présentation des principales nouveautés d’ASP.Net MVC 3

Un nouveau moteur de rendu : Razor

Il est difficile de parler d’ASP.Net MVC 3 sans commencer par parler de son nouveau moteur de rendu nommé Razor. Ce moteur de rendu, ou plutot ce moteur de template, permet de simplifier le code XHTML de vos vues pour y insérer plus facilement du code inline. Et oui, le principe de tout mettre en code-behind n’étant pas le but du pattern MVC, il est nécessaire de mettre votre logique d’affichage au sein de la vue. Ce nouveau moteur va vous permettre de rendre le code plus lisible, moins verbeux et de mieux différencier le code “statique” XHTML du code C#.

le typage de vos pages

Là où le typage en ASP.Net MVC 1 était verbeux

 <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/OneColumn.master" Inherits="System.Web.Mvc.ViewPage<lgmorand.model.Book>" %>

Celui est devenu très simple avec Razor

 @model lgmorand.model.Book

Plus d’héritage inutile ou encore de déclaration de masterpage, celle-ci étant devenue implicite.

Le code inline

Là encore, le code est épuré au maximum. Vous aviez

 <table>
    <tr>
    <% foreach (var item in Model) { 
           if(count %3 == 0 && count !=0)    
           Response.Write("</tr><tr>");
     %>
    
    <td style="width:33%" align="center">
        <a href="../Books/Details/<%= Html.Encode(item.Id) %>" rel="#overlay2"> 
            <img src="../../HttpHandlers/Image.ashx?ID=<%=item.IMAGES.Id %>&thumb=1" alt="cover" class="bordered cover"  />
            <br /><%= Html.Encode(item.Title) %>
            
        </a>
        <br /><img src="../../Content/Images/note/kitstars-<%=item.Note %>.gif" alt="<%=item.Note %>" />
    </td>
    
    <%
    count++;
       } 
     %>
    </tr>
</table>

Pour devenir

 <table>
    <tr>
    @foreach (var item in Model) 
    {
        if (count != 0 && count % 3 == 0)
        { 
            @:</tr><tr> 
        }
            
        
                <td style="width:33%" align="center">
                    <a href="../Books/Details/@(item.Id)" rel="#overlay2"> 
                        <img src="../../HttpHandlers/Image.ashx?ID=@item.Images.Id&thumb=1" alt="cover" class="bordered cover"  />
                        <br />@item.Title
            
                    </a>
                    <br /><img src="../../Content/Images/note/kitstars-@(item.Note).gif" alt="@item.Note" />
                </td> 
        
            count++;
        
       } 
     
    </tr>
</table>

Plus facile à lire, plus facile à éditer.

La mise en page

Là encore, sans rien changer au principe de mise en page d’ASP.Net (avec masterpages ou contentplaceholders)

La masterpage est devenue implicite et pas défaut, chacune de vos vues utilisera votre masterpage à moins que vous ne surchargiez les paramètres de la pages pour la supprimer ou en définir une autre :

 @{
    Layout = "~/Views/Shared/_OneColumnLayout.cshtml";
}

Quant aux contentplaceholders, ceux-ci sont devenus des sections, qui plus est, peuvent être optionnels. Là où vous aviez:

 <asp:Content ID="Content3" ContentPlaceHolderID="contentBodyCustomSub" runat="server">
class='sub'
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="contentHeaderCustomSub" runat="server">
class='sub'
</asp:Content>

<asp:Content ID="Content4" ContentPlaceHolderID="BlueTopSub" runat="server">
</asp:Content>

Vous aurez (en remarquant que BlueTopSub n’a pas besoin d’être défini)

 @section contentBodyCustomSub
{
    class='sub'
}

@section contentHeaderCustomSub
{
    class='sub'
}

Pour finir, des améliorations sur l’intégration de Razor dans Visual Studio. Si des menus contextuels pour la création de vue ou de contrôleurs étaient déjà présents, c’est maintenant des fenêtres de création de projet ou de création de vue qui ont été revus et améliorés.

image

A noter que Razor supporte le CHTML pour le C# et le VBHTML pour le VB.Net, chacun ayant les mêmes fonctionnalités mais de légères différences quant aux directives.

Les nouveautés de l’UI

Comme vu précédemment, Razor s’intègre parfaitement aux différentes nouvelles fenêtres utilisées au sein de Visual Studio. Il en va de même pour l’intégration des moteurs de rendu car ASP.Net MVC 3 permet de définir soi-même son propre “view-engine”.

 

Nouveautés concernant la validation

Il est maintenant possible de désactiver la validation d’un champ notamment lorsque celui-ci va contenir du code HTML. Il suffit dorénavant d’appliquer l’attribut [SkipRequestValidation] sur la propriété correspondante du modèle validé.

La validation distante : grosse nouveauté, celle-ci permet de valider une partie du formulaire en faisant un appel serveur limité. Pour plus de clarté et surtout pour découvrir son implémentation, je vous renvoie vers un tutoriel online.

Nouveautés diverses

Le support des redirections permanentes : l’utilisation de HttpNotFoundResult, de HttpRedirectResult  et de HttpStatusCodeResult vont vous permettre de contrôler les redirections de vos applications Web.

 public ActionResult NotFound()
{
    return HttpNotFoundResult();
}

De nouveaux helpers : des helpers pour inclure Twitter, Captcha, Bing, Gravatar, Analytics, inclure des vidéos player, etc

 @Twitter.Profile("lgmorand");

Amélioration de l’injection de dépendance : quasiment tous les éléments peuvent être substitués par IoC (Controlleurs, Vues, Action Filters, Model Binders, Value Providers, Validation Providers, et Model metadata Providers )

Les propriétés de View dynamique : le principe est simple, la vue est devenue un objet dynamique sur lequel vous pouvez ajouter des objets directement. Ainsi au lieu de faire ViewData[“valeur”] = “ce que vous voulez”, vous aurez dorénavant ViewBag.Valeur=”ce que vous voulez”;

Pour un exemple plus parlant, je vous renvoie au blog d’Hajan.

Voici donc une liste des nouveautés qui m’ont le plus plu dans cette nouvelle version et si jamais vous n’avez pas encore sauté sur l’occasion d’aller tester cette release, il est temps de le faire!

et le plus dur : patienter jusqu’à la sortie de la version finale :)