Пользовательские разделы web.config (ASP.NET) - PullRequest
6 голосов
/ 19 июня 2010

Заранее извиняюсь за относительно длинный пост - я пытался предоставить как можно больше необходимой информации (включая списки кодов)!

Я работаю над реализацией пользовательского раздела в ИнтернетеФайл .config для чего-то, над чем я работаю последние несколько часов, но я не могу заставить его работать.Вот что я хотел бы использовать в качестве своей XML-структуры:

<mvcmodules>
    <module moduleAlias="name" type="of.type">
        <properties>
            <property name="propname" value="propvalue" />
        </properties>
    </module>
</mvcmodules>

В настоящее время у меня установлены и работают (в некоторой степени) следующие классы:

  • ModuleSection
  • ModuleCollection
  • Module
  • ModulePropertyCollection
  • ModuleProperty

Единственный способ увидеть, как можно приблизиться к тому, что я хочусделать это, чтобы обернуть мои объявления в другой родительский по имени.Однако, когда я делаю это, я получаю сообщение об ошибке, если у меня есть более одного экземпляра тега («Элемент может появиться только один раз в этом разделе.»), И с одним тегом информация не читается вобъекты.

Я написал небольшую базовую документацию, чтобы вы могли понять, как я это структурирую, и, надеюсь, увидеть, где я ошибаюсь

ModuleSection Этот класс содержит объект ModulesCollection

namespace ASPNETMVCMODULES.Configuration
{
    public class ModulesSection : System.Configuration.ConfigurationSection
    {
        [ConfigurationProperty("modules", IsRequired = true)]
    public ModuleCollection Modules
    {
        get
        {
            return this["modules"] as ModuleCollection;
        }
    }
}

ModulesCollection Содержит коллекцию объектов Module

namespace ASPNETMVCMODULES.Configuration
{
public class ModuleCollection : ConfigurationElementCollection
{
    [ConfigurationProperty("module")]
    public Module this[int index]
    {
        get
        {
            return base.BaseGet(index) as Module;
        }
        set
        {
            if (base.BaseGet(index) != null)
            {
                base.BaseRemoveAt(index);
            }

            this.BaseAdd(index, value);
        }
    }

    protected override ConfigurationElement CreateNewElement()
    {
        return new Module();
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((Module)element).ModuleAlias;
    }
}

}

Module Содержит информацию о модуле и объекте ModulePropertyCollection

    public class Module : ConfigurationElement
{
    [ConfigurationProperty("moduleAlias", IsRequired = true)]
    public string ModuleAlias
    {
        get
        {
            return this["moduleAlias"] as string;
        }
    }

    [ConfigurationProperty("type", IsRequired = true)]
    public string ModuleType
    {
        get
        {
            return this["type"] as string;
        }
    }

    [ConfigurationProperty("properties")]
    public ModulePropertyCollection ModuleProperties
    {
        get
        {
            return this["properties"] as ModulePropertyCollection;
        }
    }
}

ModulePropertyCollection Содержит коллекцию объектов ModuleProperty

    public class ModulePropertyCollection : ConfigurationElementCollection
{
    public ModuleProperty this[int index]
    {
        get
        {
            return base.BaseGet(index) as ModuleProperty;
        }
        set
        {
            if (base.BaseGet(index) != null)
            {
                base.BaseRemoveAt(index);
            }

            this.BaseAdd(index, value);
        }
    }

    protected override ConfigurationElement CreateNewElement()
    {
        return new ModuleProperty();
    }

    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((ModuleProperty)element).Name;
    }
}

ModuleProperty Удерживаетинформация о свойствах модуля

    public class ModuleProperty : ConfigurationElement
{
    [ConfigurationProperty("name", IsRequired = true)]
    public string Name
    {
        get
        {
            return this["name"] as string;
        }
    }

    [ConfigurationProperty("value", IsRequired = true)]
    public string Value
    {
        get
        {
            return this["value"] as string;
        }
    }
}

1 Ответ

3 голосов
/ 19 июня 2010

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

На этот раз ссылка MSDN действительно имеет полезный пример.Я недавно собрал собственный раздел конфигурации и нашел эту страницу полностью подходящей.См. мой вопрос о том, как включить поддержку Intellisense для вашего раздела конфигурации в Visual Studio.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...