自定义web.config部分(ASP.NET)

时间:2010-06-19 12:19:36

标签: c# asp.net web-config

为相对较长的帖子提前道歉 - 我试图提供尽可能多的相关信息(包括代码清单)!

我一直在为web.config文件中的自定义部分实现一些我过去几个小时工作的东西,但我似乎无法让它工作。以下是我想用作XML结构的内容:

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

目前,我已经设置了以下类(有点):

  • ModuleSection
  • ModuleCollection
  • 模块
  • 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;
    }
}

}

模块 包含有关模块和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 个答案:

答案 0 :(得分:3)

我认为你需要创建一个用ConfigurationCollectionAttribute属性修饰的属性。我扫描了你的代码,并没有在任何地方看到它的引用。

一次MSDN链接实际上有一个有用的例子。我最近自己整理了一个自定义配置部分,发现该页面完全足够了。有关如何在Visual Studio中为配置部分启用Intellisense支持,请参阅my question