Monday, June 15, 2009 10:30 PM Vimpyboy

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.

Filed under:

Comments

# re: Routing med ASP.NET 4.0 Web Forms

Monday, June 15, 2009 8:00 PM by tomas (a.k.a. svart senap...)

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? ;) )

# re: Routing med ASP.NET 4.0 Web Forms

Monday, June 15, 2009 11:46 PM by Vimpyboy

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

# Två utmärkta artiklar om nyheter i ASP.NET 4.0

Tuesday, June 16, 2009 1:41 AM by Robert Folkesson

Mikael Söderström har skrivit två mycket bra genomgångar av några av de nyheter som kommer i ASP.NET

# Routing med ASP.NET 4.0 Web Forms

Thursday, June 18, 2009 1:48 AM by Dag König

Av Mikael Söderström, Siemens En nyhet i ASP.NET 3.5 SP 1 var stödet för ASP.NET Routing (System.Web.Routing).

# VS2010 och .Net 4.0

Thursday, June 18, 2009 8:41 AM by Fredrik ♥ C#

Det var ett tag sedan betan av VS2010 och .Net 4.0 släpptes, redan nu finns det bra med inlägg som beskriver

Leave a Comment

(required) 
(required) 
(optional)
(required)