Pregunta

Estoy en camino de crear una aplicación MVC de ASP.NET con la última versión beta y me pregunto si es posible cambiar el diseño predeterminado del proyecto

/Views/Home/Index.aspx /Views/Home/About.aspx

a

/Blog/Views/Home/Index.aspx /Blog/Views/Home/About.aspx

/Forum/Views/Home/Index.aspx /Forum/Views/Home/About.aspx

El objetivo es obtener cierta separación entre " aplicaciones " dentro de un solo proyecto web, algo como Thomas Owens ya está aquí: En un marco MVC, ¿qué estructura de directorios esperan otros desarrolladores?

Por supuesto, esto también debe incluir los Controladores, no solo las Vistas.

¿Fue útil?

Solución

Este no es un concepto nuevo. Se llama " áreas " en Monorriel . Recientemente se ha hablado mucho sobre este tema en el foro ATL.NET y en otros lugares. Steve Sanderson ha presentado un forma de hacer esto pero aparentemente deja algunos problemas. En respuesta, aparentemente el equipo de MVC va a tomar una " mirada profunda " en ello para un futuro lanzamiento.

Otros consejos

Sí, debería ser posible hacer esto. Puedo pensar de una manera; puede haber otros.

El primer paso es modificar la ruta predeterminada para incluir el nombre de su aplicación:

routes.MapRoute("Default",
                "{applicationName}/{controller}/{action}/{id})",
                null, null);

Supongo que va a agrupar las dos " aplicaciones " en diferentes espacios de nombres dentro de un solo conjunto. Por lo tanto, puede tener dos espacios de nombres como:

  • MyApp.Blog.Controllers
  • MyApp.Forum.Controllers

A continuación, debe cambiar la fábrica del controlador para que cree una instancia del controlador correcto. Puedes hacer esto subtipo el DefaultControllerFactory y anulando el 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);
    }

Finalmente, debe decirle a MVC que use su ControllerFactory. En Global.asax.cs:

    private void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes(RouteTable.Routes);
        ControllerBuilder.Current.SetControllerFactory(
            MyApp.MyControllerFactory());
    }

Las vistas de localización se pueden manejar de manera similar. En este caso, subtipe WebFormViewEngine.

Acabo de escribir una publicación de blog que describe un enfoque para agrupar controladores que es similar a " áreas " en monorraíl. Sin embargo, aún no aborda las áreas anidadas.

http://haacked.com/archive/2008 /11/04/areas-in-aspnetmvc.aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top