2011-05-09 7 views
7

Distribuí mi código MVC en algunas áreas diferentes y noté una cosa. si tengo algo en el Web.config principal, algo así como:¿mvc admite la herencia de la configuración de Web.config en todas las áreas?

<system.web.webPages.razor> 
    <pages pageBaseType="System.Web.Mvc.WebViewPage"> 
     <namespaces> 
     <add namespace="System.Collections.Generic" /> 

aquellas páginas que no pertenecen a la zona de la raíz no saber nada acerca de eso. Y tengo que repetir lo mismo en el Web.config interno, el que se encuentra en la carpeta del área.

¿Cómo es que?

Respuesta

9

web.config heredar pero solo a subcarpetas. ~/Areas es una carpeta separada de ~/Views, por lo que lo que pone en ~/Areas/SomeAreaName/Views/web.config no tiene nada en común con lo que pone en ~/Views/web.config. Y dado que Razor ignora la sección de espacios de nombres en ~/web.config, es necesario repetirla para las áreas.

En resumen usted tiene:

  • ~/Views/web.config
  • ~/Areas/SomeAreaName/Views/web.config

que son dos carpetas completamente distintas secciones y en ellos no se puede heredar.

+2

Bueno, creo que es inesperado e inconveniente – Agzam

+1

@Agzam, estoy absolutamente de acuerdo contigo, pero una vez que comprendas cómo funciona la herencia web.config en ASP.NET (usando subcarpetas) y donde Razor busca espacios de nombres verás que tiene sentido . –

+3

¿Hay un enlace a la documentación con respecto a esto? – Mikhail

3

he creado una función para hacer esto que utilizará el web.config área si el usuario está utilizando el área de lo contrario va a utilizar la raíz web.config:

public static T GetWebConfigSection<T>(Controller controller, string sectionName) where T : class 
     { 
      T returnValue = null; 
      String area = null; 

      var routeArea = controller.RouteData.DataTokens["area"]; 

      if(routeArea != null) 
       area = routeArea.ToString(); 

      System.Configuration.Configuration configFile = null; 

      if (area == null) 
      { 
       // User is not in an area so must be at the root of the site so open web.config 
       configFile = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("/"); 
      } 
      else 
      { 
       // User is in an Area, so open the web.config file in the Area/views folder (e.g. root level for the area) 
       configFile = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("/Areas/" + area + "/Views"); 
      } 

      if (configFile != null) 
       returnValue = configFile.GetSection(sectionName) as T; 

      return returnValue; 
     } 

y luego llamar a:

ForestSettings forestSettings = ConfigFunctions.GetWebConfigSection<ForestSettings>(controller, "myCompanyConfiguration/forestSettings"); 
Cuestiones relacionadas