2011-05-09 89 views
7

我將MVC代碼分發到幾個不同的區域,並注意到一件事。 如果我有主的Web.config的東西,喜歡的東西:mvc是否支持遍歷區域的Web.config設置的繼承?

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

不屬於根分區的頁面一無所知這一點。而且我必須在內部Web.config中重複同樣的事情,它位於區域文件夾中。

怎麼回事?

回答

9

web.config繼承,但僅限於子文件夾。 ~/Areas~/Views一個單獨的文件夾,所以你放什麼~/Areas/SomeAreaName/Views/web.config毫無共同之處你放什麼~/Views/web.config。而由於剃刀忽略的命名空間部分~/web.config你還挺需要重複它的領域。

概括起來,您有:

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

這是兩個完全不同的文件夾,並在其中的部分不能被繼承。

+2

很好,我認爲這是意想不到的不便 – Agzam 2011-05-09 20:09:50

+1

@Agzam,我絕對同意你的觀點,但一旦你理解的web.config繼承在ASP.NET如何工作(使用子文件夾),並在剃刀查找命名空間,你會看到,它是有道理的。 – 2011-05-09 20:10:59

+3

有沒有關於此文檔的鏈接? – Mikhail 2012-10-23 08:05:02

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");