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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top