roteamento Restful para ASP.NET MVC, com base no Ruby on Rails roteamento DSL. Ele utliza verbos HTTP para manter caminhos exclusivos ao mínimo, enquanto otimiza sua estrutura de controladores.

PM > Install-Package RestfulRouting

bem-vindo ao Roteamento Restful para ASP.NET MVC! O roteamento é indiscutivelmente o núcleo de todos ASP.Net aplicações MVC. Gerenciar rotas você mesmo pode ser complicado, frustrante e improdutivo. Alguns desenvolvedores utilizam uma rota catch-all, o que pode levar a problemas inesperados à medida que o aplicativo cresce. O Restful Routing resolve o problema de gerenciamento de roteamento fornecendo uma interface opinativa de registro de rotas.

esperamos que você achar que esta Biblioteca é tão fácil de usar que você vai se perguntar como você já desenvolveu ASP.Net aplicações MVC sem ele.

Golden Seven

restful Routing baseia-se na ideia de Resources e nas Golden Seven actions:

a Ação HTTP Método
ÍNDICE OBTER
MOSTRAR OBTER
CRIE POST
NOVO OBTER
EDITAR OBTER
ATUALIZAÇÃO COLOQUE
DESTRUIR EXCLUIR

O objetivo do Roteamento Restful é torná-lo consciente de seus controladores. Embora você possa dobrar as regras quando apropriado, você deve realmente se concentrar em manter todos os controladores limitados a essas sete ações. Se você lutar contra as Convenções de roteamento Restful, você não estará aproveitando a força de nossa estrutura opinativa e será miserável fazê-lo.

rota padrão

Antes de mergulhar no roteamento Restful, gostaria de discutir a rota padrão fornecida por ASP.NET MVC. Encontrado em muitos modelos iniciais, é uma ferramenta útil ao começar, mas não recomendo que você o use para qualquer ambiente de produção. Vou listar os motivos abaixo:

  • qualquer controlador em seu projeto será acessível mesmo se não estiver registrado com uma estrutura de roteamento como roteamento Restful.
  • pode levar a uma resolução inesperada da rota externa e horas de depuração.

Passo 1. Instalando restful Routing

para começar, assumiremos que você está começando com um ASP.Net projeto MVC e entender como chegar a esse ponto.

abra o Console do Gerenciador de pacotes e digite o seguinte: PM> Install-Package RestfulRouting.

se você não deseja usar o Console do Gerenciador de pacotes, você pode clicar com o botão direito do mouse em seu projeto da web e selecionar o item de menu de contexto “Gerenciar Pacotes Nuget”. Procure por RestfulRouting instalar o pacote.

Passo 2. Configurando restful Routing

algumas mudanças deveriam ter acontecido com seu projeto, ou seja, dois arquivos foram adicionados: Routes.cs e ApplicationController.

Routes.cs deve se parecer com a seção à direita. Temos uma pequena ajuda já incluída para você neste arquivo. Nem todo mundo está escrevendo um aplicativo de blog, então fique à vontade para apagar o código comentado depois de examiná-lo.

observe a dependência do WebActivator, isso garantirá que as rotas sejam registradas quando seu aplicativo for iniciado. Você pode optar por remover essa dependência se preferir chamar o método Start você mesmo.

// setting the root routemap.Root<HomeController>(x => x.Index());

para sua configuração, certifique-se de definir o Root;

além de Routes.cs você também receberá ApplicationController. Usar este controlador base é opcional, mas ele tem o código necessário para utilizar os resultados do formato

Etapa 3. Ver configuração do motor (opcional)

ASP.Net o MVC depende dos mecanismos de visualização para localizar suas visualizações. Embora o mecanismo de exibição padrão esteja ok, descobrimos que a estrutura da pasta é um pouco detalhada. Se você gostaria de utilizar nossos mecanismos de visualização, altere seu Global.arquivo asax para se parecer com o seguinte.

Lá Você Tem Isso. Código! Código! Código!

se você quiser saber mais sobre como e o que está acontecendo no registro de suas rotas continue lendo.

RouteSet

nesta seção, você aprenderá sobre RouteSet. A classe é fundamental para fazer o trabalho de roteamento Restful.

Basics

um RouteSet é uma coleção de mapeamentos de rotas. Ele não apenas define rotas em seu aplicativo, mas pode se conectar a outros RouteSets, criando um rico conjunto de rotas com o mínimo esforço.

todas as rotas são definidas dentro do método Map de um RouteSet.

a instância do IMapper passada no mapa apresenta uma maneira de mapear suas rotas para o dicionário RouteTable no coração de cada ASP.Net aplicação MVC. Se você instalou o roteamento Restful através do Nuget, você terá notado um RouteSet já criado para você.

conectando

às vezes você deseja separar logicamente seus RouteSets. Em vez de agrupar todas as rotas em um único RouteSet, fornecemos a capacidade de conectar RouteSets. Você deve selecionar um RoutSet para ser a raiz de seus RouteSets, após o qual você pode conectar outros RouteSets da maneira que desejar. RouteSets também suportam namespaces, semelhantes às áreas.

configuração (opcional)

um RouteSet fornece configurações que podem modificar o comportamento do registro de rota. Essas propriedades podem ser encontradas no contexto de um RouteSet. A maioria dos desenvolvedores não vai querer tocar nesses recursos.

Definição por Omissão Resultado
LowercaseUrls true registar urls em minúsculas cultura invariável
LowercaseDefaults true registrar suas ações, quando registrados, normalmente, em letras minúsculas cultura invariável
LowercaseActions true registrar suas ações, quando registrado com Rota em minúsculas cultura invariável
MapDelete false registrar um ação adicional de excluir . Usado para exibir uma página de confirmação de exclusão antes de remover um recurso.

mapeamento

restful Routing é uma estrutura de mapeamento e, para fazer o mapeamento, fornecemos um conjunto de conceitos e interfaces. Leia sobre cada interface abaixo e qual funcionalidade cadA UMA fornece em detalhes.

Root

map.Root<HomeController>(x => x.Index());

cada aplicativo precisa de uma página padrão, e registrar um caminho raiz nunca foi tão fácil. Se o seu aplicativo foi hospedado em , então isso seria considerado a raiz.

seu aplicativo pode ter apenas uma raiz.

Resource

map.Resource<ProfileController>();

um recurso é uma” coisa ” que pode ser pensada singularmente da perspectiva do usuário do aplicativo. Um perfil para um usuário autenticado é um bom exemplo de recurso. Dê uma olhada no seguinte url. Quando se trata de um perfil, você derivará o identificador por meio de um cookie (ou outros meios implícitos) e não precisará do identificador no caminho da rota.

o url assume que o aplicativo sabe o que é um perfil e como apresentá-lo. Agora, como seria o registro em um RouteSet?

ações e métodos Http

ao registrar um recurso, um conjunto de ações e métodos é registrado automaticamente. Registre seu controlador e implemente as ações.

a Ação HTTP Método
MOSTRAR OBTER
CRIE POST
NOVO OBTER
EDITAR OBTER
ATUALIZAÇÃO COLOQUE
DESTRUIR EXCLUIR

Para o nosso exemplo, com a ProfileController, você deve obter o seguinte resultado:

a Ação Método Resultado (controladora#ação) Url
MOSTRAR GET perfil#mostrar /perfil
NOVO GET perfil#novo /perfil/novo
CRIE POST perfil#criar /perfil
EDITAR GET perfil#editar /perfil/editar
ATUALIZAÇÃO COLOCAR perfil#update /perfil
DESTRUIR APAGAR perfil#destruir /perfil

Nomenclatura

às Vezes o nome de seu controlador uma coisa, mas gostaria de ter o recurso de url refletir algo inteiramente outro. Isso é simples de fazer.

o novo url para profile#show será alterado para

Additionally, you can change the default action names of a resource by using the PathNames método. Isso não é recomendado, mas gostamos de lhe dar opções.

escolhendo ações

às vezes você pode não precisar de todos os métodos que fornecemos para um recurso. Imagine os seguintes exemplos:

  • como usuário, não devo ser capaz de criar um perfil, porque ele é criado implicitamente quando nos registramos.
  • como usuário, devo ser capaz de editar meu perfil atual.
  • como usuário, não devo ser capaz de excluir meu perfil.
  • como usuário, devo poder ver meu perfil

após a revisão, só precisamos registrar as seguintes ações: Show, Edit, Update. Para limitar nosso recurso a essas ações, usaríamos o seguinte código em nosso RouteSet.

aninhar um recurso

// NESTING A RESOURCEmap.Resource<ProfileController>(profile => { profile.Resource<CreditCardController>()});

um recurso às vezes depende de outro recurso. Ao aninhar um recurso, você tem uma relação um a um entre o recurso pai e seu recurso dependente.

se você criar um recurso creditcard e aninhá-lo em nosso recurso profile (conforme observado à direita), obterá as rotas resultantes, excluindo as rotas de perfil:

Action HTTP Method Result (controller#action) Url Template
SHOW GET creditcard#show /profile/creditcard
NEW GET creditcard#new /profile/creditcard/new
CREATE POST creditcard#create /profile/creditcard
EDIT GET creditcard#edit /profile/creditcard/edit
ATUALIZAR COLOCAR cartão de crédito#update /perfil/cartão de crédito
DESTRUIR APAGAR cartão de crédito#destruir /perfil/cartão de crédito

Recursos

map.Resources<ProductsController>();

Recursos representam coleções dentro de seu domínio. Imagine criar um aplicativo de loja, você pode querer expor seu catálogo para que os clientes possam pesquisar e comprar produtos. Os produtos seriam considerados recursos. O url gerado também refletiria que existem muitos produtos a serem oferecidos.

observe a pluralização de produtos. Se você estiver iniciando um site de comércio eletrônico, provavelmente venderá mais de um produto por vez.

ações

ao registrar recursos, um conjunto de ações e métodos é registrado automaticamente. Registre seu controlador e implemente as ações.

a Ação HTTP Método
ÍNDICE OBTER
MOSTRAR OBTER
CRIE POST
NOVO OBTER
EDITAR OBTER
ATUALIZAÇÃO COLOQUE
DESTRUIR EXCLUIR

Para o nosso exemplo, com a ProductsController, você gostaria de obter a seguinte saída:

Naming

às vezes você nomeia seu controlador uma coisa, mas deseja que o URL dos recursos reflita algo totalmente diferente. Isso é simples de fazer.

o novo url será alterado para o índice de produtos#.Além disso, você pode alterar os nomes de ação padrão de um recurso usando o método PathNames. Isso não é recomendado, mas gostamos de lhe dar opções.

personalizando o parâmetro {id}

por padrão, o nome id é usado para o parâmetro resource id nos padrões de URL da rota. Por exemplo, o padrão de URL para os produtos#mostrar ação em ações e métodos HTTP acima é /products/{id}.

em alguns cenários, você pode querer usar um nome diferente para o parâmetro. Talvez você queira que o nome do parâmetro corresponda ao nome da propriedade usada para identificar o recurso:

a rota adicionada para a ação users#show teria o padrão de URL /users/{username}.

escolhendo ações

às vezes você pode não precisar de todos os métodos que fornecemos. Você pode remover ações usando os métodos follwing à direita.

recursos de aninhamento

map.Resources<ProductsController>(products => { products.Resources<ReviewsController>()});

os recursos às vezes dependem de outros recursos. Ao aninhar recursos, você tem uma relação de um a muitos entre o recurso pai e seus recursos dependentes. Pense em um produto que tenha reviews.To faça isso, você registraria os dois recursos assim.

rotas de Membro e Coleção

Use os métodos Member e Collection dentro dos recursos para adicionar rotas à coleção (sem um parâmetro de rota de id) ou ao Membro (com um parâmetro de rota de id). Os métodos disponíveis para mapear São Get, Post, Put, Delete e Head. Quando dentro do contexto de um recurso (singular), você só terá acesso ao método Member.

mapeamento padrão

<!-- IN RAZOR VIEW --><a class="btn" href="@Url.Action("usingpath", "extras")">Path</a><a class="btn" href="@Url.Action("usingroute", "extras")">Route</a>

às vezes, nossas convenções simplesmente não funcionam para você. Podemos ser opinativos, mas não governamos com punho de ferro.

dois métodos adicionais são fornecidos para que você possa adicionar rotas personalizadas: Path é uma mistura de tradicional ASP.Net sintaxe de roteamento MVC com nosso wrapper de interface. Rota é uma maneira muito tradicional de adicionar uma rota personalizada.

áreas

as áreas são tratadas por namespace no roteamento Restful. Normalmente, há uma correlação entre pastas e namespaces, portanto, para a maioria dos desenvolvedores, isso não é uma grande diferença em relação ao que eles já fazem.

o controlador fornecido ao método Area é usado para determinar o namespace para os controladores agrupados. A string “mapeamentos” é usada para determinar o nome da área, junto com a parte do url.

lembre-se de que você precisará fornecer a área ao gerar urls. Para sair de uma área, você pode definir a área como uma string vazia. Todas as regras com um recurso e recursos ainda se aplicam ao lidar com áreas.

ver motores

restful Routing vem com dois motores de visualização: RestfulRoutingRazorViewEngine e RestfulRoutingWebFormViewEngine. Vamos olhar para um desses motores de visão.

estes motores Vista mudar a maneira que ASP.Net MVC procurará visualizações.

resultado do formato

este é um recurso que permite usar extensões de formato implícitas em um recurso e recursos. Existem dois métodos principais para esse recurso: RespondTo, WithFormatRoutes.

<system.webServer> <modules runAllManagedModulesForAllRequests="true" /></system.webServer>
namespace RestfulRouting.Documentation.Controllers{ public abstract class ApplicationController : Controller { protected ActionResult RespondTo(Action<FormatCollection> format) { return new FormatResult(format); } }}
// IN ROUTESET// enable format routesextras.WithFormatRoutes();

Nós fornecemos um conjunto de tipos conhecidos fora da caixa para fazer usando nossa interface fluente um pouco melhor, mas apoiamos qualquer extensão de arquivo que você pode pensar. Para gerar essas rotas de formato, basta especificar o formato da seguinte maneira.

incrível certo?! Recomendamos que você leia a seguinte seção de peculiaridades / Gotchas se você planeja usar rotas de formato.ele é útil se você estiver criando aplicativos de página única usando com moderação e entender quando é apropriado separar a funcionalidade em suas ações.

redirecionar links mortos

há momentos em que tomamos melhores decisões de url do que outras. Queremos a capacidade de alterar os urls, sem quebrar os urls existentes. Isso só é necessário quando seu aplicativo entra em operação. Isso se aplica principalmente a sites voltados para o público, mas pode ser útil em uma situtação de intranet.

a primeira coisa a notar é que você deve registrar todas as suas rotas de redirecionamento como as últimas rotas em sua lista. Isso ocorre porque eles são os menos importantes. O único será atingido ao acessar um link antigo. Seu aplicativo não deve gerar esses urls e, se for, você terá problemas.

em segundo lugar, o registro se parece com a boa e velha sintaxe do RestfulRouting, mas não requer que você o aninhe em nenhuma definição. Eu recomendaria, criando um RouteSet chamado DeadLinks ou redirecionamentos e conectando-o no final do seu RouteSet mestre.

por último, e isso é importante, registre o RedirectRouteFilterAttribte como um filtro global.

como você pode ver à direita, basta definir o URL antigo e fornecer valores para resolver para o novo url. Usamos o UrlHelper sob as capas para encontrar a melhor rota correspondente.

Depurador de rota

// IN ROUTESETmap.DebugRoute("routedebug");

o roteamento Restful vem com um depurador de rota poderoso que visa ajudá-lo a entender seus mapeamentos de rota. Você pode ativar e desativar o depurador de rota puramente adicionando a seguinte linha ao seu RouteSet.

Quirks / Gotchas

esta seção tenta detalhar algumas peculiaridades com ASP.NET MVC e roteamento Restful. Isso pode causar problemas às vezes e é bom entender por que e quando eles podem afetar seu aplicativo.

valores de rota persistentes

ASP.Net MVC sempre tenta ser útil. Útil, embora bem intencionado, pode levar a algum comportamento estranho às vezes. O maior problema pode ser salvo valores de rota de sua solicitação existente.

entender essa peculiaridade pode ajudá-lo a depurar muitos problemas, não apenas com roteamento Restful, mas com ASP.NET MVC em geral. Você pode ver o exemplo à direita.

níveis de mapeamento de mistura

map.Resource<ProfileController>(profile => { // DOH! should be profile // not map! // EXCEPTION!!!! map.Resource<CreditCardController>()});

o roteamento Restful foi projetado para ser fluente e aninhado. Durante a criação do seu RouteSet, você pode acidentalmente chamar o parâmetro errado, levando a um erro que pode ser difícil de diagnosticar. Nossa exceção é útil, mas este é um erro bastante comum que decidimos documentá-lo.

Namespaces e conflitos de nomes

às vezes queremos nomear os controladores da mesma forma, mas tê-los em namespaces diferentes. Isso é apropriado ao construir uma seção administrativa e frontal do seu site. Lembre-se de definir os namespaces adequadamente para que o roteamento possa instanciar o controlador correto.