mvc是否支持在整个区域继承Web.config设置?

时间:2011-05-09 20:03:05

标签: asp.net-mvc-3

我将MVC代码分发到几个不同的领域并注意到一件事。 如果我在主Web.config中有一些东西,比如:

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

那些不属于根区域的页面对此一无所知。我必须在内部Web.config中重复相同的事情,它位于区域文件夹中。

为什么?

2 个答案:

答案 0 :(得分:9)

web.config继承但仅限于子文件夹。 ~/Areas~/Views的单独文件夹,因此您在~/Areas/SomeAreaName/Views/web.config中添加的内容与~/Views/web.config中的内容没有任何共同之处。因为Razor忽略了~/web.config中的名称空间部分,所以你需要在区域中重复它。

总结一下,你有:

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

是两个完全不同的文件夹,其中的部分无法继承。

答案 1 :(得分:3)

我创建了一个函数来执行此操作,如果用户使用该区域将使用区域web.config,否则将使用根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;
        }

然后致电:

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