Routing en ASP.NET 4.0

Utiliser le routing ASP.NET dans une application WebForms
Introduction
Dans ce tutoriel, nous allons découvrir comment utiliser les fonctionnalités de routing de ASP.NET 4 pour permettre l'écriture d'URL lisibles (friendy-urls) dans une application WebForms.


Définition de la table des routes
Le principe du routage consiste à établir une table de règles permettant d'associer des adresses virtuelles à des pages physiques. Cette table est initialisée au démarrage de l'application web et est gérée par la classe System.Web.Routing.RouteTable. Nous allons donc intervenir au niveau de l'événement Application_Start de la classe Global.asax.cs :


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Routing;
using System.Web.Security;
using System.Web.SessionState;
namespace RoutingTutorial
{
public class Global : System.Web.HttpApplication
{
protected void RegisterRoutes(RouteCollection routes) {     
routes.MapPageRoute("","Headlines/{year}","~/News.aspx");
routes.MapPageRoute("NewsRoute","News/{locale}/{year}","~/News.aspx");
routes.MapPageRoute("EventsRoute","Events/{locale}/{year}/{*category}","~/Events.aspx",true,
        new RouteValueDictionary {
            { "locale", "FR" },
            { "year", DateTime.Today.Year.ToString() }
        },
        new RouteValueDictionary {
            { "locale", "[a-z]{2}" },
            { "year", @"\d{4}" }
        });
}
protected void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
}
}
Trois routes ont été définies dans cet exemple :
  • La première route est anonyme. Tout appel à l'adresse vituelle http://monsite/Headlines/ suivie d'un paramètre sera redirigé vers la page News.aspx. Par exemple, http://monsite/Headlines/2010. A noter qu'un appel à l'adresse http://monsite/Headlines sans paramètre se soldera par une erreur 404.
  • La seconde route nommée redirige également les internautes vers la page News.aspx.
  • La troisième route montre la syntaxe la plus avancée de la méthode MapPageRoute. Chaque paramètre est validé par une expression régulière et possède une valeur par défaut.

Création de liens
Les hyperliens peuvent être hardcodés ou générés dynamiquement en utilisant une balise spéciale, $RouteUrl, dans les pages ASPX :


Note : remplacer les crochets [ ] par < et >


[asp:HyperLink ID="HyperLink1" runat="server" 
NavigateUrl="~/Headlines/2010"]Headlines 2010[/asp:HyperLink]
[asp:HyperLink ID="HyperLink2" runat="server" 
NavigateUrl="~/News/BE/2010"]News - Belgium - 2010[/asp:HyperLink]
[asp:HyperLink ID="HyperLink3" runat="server" 
NavigateUrl="~/Events/FR/2010"]Events 2010 (French)[/asp:HyperLink]
[asp:HyperLink ID="HyperLink4" runat="server" 
NavigateUrl="[%$RouteUrl:year=2011%]"]Headlines 2011[/asp:HyperLink]
[asp:HyperLink ID="HyperLink5" runat="server" 
NavigateUrl="[%$RouteUrl:locale=IT,year=2011,routename=NewsRoute%]"]News - Italy - 2011[/asp:HyperLink]
[asp:HyperLink ID="HyperLink6" runat="server"]Events 2011 (German)[/asp:HyperLink]


Bien évidemment, ils peuvent également être construits côté serveur :


namespace RoutingTutorial
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
RouteValueDictionary routeParameters =
    new RouteValueDictionary
    {
        { "locale", "DE" },
        { "year", "2011" },
        { "category", "sport" }
    };
VirtualPathData vpd =                         RouteTable.Routes.GetVirtualPath(null, "EventsRoute", routeParameters);
HyperLink6.NavigateUrl = vpd.VirtualPath;
}
}
}


Récupération des paramètres des URLs
Enfin, il nous reste à voir comment récupérer les valeurs des paramètres dans les pages physiques. Deux techniques sont possibles : via le markup ASPX ou par code côté serveur.


Voici le code de la page News.aspx :


[form id="form1" runat="server"]
[div]
[h1]
News Archive 
[asp:Literal ID="Literal1" Text="[%$RouteValue:locale %]" runat="server"][/asp:Literal], 
[asp:Literal ID="Literal2" Text="[%$RouteValue:year %]" runat="server"][/asp:Literal]
[/h1]
[/div]
[/form]

Et voici le code de la classe Events.aspx.cs :


namespace RoutingTutorial
{
public partial class Events : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
litLocale.Text = Page.RouteData.Values["category"] == null ? "All" : Page.RouteData.Values["category"].ToString();
litYear.Text = Page.RouteData.Values["year"].ToString();
}
}
}


Conclusion
Le routing ASP.NET offre un moyen beaucoup plus simple que les traditionnels handlers HTTP pour effectuer la réécriture des URLs. Ce mécanisme est le coeur du modèle ASP.NET MVC. Il peut néanmoins être utilisé sans aucun problème dans des applications WebForms.

Commentaires