Routing med ASP.NET 4.0 Web Forms

En nyhet i ASP.NET 3.5 SP 1 var stödet för ASP.NET Routing (System.Web.Routing). Det används som standard i ASP.NET MVC, men går även att använda med Web Forms. I ASP.NET 3.5 är det ganska krångligt att implementera det då inte all funktionalitet för det finns implementerad som standard, utan man är tvungen att skriva egna RouteHandlers, eventuella Expression Builders m.m.

I ASP.NET 4.0 så blir det dock mycket enklare. Nyheter här är bl.a. PageRouteHandler och Expression Builders för ASP.NET MVC. Jag ska visa ett exempel där vi med väldigt lite kod kan implementera stöd för Routing i en Web Forms-baserad webbsida med hjälp av ASP.NET 4.0.

Jag förutsätter att du har en viss kunskap om ASP.NET Routing, genom exempelvis ASP.NET MVC innan du läser vidare, annars kan det bli svårt att förstå exakt vad som händer.

Det första vi behöver är en Web Application baserad på ASP.NET 4.0. Till denna behövs en Global.asax.

Nästa steg är att lägga till några nycklar i web.config.

Under httpModules så behöver vi en referens till UrlRoutingModule, vilken går igenom alla angivna routes och ser om någon av dem passar in på URL:en som har angivits:

<add name="RoutingModule" type="System.Web.Routing.UrlRoutingModule"/>

Nästa steg är att under Compilation lägga till två ExpressionBuilders som vi kommer att använda oss utav:

<expressionBuilders>
    <add expressionPrefix="RouteUrl" type="System.Web.Compilation.RouteUrlExpressionBuilder"/>
    <add expressionPrefix="RouteValue" type="System.Web.Compilation.RouteValueExpressionBuilder" />
</expressionBuilders>

RouteUrl gör det möjligt att generera en URL anpassad för en viss Route I vår RouteTable. RouteValue ger funktionalitet för att direkt på sidan kunna skriva ut ett värde som har kommit genom vår Route.

För att kunna specifiera vilka Routes vi vill använda och lägga till dem i vår RouteTable så behöver vi detta i Global.asax:

using System;
using System.Web.Routing;
 
namespace Routing
{
    public class Global : System.Web.HttpApplication
    {
        protected void Application_Start(object sender, EventArgs e)
        {
            RouteTable.Routes.Add("UsersPaging", new Route("users/{page}", new PageRouteHandler("~/Default.aspx")));
        }
    }
}

Här skapar vi upp en Route som har syftet att visa en lista på användare, samt ge stöd för paging. Den pekas om till Default.aspx, men skulle självklart kunna leda till vilken sida som helst och ha hur många parametrar vi än vill ha.

Nu har vi allt vi behöver och kan utan problem surfa till http://localhost/sidan/users/4 för att komma till sida 4 i listningen.

För att kunna generera en länk till users/4 automatiskt baserat på hur Routen är specifierad så kan vi använda RouteUrl-Expression Buildern (ber om ursäkt för svengelskan):

<asp:HyperLink runat="server" NavigateUrl="<%$ RouteUrl:RouteName=UsersPaging, page=4 %>"
        Text="Lista användare, sidan 4" />

Länken ovan pekar till Routen med namn “UsersPaging” och skickar med parametern “page” som har fått ett värde satt till “4”. Om vi kör sidan så kan vi se att den här länken har genererats:

<a href="/users/4">Lista användare, sidan 4</a>

Det vi vill göra nu är att visa alla användare på sidan 4 om ett värde är satt i page-parametern. För det så kan vi ha något i stil med:

<asp:Panel ID="pnlUsers" runat="server">
    <h1>
        Användare, sidan
        <asp:Literal runat="server" Text="<%$ RouteValue:page%>" />
    </h1>
    <ul>
        <li>Användare 1</li>
        <li>Användare 2</li>
        <li>Användare 3</li>
        <li>Användare 4</li>
        <li>Användare 5</li>
    </ul>
</asp:Panel>

Här använder vi den andra Expression Buildern, RouteValue, för att visa värdet för page-parametern direct på sidan.

För att kunna dölja panelen när värdet inte har angivits så kan vi från Code Behind hämta RouteDatan:

using System;
 
namespace Routing
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string page = RouteData.Values["page"] as string;
            pnlUsers.Visible = !String.IsNullOrEmpty(page);
        }
    }
}

Här hämtar vi programmatiskt i Code Behind page-parametern och visar bara panelen om den har ett värde.

2 Comments

  • coolt att det funkar i web forms också! =)

    du får dock gärna ta en titt på kodblocken igen och se till så att all text syns. som det är nu måste man kopiera till typ notepad för att se slutet på några av raderna... (kanske bara lägga till overflow: auto; i stilmallen? ;) )

  • I know. Ska försöka fixa ett bättre tema i bloggen som är lite bredare. :-)

Comments have been disabled for this content.