Roteamento de ASP.NET

Visual Studio 2010

Roteamento do ASP.NET permite que você use URLs que não são necessário mapear arquivos específicos em um site. Como a URL não precisa mapear para um arquivo, você pode usar URLs em um aplicativo Web que são descritivas da ação do usuário e, portanto, podem facilmente ser compreendidas pelos usuários.

Em um aplicativo ASP.NET que não usa o roteamento, uma solicitação de entrada para um URL geralmente mapeia para um arquivo físico no disco sistema autônomo um arquivo.aspx. Por exemplo, uma solicitação de http://server/application/Products.aspx?id=4 mapeia para um arquivo chamado Products.aspx contém código e marcação para processar uma resposta para o navegador. A página da Web usa o valor de seqüência de caracteres de consulta de id=4 para determinar que tipo de conteúdo a ser exibido, mas o valor é provável que têm significado pouco ao usuário.

No ASP.NET roteamento, você pode definir padrões de URL que contêm espaços reservados para valores que são usados quando você lida com solicitações de URL. Em tempo de execução, as partes do URL que seguem o nome do aplicativo são analisadas em valores distintos, com base em um padrão de URL que você definiu. Por exemplo, na solicitação de http://server/application/Products/show/beverages, o analisador de roteamento pode passar os valores Products, show, e beverages um manipulador para a solicitação. Por outro lado, em uma solicitação que não é gerenciada pelo URL roteamento, a /Products/show/beverages fragmento deve ser interpretado sistema autônomo o caminho de um arquivo no aplicativo.

Você também pode usar os padrões de URL para criar, URLs que correspondem às rotas através de programação. Isso permite que você centralize a lógica para criar hiperlinks em seu aplicativo ASP.NET.

Roteamento ASP.NET difere de Outros esquemas de regravação de URL. URL reescrever as solicitações recebidas de processos alterando realmente o URL antes que ele envia a solicitação para a página da Web. Por exemplo, um aplicativo que usa a regravação de URL pode alterar um URL de /Products/Widgets/ para /Products.aspx?id=4. Além disso, regravação de URL normalmente não tem uma API para criação de URLs que são baseados em seus padrões. Na regravação de URL, se você alterar um padrão de URL, você deve atualizar manualmente todos os hiperlinks que contêm a URL original.

Com o roteamento do ASP.NET, a URL não é alterada quando uma solicitação de entrada é manipulada, porque o roteamento pode extrair valores da URL. Quando você tem que criar um URL, você passe valores de parâmetro para um método que gera a URL para você. Para alterar o padrão de URL, alterá-lo em um local e todos os links que você cria no aplicativo que sejam baseiam a esse padrão serão automaticamente usam o novo padrão.

sistema autônomo padrões de URL que você define são conhecidos sistema autônomo rotas. Uma rota, você especifica espaços reservados que são mapeados para os valores que são analisadas da solicitação de URL. Você também pode especificar valores constante que são usados para solicitações de URL correspondentes.

Uma rota, você define espaços reservados (chamados de Parâmetros de URL) colocando-sistema autônomo entre chaves ({e}). The / caractere é interpretado sistema autônomo um delimitador quando a URL é analisada. Informações da definição de rota que não seja um delimitador e que não está em chaves de são tratadas sistema autônomo um valor constante. Valores que são extraídos de entre os delimitadores são atribuídos a espaços reservados.

Você pode definir mais de um espaço reservado entre delimitadores, mas eles devem ser separados por um valor constante. Por exemplo, {language}-{country}/{action} é um padrão de rota válida. No entanto, {language}{country}/{action} não é um padrão válido, porque não há nenhuma constante ou delimitador entre os espaços reservados. Portanto, o roteamento não é possível determinar onde separar o valor para o language espaço reservado do valor para o country espaço reservado.

A tabela a seguir mostra os padrões de rota válida e exemplos de solicitações de URL que correspondam aos padrões.

Definição de rota

Exemplo de correspondência de URL

{controlador de} / {ação} / {id}

/ Produtos/show/bebidas

{tabela}/Details.aspx

/Products/Details.aspx

blog / {ação} / {entrada}

blog/show/123

{reporttype} / {ano} / {mês} / {dia}

/Sales/2008/1/5

{localidade} / {ação}

/en-US/show

{linguagem}-{Country} / {ação}

/en-US/show

Normalmente, você pode adicionar rotas em um método é chamado a partir do manipulador para o Application_Start evento no arquivo global.asax. Essa abordagem garante que as rotas estão disponível quando o aplicativo é iniciado. Ele também permite que você telefonar o método diretamente quando você teste de unidade do aplicativo. Se você quiser chamar um método diretamente quando você é testes de unidade do aplicativo, o método que registra as rotas deve ser estático (Shared em Visual Basic) e deve ter um RouteCollection parâmetro.

Você adicionar rotas, adicionando-o estático Routes propriedade das RouteTable classe. The Routes propriedade é umaRouteCollection objeto que armazena todas as rotas para o aplicativo ASP.NET. O exemplo a seguir mostra o código de um arquivo global.asax que adiciona um Route objeto que define dois parâmetros de URL chamados action e categoryName.

protected void Application_Start(object sender, EventArgs e)
{
    RegisterRoutes(RouteTable.Routes);
}

public static void RegisterRoutes(RouteCollection routes)
{
    routes.Add(new Route
    (
         "Category/{action}/{categoryName}"
         , new CategoryRouteHandler()
    ));
}

Quando você define uma rota, você pode atribuir um valor padrão para um parâmetro. O valor padrão será usado se um valor para esse parâmetro não é incluído na URL. conjunto valores padrão para uma rota atribuindo um dicionário de Defaults propriedade das Route classe. O exemplo a seguir mostra uma rota com valores padrão.

void Application_Start(object sender, EventArgs e) 
{
    RegisterRoutes(RouteTable.Routes);
}

public static void RegisterRoutes(RouteCollection routes)
{
  routes.Add(new Route
  (
     "Category/{action}/{categoryName}"
          new CategoryRouteHandler()
  )
    {
       Defaults = new RouteValueDictionary 
           {{"categoryName", "food"}, {"action", "show"}}
     }
  );
}

Quando o roteamento do ASP.NET lida com uma solicitação de URL, a definição de rota mostrada o exemplo (com valores padrão de food para categoryName e show para action) produz os resultados listados na tabela a seguir.

URL

Valores de parâmetro

/ Categorias

action= "Mostrar" (valor padrão)

categoryName= "comida" (valor padrão)

/ Categoria/Adicionar

action= "Adicionar"

categoryName= "comida" (valor padrão)

/ Categoria/Adicionar/bebidas

action= "Adicionar"

categoryName= "Bebidas"

Às vezes, você deve tratar as solicitações de URL que contêm um número variável de segmentos de URL. Quando você define uma rota, você pode especificar que o último parâmetro deve corresponder ao restante da URL, marcando o parâmetro com um asterisco (*). Em seguida, isso é conhecido sistema autônomo um pega-tudo parâmetro. Uma rota com um parâmetro pega-tudo também corresponderá URLs que não contenham nenhum valor para o último parâmetro. O exemplo a seguir mostra um padrão de rota que corresponde ao número de segmentos desconhecido.

query/{queryname}/{*queryvalues}

Quando ASP.NET roteamento processa uma solicitação de URL, a definição de rota mostrada o exemplo produz os resultados listados na tabela a seguir.

URL

Valores de parâmetro

/consulta/selecionar/Bikes/onsale

queryname = "selecionar"

queryvalues = "Bicicletas/onsale"

/consulta/selecionar/Bikes

queryname = "selecionar"

queryvalues = "Bicicletas"

/consulta/selecionar

queryname = "selecionar"

queryvalues = Seqüência de caracteres vazia

Juntamente com uma solicitação de URL para uma definição de rota de correspondência pelo número de parâmetros no URL, você pode especificar que valores nos parâmetros de atenderem a determinados limites. Se um URL contém valores que estão fora as restrições de uma rota, a rota não é usada para manipular a solicitação. Adicionar restrições para certificar-se de que os parâmetros de URL contêm valores que funcionam em seu aplicativo.

Restrições definidas por usando expressões regulares ou usando os objetos que implementam o IRouteConstraint interface. Quando você adiciona a definição de rota para o Routes coleção, você adicionar restrições, criando um RouteValueDictionary objeto que contém o teste de verificação. Atribuir esse objeto à Constraints propriedade. A chave no dicionário identifica o parâmetro que se aplica a restrição. O valor no dicionário pode ser uma seqüência de caracteres que representa uma expressão regular ou um objeto que implementa o IRouteConstraint interface.

Se você fornecer uma seqüência de caracteres, roteamento trata a seqüência de caracteres sistema autônomo uma expressão regular e verifica se o valor do parâmetro é válido, chamando o IsMatch método para o Regex classe. A expressão regular sempre é tratada sistema autônomo não diferencia maiúsculas e minúsculas. Para obter mais informações, consulte Expressões Regulares do .NET Framework.

Se você fornecer um IRouteConstraint o objeto, roteamento ASP.NET verifica se o valor do parâmetro é válido, chamando o Match método para o IRouteConstraint objeto. The Match método retorna um valor booliano que indica se o valor do parâmetro é válido.

O exemplo a seguir mostra as restrições limitam os valores que podem ser incluídas na locale e year parâmetros.

void Application_Start(object sender, EventArgs e) 
{
    RegisterRoutes(RouteTable.Routes);
}

public static void RegisterRoutes(RouteCollection routes)
{
    routes.Add(new Route
    (
      "{locale}/{year}"
         , new ReportRouteHandler()
    )
       {
          Constraints = new RouteValueDictionary 
          {{"locale", "[a-z]{2}-[a-z]{2}"},{year, @"\d{4}"}}
       });
}

Quando o roteamento processa uma solicitação de URL, a definição de rota mostrada no exemplo anterior produz os resultados listados na tabela a seguir.

URL

Resultado

/en-US

Nenhuma correspondência. Ambos os locale e year são necessários.

/en-US/08

Nenhuma correspondência. A restrição de year requer 4 dígitos.

/en-US/2008

locale= "en-US"

year = "2008"

Por padrão, o roteamento não manipula solicitações que são mapeados para um arquivo físico existente no servidor Web. Por exemplo, uma solicitação de http://server/application/Products/Beverages/Coffee.aspx não é controlado pelo roteamento se existe um arquivo físico no Products/Beverages/Coffee.aspx. O roteamento não processa a solicitação, mesmo se ele corresponder a um padrão definido, sistema autônomo {controller}/{action}/{id}.

Se você desejar que o roteamento para lidar com todas as solicitações, até mesmo as solicitações que apontam para arquivos, você pode substituir o comportamento padrão, definindo o RouteExistingFiles propriedade das RouteCollection objeto para true. Quando você conjunto esse valor como true, todas as solicitações que correspondem um padrão definido são manipuladas pelo roteamento.

Você também pode especificar o roteamento não deve tratar determinadas solicitações de URL. Você impede que o roteamento do tratamento determinadas solicitações definindo uma rota e especificar que o StopRoutingHandler classe deve ser usada para lidar com esse padrão. Quando uma solicitação é tratada por um StopRoutingHandler objeto, o StopRoutingHandler objeto bloqueia qualquer processamento adicional da solicitação sistema autônomo uma rota. Em vez disso, a solicitação é processada sistema autônomo uma página ASP.NET, serviço Web ou Outros ponto de extremidade do ASP.NET. Por exemplo, você pode adicionar a seguinte definição de rota para impedir que o roteamento de solicitações para o arquivo WebResource.axd.

public static void RegisterRoutes(RouteCollection routes)
{
  routes.Add(new Route("{resource}.axd/{*pathInfo}", new StopRouteHandler()));
}

Quando o roteamento manipula solicitações de URL, ele tenta corresponder à URL da solicitação para uma rota. Uma solicitação de URL para uma rota de correspondência depende de todas as condições a seguir:

  • Os padrões de rota que você definiu os padrão rota padrões ou, se houver, que estão incluídos no seu tipo de projeto.

  • A ordem na qual você adicionadas à Routes coleção.

  • Os valores padrão que você forneceu para uma rota.

  • Quaisquer restrições que você forneceu para uma rota.

  • Se você definiu o roteamento para tratar as solicitações que correspondam a um arquivo físico.

Para evitar a alça de manipulador errado uma solicitação, você deve considerar todas essas condições ao definir rotas. A ordem em que Route os objetos aparecem na Routes coleção é significativa. Rota de correspondência é tentado do roteiro primeiro a última rota na coleção. Quando ocorre uma correspondência, não há rotas mais são avaliadas. Em geral, adicionar rotas à Routes propriedade na ordem das definições de rota mais específicas para os menos específicos.

Por exemplo, suponha que você adicione as rotas com os seguintes padrões:

  • Rota 1: {controller}/{action}/{id}

  • Rota 2: products/show/{id}

Rota 2 nunca irá manipular uma solicitação porque route 1 é avaliado primeiro e, sempre haverá correspondência solicitações que também funcionaria para circular 2. Uma solicitação de http://server/application/products/show/bikes parece corresponder à rota 2 mais de perto, mas ela é manipulada pelo route 1 com os seguintes valores:

  • controller = produtos

  • action = show

  • id = Bicicletas

Valores padrão serão usados se um parâmetro estiver faltando para solicitação. Portanto, podem causar uma rota corresponder a uma solicitação que você não esperava. Por exemplo, suponha que você adicione as rotas com os seguintes padrões:

  • Rota 1: {report}/{year}/{month}, com valores padrão para year e month.

  • Rota 2: {report}/{year}, com o valor padrão para year.

Rota 2 nunca manipulará uma solicitação. Roteiro 1 pode ser destinado a um relatório mensal e rota 2 pode servir para relatórios anuais. No entanto, os valores padrão da rota 1 significa que corresponderá qualquer solicitação que também funcionaria para circular 2.

Para evitar ambigüidade em padrões, incluindo constantes, sistema autônomo annual/{report}/{year} e monthly/{report}/{year}/{month}.

Se um URL não coincidir com qualquer Route objeto definido na RouteTable coleção, roteamento ASP.NET não processa a solicitação. Em vez disso, o processamento é passado para uma página ASP.NET, serviço Web ou Outros ponto de extremidade do ASP.NET.

Você pode usar as rotas para gerar URLs quando você deseja centralizar a lógica para URLs construindo. Criar um URL passando sistema autônomo valores de parâmetro sistema autônomo um dicionário para o GetVirtualPath método para o RouteCollection objeto. The GetVirtualPath método procura a primeira rota nas RouteCollection objeto que corresponde aos parâmetros no dicionário. A rota correspondente é usada para gerar a URL. O exemplo a seguir mostra uma definição de rota.

public static void RegisterRoutes(RouteCollection routes)
{
  routes.Add(new Route
  (
     "Category/{action}/{categoryName}"
          new CategoryRouteHandler()
  )
    {
       Defaults = new RouteValueDictionary {{"categoryName", "food"}, 
           {"action", "show"}}
     }
  );
}

O exemplo a seguir mostra um controle que cria uma URL baseada na rota.

Dim urlParameters As RouteValueDictionary

urlParameters = New RouteValueDictionary(New With {.categoryName = "beverages", _
        .action = "summarize"})
HyperLink1.NavigateUrl = RouteTable.Routes.GetVirtualPath _
    (context, urlParameters).VirtualPath

HyperLink1.NavigateUrl = RouteTable.Routes.GetVirtualPath
  (context,
  new RouteValueDictionary { 
    { "categoryName", "beverages" }, 
    {"action", "summarize" }}
  ).VirtualPath;

Quando esse código é executado, o HyperLink1controle conterá o valor "Categoria/resumir/bebidas" no NavigateUrl propriedade.

Quando você cria um URL de um roteiro, você pode especificar qual rota deve ser para usar, incluindo um nome para o roteiro. Para obter mais informações, consulte Como: Construir um URL de uma rota.

Contribuições da comunidade

ADICIONAR
Mostrar: