Manipulação de URLs complexas no ASP MVC
-
06-07-2019 - |
Pergunta
Eu tenho - eu acho - uma URL complexa de lidar com a ASP MVC 1.0: Todas as minhas ações na maioria dos controladores exigem dois parâmetros o tempo todo: Conta e Projeto. Esta é em cima das necessidades de cada ação. Isso significa que um URL típico é assim:
http://abcd.com/myaccount/projects/project_id/sites/edit/12
Neste exemplo: myaccount é o nome da conta. projetos pode ser um controlador, outras opções são como locais , funcionários . project_id é o ID de um projeto dentro de myaccount , locais pode ser um controlador, outras opções são como equipe ou pagamentos . Editar é uma ação e 12 é o ID do site editado. (Espero que isso é suficiente clara)
Agora, uma opção é criar uma rota e passar project_id e conta em todas as acções de controladores adicionando dois parâmetros extras para todas as ações. Esta não é realmente desejado e também não tenho a certeza os dois controladores (projetos e sites) estão indo para o trabalho aqui.
A minha situação ideal é usar algum tipo de contexto que viaja com a chamada para a ação do controlador e armazenar project_id e myaccount lá. O resto dos parâmetros podem então ser tratados de uma forma normal, como:
// sitescontroller
public ActionResult Edit(string id)
{
string account = somecontext["account"];
string project_id = somecontext["project"];
// do stuff
}
Todas as idéias a respeito de como / onde isso pode acontecer? Também como é que isto vai trabalhar com ActionLink (ou seja, gerar as ligações corretas com base neste contexto)?
Obrigado!
Solução
Você primeiro precisa adicionar as fichas para suas rotas como {company}/projects/{project}{controller}/{action}/{id}
. Então, se você escreveu seu próprio IControllerFactory então seria muito fácil para empurrar os valores do RouteData para o controlador via o construtor ou no entanto que queria fazê-lo. Provavelmente, a maneira mais fácil de começar seria a subclasse DefaultControllerFactory e substituir o método CreateController.
Outras dicas
Isto não muito sentido para mim. Por que você tem uma rota que é semelhante ao seguinte:
{controller}/{id}/{controller}/{id}
?