Criação de uma restrição de rota (VB)
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.vb
routes.MapRoute( _
"Product", _
"Product/{productId}", _
New With {.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.vb
Public Class ProductController
Inherits System.Web.Mvc.Controller
Function Details(ByVal productId As Integer) As ActionResult
Return View()
End Function
End Class
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.
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.vb
routes.MapRoute( _
"Product", _
"Product/{productId}", _
New With {.controller = "Product", .action = "Details"}, _
New With {.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.