Criação de uma restrição de rota (C#)

por Stephen Walther

Neste tutorial, Stephen Walther demonstra como você pode controlar como as solicitações do navegador correspondem às rotas criando restrições de rota com expressões regulares.

Você usa restrições de rota para restringir as solicitações do navegador que correspondem a uma rota específica. Você pode usar uma expressão regular para especificar uma restrição de rota.

Por exemplo, imagine que você definiu a rota na Listagem 1 em seu arquivo Global.asax.

Listagem 1 – Global.asax.cs

routes.MapRoute(
    "Product",
    "Product/{productId}",
    new {controller="Product", action="Details"}
);

A listagem 1 contém uma rota chamada Produto. Você pode usar a rota Produto para mapear solicitações de navegador para o ProductController contido na Listagem 2.

Listagem 2 – Controllers\ProductController.cs

using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
    public class ProductController : Controller
    {
        public ActionResult Details(int productId)
        {
            return View();
        }
    }
}

Observe que a ação Details() exposta pelo controlador Product aceita um único parâmetro chamado productId. Esse parâmetro é um parâmetro inteiro.

A rota definida na Listagem 1 corresponderá a qualquer uma das seguintes URLs:

  • /Product/23
  • /Product/7

Infelizmente, a rota também corresponderá às seguintes URLs:

  • /Product/blah
  • /Product/apple

Como a ação Details() espera um parâmetro inteiro, fazer uma solicitação que contenha algo diferente de um valor inteiro causará um erro. Por exemplo, se você digitar a URL /Product/apple no navegador, receberá a página de erro na Figura 1.

A caixa de diálogo Novo Projeto

Figura 01: Ver uma página explodir (clique para exibir a imagem em tamanho real)

O que você realmente deseja fazer é corresponder apenas às URLs que contêm um productId inteiro adequado. Você pode usar uma restrição ao definir uma rota para restringir as URLs que correspondem à rota. A rota product modificada na Listagem 3 contém uma restrição de expressão regular que corresponde apenas a inteiros.

Listagem 3 – Global.asax.cs

routes.MapRoute(
    "Product",
    "Product/{productId}",
    new {controller="Product", action="Details"},
    new {productId = @"\d+" }
 );

A expressão regular \d+ corresponde a um ou mais inteiros. Essa restrição faz com que a rota produto corresponda às seguintes URLs:

  • /Product/3
  • /Product/8999

Mas não as seguintes URLs:

  • /Product/apple

  • /Produto

  • Essas solicitações do navegador serão tratadas por outra rota ou, se não houver rotas correspondentes, um erro O recurso não pôde ser encontrado será retornado.