mvc поддерживает наследование настроек Web.config в разных областях? - PullRequest
7 голосов
/ 10 мая 2011

Я распределил свой код MVC по нескольким различным областям и заметил одну вещь. если у меня есть что-то в основном Web.config, что-то вроде:

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

те страницы, которые не относятся к корневой области, ничего не знают об этом. И я должен повторить то же самое во внутреннем файле Web.config, который находится в папке области.

Как получилось?

Ответы [ 2 ]

9 голосов
/ 10 мая 2011

web.config наследовать, но только для подпапок. ~/Areas - это отдельная папка из ~/Views, поэтому то, что вы помещаете в ~/Areas/SomeAreaName/Views/web.config, не имеет ничего общего с тем, что вы положили в ~/Views/web.config. А поскольку Razor игнорирует раздел пространств имен в ~/web.config, вам необходимо повторить его для областей.

В итоге у вас есть:

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

, которые представляют собой две совершенно разные папки и разделы в них не могут быть унаследованы.

3 голосов
/ 27 февраля 2012

Я создал для этого функцию, которая будет использовать область 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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...