ASP.NET MVC Beta - controladores de agrupamento e visualizações possíveis?
-
04-07-2019 - |
Pergunta
Estou a caminho de construir um aplicativo ASP.NET MVC com a versão beta mais recente e me pergunto se é possível alterar o layout de projeto padrão de
/Views/home/index.aspx /views/home/about.aspx
para
/Blog/views/home/index.aspx /blog/views/home/about.aspx
/Forum/views/home/index.aspx /forum/views/home/about.aspx
O objetivo é obter alguma separação entre "aplicativos" em um único projeto da web, algo como Thomas Owens já perguntou aqui: Sob uma estrutura MVC, qual estrutura de diretório seria esperada por outros desenvolvedores?
É claro que isso também deve incluir os controladores, não apenas as visualizações.
Solução
Este não é um conceito novo. É chamado de "áreas" em Monotrilho. Ultimamente houve muito zumbido sobre esse tópico sobre o Fórum ATL.NET e em outros lugares. Steve Sanderson criou um maneira de fazer isso Mas aparentemente deixa alguns problemas. Em seconse, aparentemente a equipe do MVC vai levar um "olhar profundo"Para um lançamento futuro.
Outras dicas
Sim, deve ser possível fazer isso. Eu posso pensar em uma maneira; Pode haver outros.
A primeira etapa é modificar a rota padrão para incluir o nome do seu aplicativo:
routes.MapRoute("Default",
"{applicationName}/{controller}/{action}/{id})",
null, null);
Presumo que você agrupe os dois "aplicativos" em diferentes espaços para names em uma única montagem. Então você pode ter dois namespaces como:
- MyApp.blog.Controllers
- MyApp.forum.Controllers
Em seguida, você precisa alterar a fábrica do controlador para que ele instancie o controlador certo. Você pode fazer isso subtyping o DefaultControllerFactory e substituindo o método getControllerType:
protected override System.Type GetControllerType(string controllerName)
{
string applicationName;
if (RequestContext != null &&
RequestContext.RouteData.Values.TryGetValue(
"applicationName", out applicationName)) {
// return controller type using app name to
// look up namespace and controllerName argument
return ...
}
// if no match, maybe it's a different controller/route
return base.GetControllerType(controllerName);
}
Por fim, você precisa dizer ao MVC para usar seu controlador. Em global.asax.cs:
private void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(
MyApp.MyControllerFactory());
}
A localização de visualizações pode ser tratada da mesma forma. Nesse caso, você subtype webformViewEngine.
Acabei de escrever uma postagem no blog que descreve uma abordagem para agrupar controladores que é semelhante a "áreas" em monotrilho. Ainda não aborda áreas aninhadas.
http://haacked.com/archive/2008/11/04/areas-in-aspnetmvc.aspx