我将MVC代码分发到几个不同的领域并注意到一件事。 如果我在主Web.config中有一些东西,比如:
<system.web.webPages.razor>
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Collections.Generic" />
那些不属于根区域的页面对此一无所知。我必须在内部Web.config中重复相同的事情,它位于区域文件夹中。
为什么?
答案 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");