O assunto do artigo de hoje terá uma série de 3 outros posts começando pelo de hoje que é a customização de rotas em aplicações ASP.NET MVC.

O que são Rotas?

Imagine uma rota no ASP.NET MVC como sendo um alias, um direcionamento para determinada ação possa ser executada. Essas rotas são adicionadas em uma coleção com baseem um Controller e uma Action – Método público no Controller. Essas rotas são definidas por meio do arquivo Global.asax, o qual possui o método** RegisterRoutes()** responsável pelo registro e configuração das rotas necessárias para que sua aplicação possa funcionar.

Estrutura de uma Rota

Uma rota possui uma estrutura básica do tipo: {controller}/{action}, mas o que isso quer dizer? Quer dizer que o primeiro parâmetro, obviamente será o nome do nosso controller sem o Sufixo Controller e o segundo parâmetro será uma action, que nada mais é do que um método públic do Controller. Essa é uma estrutura de rota simples, onde a action não tem nenhum parâmetro.

Um outro exemplo de rotas que pode ser configurada é onde temos basicamente a mesma estrutura da rota acima porém informando o parâmetro que queremos passar para a action. O parâmetro não precisa ser obrigatório, você pode não passar valores pra ele, por meio da configuração com o tipo enumerado: UrlParameter.Optional. Abaixo segue um exemplo de configuração de rota com parâmetro opcional:

routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional }
// Parameter defaults );

A configuração acima é bem básica e é o roteamento que é configurado com o template de um novo projeto de aplicação ASP.NET MVC 3. Mas podemos criar nossas próprias configurações de rotas de uma maneira bem simples.

Criando Rota Customizada

Inicie um novo projeto ASP.NET MVC 3, e crie um controller como mostrado no código abaixo:

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Dynamic; namespace Mvc3CustomizingRouting.Controllers {
    public class ComprasController : Controller
    { // // GET: /Compras/
        public ActionResult Compras(DateTime dataCompra)
        {
            // Código Suprimido para facilitar o POST.
        }
    }
}

Como você pode observar, trata-se de um Controller bastante simples, porém temos uma Action que recebe um parâmetro do tipo DateTime chamado dataCompra. O Código de implementação da action foi suprimido para diminuir o tamanho do POST, mas logo mais iremos mostrar como foi a implementação. Bem, esse é um método do tipo GET, ou seja, toda vez que for realizada uma requisição ao Controller ComprasController chamando a Action Compras neste caso, estamos requerindo a passagem de algum valor para o parâmetro dataCompra, pois o tipo não é um *Nullable *e não iremos informar que o parâmetro seja opcional.

Criado o controler, crie uma view para a action Compras, conforme o código abaixo:

@model IEnumerable<System.Dynamic.ExpandoObject> @{ ViewBag.Title = "Compras"; } <h2>Compras</h2>
@{
    foreach (dynamic item in Model)
    {
        Código da Compra: @item.Id <br /> Data da Compra: @item.Data <br /> Total da Compra: R$ @item.Total <br /> <br />
    }
}

O código acima tem como Model um objeto dinâmico do tipo ExpandoObject uma classe nova, a qual trabalha em conjunto com o tipo dynamic. Estamos tipando nosso Model com um tipo dinâmico, pois no nosso Controller, também estamos repassando uma lista de ExpandoObject. Conforme o código abaixo (Código de implementação da Action Compras):

List<ExpandoObject> listaCompras = new List<ExpandoObject>(); dynamic compra = null; compra = new ExpandoObject(); compra.Id = 1; compra.Data = new DateTime(2011, 02, 15); compra.Total = 1500.00; listaCompras.Add(compra); compra = new ExpandoObject(); compra.Id = 2; compra.Data = new DateTime(2011, 01, 13); compra.Total = 15000.00; listaCompras.Add(compra); compra = new ExpandoObject(); compra.Id = 3; compra.Data = new DateTime(2011, 01, 10); compra.Total = 500.00; listaCompras.Add(compra); return View(listaCompras);

Quando precisamos criar algum objeto de forma dinâmica é através do ExpandoObject e da palavra-chave dynamic que construímos objetos desta natureza. Bem, agora que já temos nosso controller, view e implementados é hora de configurarmos a nossa nova rota, no arquivo Global.asax. Abaixo segue a configuração da nova rota:

public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Compra", // Route name "Compras/{dataCompra}", // URL with parameters new { controller = "Compras", action = "Compras" } // Parameter defaults ); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults ); }

Preferi colocar a implementação por completo do método RegisterRoutes para que você possa tomar conhecimento de como fica a implementação final deste método com nossa nova rota customizada.

A rota tem como nome Compra e está definido de maneira fixa o nome do controller Compras, logo em seguida tempos a configuração do parâmetro, parâmetro esse que será repassada para a action Compras. Como você pode ver, não estamos configurando o nosso parâmetro da rota, **dataCompra **como sendo opcional, ou seja, por default ele será mandatório. Vamos ver como fica a chamada pelo site?

Site sendo executado chamando o ComprasController passando uma data válida e a lista será renderizada pela View, como mostrado na imagem abaixo:

Código Fonte

Até a próxima!