Criando Routes em WebForms

<< Click to Display Table of Contents >>

Navigation:  ASP.NET > Dicas avançadas >

Criando Routes em WebForms

Previous pageReturn to chapter overviewNext page

Para fazer isso é necessário programar as rotas no Global.asax

O resto é fácil de "carregar" ou "enviar" um identificador através de rota.

 

Global.asax

 

<%@ Import Namespace="System.Web.Routing" %>

 

  public static void RegisterRoutes(RouteCollection routes)

   {

      // default é o nome (tipo um nome de variável - unico)

      // Home é o que vai ser escrito no URL (ex: www.site.com.br/Home)

      // ~/Default.aspx é pra onde vai ser redirecionado

       routes.MapPageRoute("default", "Home", "~/Default.aspx");

 

      // www.site.com.br/Sobre -> www.site.com.br/About.aspx

       routes.MapPageRoute("about", "Sobre", "~/About.aspx");

 

      // www.site.com.br/Produto/10 -> www.site.com.br/Produto.aspx?id=10

      // observe o {id}, indica que depois de Produto na URL o próximo item será

      // identificado como id, e tem um valor default "1" - veja ultimo parâmetros

       routes.MapPageRoute("produtos", "Produto/{id}", "~/Produto.aspx", false,

         new RouteValueDictionary { { "id", "1" } });

 

      // pode se ter "N" níveis, neste temos categoria também (observe que o idenficador

      // unico é "produtos2"

      // www.site.com.br/Produto/10/Eletro -> www.site.com.br/Produto.aspx?id=10&categoria=Eletro

       routes.MapPageRoute("produtos2", "Produto/{id}/{categoria}", "~/Produto.aspx", false,

         new RouteValueDictionary { { "id", "1" }, { "categoria", "nenhuma" } });

   }

 

  void Application_Start(object sender, EventArgs e)

   {

       RegisterRoutes(RouteTable.Routes);

   }

 

Default.aspx

 

  <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br />

    <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Consulta" />

 

Default.aspx.cs

 

  protected void Button1_Click(object sender, EventArgs e)

   {

       Response.RedirectToRoute("produtos", new { id = TextBox1.Text });

      // vai abrir: www.site.com.br/Produto/X onde X será o conteúdo do textbox

   }

 

Produtos.aspx

 

      <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><br />

      <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Retornar" />

 

 

Produtos.aspx.cs

 

  protected void Page_Load(object sender, EventArgs e)

   {

      // mostra num label o id recebido, se passar só www.site.com.br/Produto

      // o id será 1 conforme definido no padrão nos routes

       Label1.Text = Page.RouteData.Values["id"].ToString(); // ATENÇÃO - não é QUERYSTRING

   }

 

  protected void Button1_Click(object sender, EventArgs e)

   {

      // retorna para Default.aspx (conforme a rota)  www.site.com.br/Home

       Response.RedirectToRoute("default");

   }

 


 

Seguindo o exemplo acima, se passar num url: www.site.com.br/Produto/10/Celulares

 

Produtos.aspx.cs

 

  protected void Page_Load(object sender, EventArgs e)

   {

       Label1.Text = Page.RouteData.Values["id"].ToString();       // 10

  Label2.Text = Page.RouteData.Values["categoria"].ToString(); // Celulares

   }

 

Para mostrar num label direto no aspx as variáveis

 

    <asp:Label runat="server" ID="Label2" Text="<%$RouteValue:id%>" />

    <asp:Label runat="server" ID="Label3" Text="<%$RouteValue:categoria%>" />

 

Para montar o URL numa string

 

   string url = Page.GetRouteUrl("produtos", new { id = 8 }); // = www.site.com.br/Produto/8

 

Para colocar um componente Hiperlink para apontar para o Home:

 

  <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="Home">Home</asp:HyperLink>

 

Atenção - se no servidor não funcionar, remova e re-adicione o módulo no Web.Config

 

    <system.webServer>

        <modules>

            <remove name="UrlRoutingModule-4.0" />

            <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />

        </modules>

    </system.webServer>

 


 

Programação in-line com rotas

 

Global.asax

 

        void Application_Start(object sender, EventArgs e)

        {

            // Code that runs on application startup

            RouteTable.Routes.MapPageRoute("StoreRoute","BookStore/{Name}","~/Webpages/BookStore/ViewBookDemo.aspx");

            RouteTable.Routes.MapPageRoute("mytool", "tools/{Name}","~/tools/tools.aspx");

        }

 

Default.aspx

 

       <a href="<%=GetRouteUrl("StoreRoute", new {Name = "CSS"}) %>">Click Here to go to bookstore</a>.

       <a href="<%=GetRouteUrl("mytool", new {Name = "toolx"}) %>">Click Here to go to tools</a>.