2010-07-09 47 views
7

Desde MVC 2 podemos crear áreas fácilmente. Ahora mi pregunta está relacionada con áreas anidadas (áreas dentro de áreas).Áreas anidadas en MVC 2/MVC 3/MVC 4

Seleccione mi carpeta de área "father", haga clic con el botón derecho del mouse>Add> NO opción para new Area.

¿Es posible hacerlo de otra manera? o esta opción estará disponible en el futuro cercano?

+0

Lo leí dos veces y pensé en la estructura Org para la intranet de la compañía ... – Ahmad

Respuesta

4

Me doy cuenta de que esta es una vieja pregunta, pero la responderé en caso de que alguien más esté tratando de resolverla.Una solución a esto es crear áreas que utilizan un valor de enrutamiento diferente en un nivel inferior a la zona, así que por ejemplo su RouteConfig sería algo como esto:

public class RouteConfig 
    { 
     /// <summary> 
     /// A function that registers the default navigation route. 
     /// </summary> 
     /// <param name="routes">The RouteCollection to act on.</param> 
    public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
      var route = routes.MapRoute(
      name: "Default", 
      url: "{area}/{subArea}/{controller}/{action}/{id}", 
      defaults: new { area = "DefaultArea", controller = "Home", action = "Splash", id = UrlParameter.Optional, section = "Customer" }, 
      namespaces: new string[] { "Application.Controllers" }); 
     } 
    } 

Y una de sus registros sub-área podría ser similar esto:

public class ApplicationSubAreaRegistration : AreaRegistration 
{ 
    public override string AreaName 
    { 
     get 
     { 
      return "ApplicationSubArea"; 
     } 
    } 

    public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      "SubArea_default", 
      "Area/SubArea/{controller}/{action}/{id}", 
      new { action = "Index", id = UrlParameter.Optional }, 
      new string[] { "Application.Areas.AreaName.SubAreaName.Controllers" } 
     ); 
    } 
} 

Después de leer eso, ¿el "área" todavía se parece a una palabra? Porque no me importa.

P.S. Usted puede hacer esto de forma recursiva tantas veces como desee (en teoría) de tal manera que, por ejemplo, usted podría hacer

url: "{area}/{subArea}/{subSubArea}/{subSubSubArea}/{evenMoreSubArea}/{controller}/{action}/{id}", 

en sus RouteConfig.cs y

"Area/SubArea/SubSubArea/SubSubSubArea/EvenMoreSubArea/{controller}/{action}/{id}", 

en su registro zona.

+0

Incluso puede hacer un enrutamiento complicado como "{area}/{subArea}/{controller}/{action}/{id}" y luego "{area}/ExplicitSubArea/{controller}/{action}/{id}" de modo que cualquier elemento con subArea = "ExplicitSubArea" se enrutaría al conjunto de controladores especificado, independientemente del área en la que se encuentre, aunque esto se complica y en la mayoría de los casos probablemente no sea lo que debería hacer. – Ceshion

+0

Gracias por reabrir esta pregunta y por una solución tan agradable. Todavía no lo he probado, pero le daré a esta respuesta la opción correcta. Gracias una vez más :) – Dryadwoods

0

No desea tener áreas anidadas. Hay algo mal en su diseño de software.

el caso más común es que utiliza áreas como Html Renderer, , por lo tanto, son las plantillas de visualización.

+0

No, esa no es la razón, ni un problema con el diseño :) la idea de áreas anidadas sería tener todos los profesionales de las "Áreas "y ampliarlos también a una" organización tipo árbol ": organización y separación de conceptos en áreas anidadas. Eso sería genial. Al igual que una parte del concepto de "páginas maestras anidadas". – Dryadwoods

+1

Una página maestra es solo la parte "Ver". eso significa que anidarlos permite que la vista tenga una jerarquía. Un área tiene un controlador, un modelo y una vista dentro de él. pero está bien, vamos a profundizar. ¿Cómo te gustaría derivarte del Área anidada? en el controlador? en la vista, llama al otro controlador? tal vez hay un diseño, que simplemente no puedo entender ... – cRichter

+0

Un área permite una organización diferente, no solo porque tiene un espacio de nombres diferente, sino también porque tiene su propia estructura de directorios de controladores, vistas y modelos. Y veo muchas ventajas en esto. – Dryadwoods

2

Usando la idea de Multi-project areas como punto de partida, supongo que se podría crear de forma recursiva las zonas más anidados.

3

Por ahora no hay información que indique si habrá áreas anidadas.

En el futuro tal vez esto cambie.

0

En este momento MVC sólo es compatible con la aplicación Principal y luego áreas en un nivel superior y las que no anidados, pero se puede ver en This Nuget Package que añade la funcionalidad siguiente a su proyecto:

  • Organizar los controladores y vistas utilizando espacios de nombres (no más áreas) que pueden ir tan profundo como desee.
  • Restricciones predeterminadas para los tipos primitivos que pueden anularse por parámetro o por sitio.
  • Agrupación inteligente de rutas similares para una coincidencia eficiente.
  • Compatibilidad con un controlador raíz.
  • Soporte para acciones sobrecargadas.
  • Soporte para rutas jerárquicas (a.k.a. RESTful).
  • Soporte para rutas personalizadas definidas por el usuario.
  • Detección de rutas ambiguas.
  • Formateo de rutas (por ejemplo, minúsculas, guiones separados, guiones bajos, etc.).
  • Renderice sus rutas como llamadas al método de extensión MapRoute, para la depuración.
  • Compatibilidad con vistas incrustadas (como recursos de ensamblaje).
+0

Gracias, voy a echar un vistazo. – Dryadwoods

Cuestiones relacionadas