嵌套自定义配置元素集合

时间:2010-11-26 08:50:52

标签: asp.net nested custom-configuration

我正在尝试为我目前参与的asp.net项目实现自定义配置解决方案。

这是配置声明

    <sectionGroup name="WebsiteConfig" type="{namespace}.{class}, {assembly}">
        <section name="Languages" type="{namespace}.{class}, {assembly}"/>
        <section name="LinkFormats" type="{namespace}.{class}, {assembly}"/>
        <section name="Countries" type="{namespace}.{class}, {assembly}"/>
    </sectionGroup>

这是我正在尝试使用的实际配置

<WebsiteConfig>

    <Languages>
        <Language code="en" domain="...">
            <Theme .../>
            <SiteMap ..."/>
        </Language>
        <Language code="de" domain="...">
            <Theme .../>
            <SiteMap .../>
        </Language>
    </Languages>

    <Countries>
        <Country Code="UK">
            <Files>
                <File name="..." fileUrl="..." enabled="true" />
                <File ... />
            </Files>
            <Messages>
                <Message Enabled="true" Message="..." />
                <Message ... />
            </Messages>
        </Country>
        <Country Code="...">....</Country>
    </Countries>

    <LinkFormats UseRewrites="false">
        <Link name="..." format="..." formatRewrite=".../"/>
        <link .... />
    </LinkFormats>

</WebsiteConfig>

我遇到的问题是Country元素(ConfigurationElement)中的Files和Messages集合会抛出一个无法识别的元素'File'等。

我的国家/地区元素具有“文件和消息”的以下属性

    [ConfigurationProperty("Files")]
    public FilesSection Files
    {
        get
        {
            return (FilesSection)this["Files"];
        }
        set
        {
            this["Files"] = (object)value;
        }
    }

    [ConfigurationProperty("Messages")]
    public MessagesSection Messages
    {
        get
        {
            return (MessagesSection)this["Messages"];
        }
        set
        {
            this["Messages"] = (object)value;
        }
    }

FilesSection和MessagesSection都是从ConfigurationElement派生而来的,其默认集合类型为x,它是从ConfigurationElement派生的项集合。

有没有人能够了解我出错的地方?

我是否需要将国家/地区和国家/地区转换为SectionGroup,然后将文件和消息转换为部分?

2 个答案:

答案 0 :(得分:4)

基于这篇文章http://www.endswithsaurus.com/2008/11/custom-configuration-section.html我发现我需要设置ElementName,因为父级不是区段处理程序的嵌套集合将不遵守用于设置子元素的“AddItemName”。

答案 1 :(得分:0)

而不是像您提供的文章中那样为元素名称设置内部成员变量,而是使用您的自定义名称覆盖ElementName属性:

public class MySettings : ConfigurationElementCollection
{
    protected override ConfigurationElement CreateNewElement()
    {
        return new MySetting();
    }
    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((MySetting)element).Name;
    }

    protected override string ElementName
    {
        get { return “MySetting”; }
    }

    ...

有关详细信息,请参阅article here