Nos artigos anteriores desta série, vimos uma série de conceitos fundamentais relacionados a construção de aplicações sob a framework ASP.NET MVC. Entendemos como funciona o roteamento de urls, como se dá a interação entre os módulos de uma aplicação MVC, como se dá o acesso a dados em uma aplicação MVC com o Entity Framework 4 e como é possível validar informações de formulários utilizando Data Annotations. Caso não tenha efetuado a leitura dos artigos anteriores e não possua os conhecimentos equivalentes, recomendo fortemente a leitura destes. Os links para eles podem ser encontrados abaixo.
- ASP.NET MVC – Início, Meio e Fim – Parte 1 – Conhecendo a framework ASP.NET MVC
- ASP.NET MVC – Início, Meio e Fim – Parte 2 – Criando nossa primeira aplicação
- ASP.NET MVC – Início, Meio e Fim – Parte 3 – Criando nosso primeiro controller
- ASP.NET MVC – Início, Meio e Fim – Parte 4 – Acessando e manipulando dados com EF4
- ASP.NET MVC – Início, Meio e Fim – Parte 5 – Validando informações com Data Annotations
Neste artigo, veremos de forma simplificada como podemos criar rotas personalizadas para nossas aplicações ASP.NET MVC e qual a utilidade deste recurso para aplicações específicas.
A importância das rotas
Umas das principais características do ASP.NET MVC é proporcionar ao desenvolvedor flexibilidade no processo de construção de suas aplicações web.
Por default, a framework disponibiliza um padrão de roteamento, entrentanto, este não precisa necessariamente ser adotado para a aplicação. Para a maioria das aplicações ASP.NET MVC, o padrão de roteamento fornecido pela framework (vide Listagem 1) atende as necessidades, entretanto, para algumas aplicações este padrão não pode ser aplicado e, neste cenário, surge a necessidade de adicionar/personalizar rotas.
[csharp]
routes.MapRoute(
“Default”, // Route name
“{controller}/{action}/{id}”, // URL with parameters
new { controller = “Home”, action = “Index”, id = UrlParameter.Optional } // Parameter defaults
);
[/csharp]
Listagem 1: Rota padrão fornecida pela framework MVC
O trecho de código apresentado pela Listagem 1 pode ser encontrado no arquivo Global.asax de seu projeto. Para o modelo proposto, a framework roteará as solicitações do browser da seguinte forma: http://seudominio/controller/action/valor. Vamos imaginar, por exemplo, que quiséssemos uma estrutura de loja virtual, onde precisamos de uma url definida da seguinte forma: http://lojavirtual.com.br/eletronicos/games/consoles/xbox/ ou então algo do tipo, http://meublog/Arquivo/10-01-2011. O modelo padrão de roteamento apresentado pela Listagem 1 não se adequaria aos cenários propostos, correto?
Para que possamos entender como se dá este processo de construção de rotas personalizadas, construiremos uma nova aplicação ASP.NET MVC e adicionaremos uma nova instância de rota de modo a satisfazer o segundo cenário proposto, ou seja, a rota deverá atender a seguinte url: http://meublog/Arquivo/10-01-2011. Finalmente, efetuaremos os testes para verificar o sucesso desta aplicação.
Trabalhando com rotas personalizadas
O primeiro passo consiste na criação do novo projeto. Crie um projeto do tipo “ASP.NET MVC 2 Web Application” e nomeie-o conforme a conveniência. A Figura 1 apresenta este processo.
Figura 1: Criando o novo projeto “RotasPersonalizadasBlog”
Na Solution Explorer de seu projeto, dê um duplo clique sobre o arquivo “Global.asax“. O código apresentado por este arquivo deve ser semelhante aquele apresentado pela Listagem 2.
[csharp]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace RotasPersonalizadasBlog
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);
routes.MapRoute(
“Default”, // Route name
“{controller}/{action}/{id}”, // URL with parameters
new { controller = “Home”, action = “Index”, id = UrlParameter.Optional } // Parameter defaults
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
}
}
}
[/csharp]
Listagem 2: Código gerado pela framework em Global.asax
No primeiro e no segundo artigo desta série falamos detalhadamente sobre cada linha importante deste arquivo. Basicamente, temos a criação e registro da rota padrão da aplicação. O que faremos a seguir é, incluir uma nova instância de roteamento para a aplicação. Assim, quando a url http://meublog/Arquivo/10-11-2011 for chamada, a framework a roteará por padrão. Assim, na linha 18 do código apresentado pela Listagem 2, adicione o trecho de código apresentado pela Listagem 3.
[csharp]
routes.MapRoute(
“BlogRoute”,
“/Arquivo/{DataEntrada}”,
new { Controller = “Arquivo”, Action = “Entrada” }
);
[/csharp]
Listagem 3: Adicionando uma nova instância de rota “BlogRoute”
Como é possível notar na Listagem 3, estamos adicionando uma nova rota chamada “BlogRoute”, estamos dizendo que a url padrão a ser roteada é “/Arquivo/{DataEntrada}” e os valores padrão são “Controller = “Arquivo”, Action = “Entrada””. A Listagem 4 apresenta o código completo do arquivo “Global.asax“.
[csharp]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace RotasPersonalizadasBlog
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);
routes.MapRoute(
“BlogRoute”,
“/Arquivo/{DataEntrada}”,
new { Controller = “Arquivo”, Action = “Entrada” }
);
routes.MapRoute(
“Default”, // Route name
“{controller}/{action}/{id}”, // URL with parameters
new { controller = “Home”, action = “Index”, id = UrlParameter.Optional } // Parameter defaults
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
}
}
}
[/csharp]
Listagem 4: Código final do arquivo Global.asax
Uma observação importante é a ordem de inserção da nova instância. Note, temos primeiro a nova rota (BlogRoute) e depois a rota padrão (Default). Isso indica a framework que a rota a ser considerada primeiro é “BlogRoute” e não “Default”. Vamos agora criar o controller “Arquivo”, responsável por retornar o post da data de entrada. Para isto, clique com o botão direito do mouse sobre a pasta “Controllers“, em seguida “Add” e “Controller“. Nomeie-o como “ArquivoController” e pressione “OK”. Em seguida, substitua o conteúdo do controller recém criado por aquele apresentado pela Listagem 5.
[csharp]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace RotasPersonalizadasBlog.Controllers
{
public class ArquivoController : Controller
{
//
// GET: /Arquivo/
public ActionResult Entrada(DateTime DataEntrada)
{
ViewData[“Mensagem”] = “A data de entrada foi: ” + DataEntrada.ToString();
return View();
}
}
}
[/csharp]
Listagem 5: Controller que trata a requisição tendo a data como parâmetro
O código da Listagem 5 é extremamente simples. Note que, ao criarmos o controller, informamos que o parâmetro de entrada é “DataEntrada” e este, é um objeto “DateTime“. É importante frisar que, ao informarmos na url por exemplo, http://meublog/Arquivo/10-01-2010, a framework automaticamente entende este último valor como DateTime, assim, qualquer outro tipo de parâmetro que a framework não consiga converter, acarretará em erro no momento do processamento, conforme ilustra a Figura 3. A Figura 2 apresenta a aplicação em execução e o correto funcionamento da mesma.
Figura 2: View retornando o valor esperado de acordo com a url
Figura 3: Erro ao chamar a url com parâmetros incorretos
É importante obervar que existem diversos outros aspectos relacionados ao roteamento de aplicações MVC. Dentre as muitas opções que possuímos para trabalharmos com rotas, destacam-se: possibilidade de criação de rotas personalizadas, validação de rotas, etc. Como esta série é introdutória, este artigo não aborda aspectos avançados, entretanto, em artigos futuros, estes e outros assuntos poderão ser abordados :-).
Bom pessoal, vamos ficando por aqui. Quaisquer dúvidas, por favor, entre em contato comigo através da seção de contato deste site, do twitter ou do facebook. Na medida do possível, terei o maior prazer em respondê-los. Não se esqueça de deixar seus comentários. Eles são muito importantes para a melhoria do conteúdo gerado neste site.
Pingback: ASP.NET MVC – Início, Meio e Fim – Parte 6 | .NET Interior