Arquivo da tag: routing

ASP.NET Routing

aspnet-tutorial1O uso de URL amigáveis nos sites vem aumentando, principalmente após o surgimento do SEO – Search Engine Optimization. Este tipo de URL facilita a indexação pelos motores de busca e também para o usuário relembrar a URL que acessou.

Em ASP.NET a construção de URL amigaveis se dá por meio de Routings. Numa aplicação Web sem mapeamento de rotas, normalmente a solicitação de um navegador ocorre para um arquivo físico (página aspx): http://www.meusite.com.br/produtos.aspx?categoria=1001, sendo que a programação contida na página recupera o parâmetro por QueryString para tratar de forma dinâmica o conteúdo a ser enviado ao cliente.

Ao trabalhar com rotas, define-se padrões na organização da URL, não especificando o nome da página física que tratará a requisição, diferente do citado acima.

Uma sugestão de URL amigável para a URL tratada acima: http://www.meusite.com.br/produtos/categoria/informatica/smartphone, onde o padrão é http://www.meusite.com.br/produtos/categoria/{nome da categoria}/ {nome da subcategoria}. Desta forma, não é identificado o arquivo físico e a URL ainda fica mais agradável aos olhos do usuário.

Para implementar rotas em ASP.NET, o primeiro passo é a inclusão do arquivo global.asax ao projeto. O global.asax é uma classe que trata eventos a nível de aplicação e sessão, como por exemplo: quando a aplicação é iniciada ou finalizada, quando um sessão é criada ou destruída etc…

Os padrões de rotas devem ser especificados no evento Application_Start no global.asax, evento que ocorre quando a aplicação é iniciada.

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 ExemploRouting
{
    public class Global : System.Web.HttpApplication
    {

       protected void Application_Start(object sender, EventArgs e)
       {

       }

    }
}

No global.asax temos acesso ao objeto RouterTable que expõe a propriedade Routes, é nesta propriedade que é realizado os registro das rotas da aplicação através do método MapPageRoute.

O método MapPageRoute dá suporte a várias sobrecargas, a mais simples, recebe por parâmetro (1) o nome da rota, (2) o formato/regra da rota, (3) a página física que tratará a requisição da rota, (4) e a indicação se haverá verificação de permissões de segurança para rota (se false, todos os usuários tem acesso e se true, apenas os usuários identificados no web.config).

Um exemplo para criar a rota http://www.meusite.com.br/produtos/categoria/subcategoria:

RouteTable.Routes.MapPageRoute("rotaprodutos", "produtos/categoria/{categoria}/{subcategoria}", "~/produtos.aspx", false);

A expressão {categoria} e {subcategoria} indicam que a rota terá dois valores dinâmicos (espécie parâmetros) que poderão ser recuperados pela página física.

Na regra acima, a requisição para http://www.meusite.com.br/produtos/categoria/informatica/smartphone será direcionada para a página produtos.aspx que receberá como parâmetro os valores “informatica” e “smartphone”, indicando a categoria e subcategoria.

Na página, os parâmetros são recuperados pela propriedade Values do objeto global RouteData, desta forma:

Response.Write(RouteData.Values["categoria"]);
Response.Write(RouteData.Values["subcategoria"]);

Para finalizar, podemos adicionar um quinto parâmetro ao método MapPageRoute, que define o valor padrão dos parâmetros da rota quando não fornecidos:

RouteTable.Routes.MapPageRoute("rotaprodutos", "produtos/categoria/{categoria}/{subcategoria}", "~/produtos.aspx", false, new RouteValueDictionary { { "categoria", "geral" }, { "subcategoria", "todas" } });

Neste exemplos, os valores padrões para categoria e subcategoria será “geral” e “todas”, respectivamente.

Também é posível criar regras de rotas diretamente no IIS (http://www.iis.net/learn/extensions/url-rewrite-module/creating-rewrite-rules-for-the-url-rewrite-module).

Fontes:

  • ASP.NET 4.5 – Curso Completo – Luís Abreu
  • http://msdn.microsoft.com/en-us/library/vstudio/cc668177(v=vs.100).aspx