0

このトピックはさまざまな Stackoverflow の記事で取り上げられていることを知っており、そのうちの約 30 件を読んで、私が行っていることがそれらと一致することを確認しました。それは(.Net 2.0、3.0、および4.0バージョンの回答であっても)です

セクションにカスタム属性を使用し、セクション内にオプションの項目を含む非常に単純な (少なくとも私の頭では) 構成ファイルを作成しようとしています。それでは、コードに進みます。

<?xml version="1.0" encoding="utf-8" ?>
<CustomSiteConfiguration>
    <Sites>
        <Site siteRoot="/Site US" name="SiteUS_en">
        </Site>
        <Site siteRoot="/Site Canada" name="SiteCanada_en">
        </Site>
        <Site siteRoot="/Partner" name="Partner_en">
            <siteSettings>
                <setting name="" value="" />
            </siteSettings>
            <JavaScriptBundles>
                <file name="" />
            </JavaScriptBundles>
            <CSSBundles>
                <file name="" />
            </CSSBundles>
        </Site>
    </Sites>
</CustomSiteConfiguration>

したがって、あなたが見ているのは、Site型の複数のセクション (CollectionElementCollections) を含むSites型のグローバル Section です。サイトは、アイテムのカスタム属性と、セクション自体のオプション アイテムによって定義されます。したがって、siteSettings はオプションであり、JavaScriptBundles はオプションであり、CSSBundles もオプションです。

C# コードは次のとおりです。

サイト用

public class CustomGlobalSiteConfiguration : ConfigurationSection
{
    public CustomGlobalSiteConfiguration() { }

    [ConfigurationProperty("Sites")]
    [ConfigurationCollection(typeof(SitesCollection), AddItemName="Site")]
    public SitesCollection Sites
    {
        get
        {
            return (SitesCollection)base["Sites"];
        }
    }
}

サイト コレクションの場合

[ConfigurationCollection(typeof(SitesCollection), AddItemName="Site")]
public class SitesCollection : ConfigurationElementCollection
{
    // Constructor
    public SitesCollection() { }

    /*
    public CustomSiteConfiguration this[int index]
    {
        get { return (CustomSiteConfiguration)BaseGet(index); }
        set
        {
            if (BaseGet(index) != null)
            {
                BaseRemoveAt(index);
            }
                BaseAdd(index, value);
        }
    }   // end of public siteSetting this [int index]
     * */

    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((CustomSiteConfiguration)element).name;
    }

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

サイト定義用

/**
 * Overarching structure of the Site Item
 **/
public class CustomSiteConfiguration : ConfigurationElement
{
    [ConfigurationProperty("siteRoot")]
    public String siteRoot
    {
        get
        {
            return (String)this["siteRoot"];
        }
        set
        {
            this["siteRoot"] = value;
        }
    }

    [ConfigurationProperty("name")]
    public String name
    {
        get
        {
            return (String)this["name"];
        }
        set
        {
            this["name"] = value;
        }
    }

    [ConfigurationProperty("siteSettings", IsRequired=false)]
    public CustomSiteSiteSettings siteSettings 
    { 
        get 
        { 
            return this["siteSettings"] as CustomSiteSiteSettings;
        }
    }

    [ConfigurationProperty("JavaScriptBundles", IsRequired = false)]
    public JavaScriptBundles javaSciptBundle
    {
        get
        {
            return this["JavaScriptBundles"] as JavaScriptBundles;
        }
    }


    [ConfigurationProperty("CSSBundles", IsRequired = false)]
    public CSSBundles cssBundle
    {
        get
        {
            return this["CSSBundles"] as CSSBundles;
        }
    }


}       // end of public class CustomSiteConfiguration : ConfigurationSection

SiteSettings 定義の場合

/**
 * Subsection - Site Settings
 **/ 
public class CustomSiteSiteSettings : ConfigurationElementCollection
{
    // Constructor
    public CustomSiteSiteSettings() { }

    public siteSetting this [int index]
    {
        get { return (siteSetting)BaseGet(index);  }
        set
        {
            if (BaseGet(index) != null)
            {
                BaseRemoveAt(index);
            }
                BaseAdd(index, value);
        }
    }   // end of public siteSetting this [int index]

    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((siteSetting)element).name;
    }

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

}       // end of public class CustomSiteSiteSettings : ConfigurationSection

サイト設定要素

public class siteSetting : ConfigurationElement
{
    [ConfigurationProperty("name")]
    public String name
    {
        get
        {
            return (String)this["name"];
        }
        set
        {
            this["name"] = value;
        }
    }   // end of public String name

    [ConfigurationProperty("value")]
    public String value
    {
        get
        {
            return (String)this["value"];
        }
        set
        {
            this["value"] = value;
        }
    }   // end of public String value
}       // end of public class siteSetting : ConfigurationElement

スペースの関係で他のアイテムは省いていますが、他の部分は同じように見えます。基本的に、何が起こっているかというと、私は得ています

認識されない属性 'siteRoot'。属性名は大文字と小文字が区別されることに注意してください。

全体を見ると、元気そうに見えますが、やりすぎて物足りないのではないかと思います。これについての助けをいただければ幸いです。

ありがとう

4

1 に答える 1

1

私は自分のコードの何が問題だったのかを理解しました。以下、情報提供させていただきます。いくつかの部分を追跡するためのヘルプとして、次の記事を使用しました: ConfigurationElementCollection を使用して ConfigurationSection を実装する方法

コードベース全体をゼロに戻し、ゼロから構築しました。XMLはまだ同じです

<?xml version="1.0" encoding="utf-8" ?>
<CustomSiteConfiguration>
<Sites>
        <Site siteRoot="/Site US" name="SiteUS_en">
        </Site>
        <Site siteRoot="/Site Canada" name="SiteCanada_en">
        </Site>
        <Site siteRoot="/Partner" name="Partner_en">
            <siteSettings>
                <setting name="" value="" />
            </siteSettings>
            <JavaScriptBundles>
                <file name="" />
            </JavaScriptBundles>
            <CSSBundles>
                <file name="" />
            </CSSBundles>
        </Site>
    </Sites>
</CustomSiteConfiguration>

そこで、まず Sites Container から始めました

public class CustomSiteSettingsSection : ConfigurationSection
{
    [ConfigurationProperty("Sites")]
    [ConfigurationCollection(typeof(SiteCollection), AddItemName="Site")]
    public SiteCollection Sites
    {
        get
        {
            return (SiteCollection)base["Sites"];
        }
    }           // end of public SiteCollection Site
}               // end of public class CustomSiteSettings : ConfigurationSection { 

そして、サイト要素のコレクションに SiteCollection を追加しました

public class SiteCollection : ConfigurationElementCollection
{
    // Constructor
    public SiteCollection() { }

    public SiteElement this[int index]
    {
        get { return (SiteElement)BaseGet(index);  }
        set
        {
            if (BaseGet(index) != null)
            {
                BaseRemoveAt(index);
            }
            BaseAdd(index, value);
        }
    }       // end of public SiteElement this[int index]

    protected override ConfigurationElement CreateNewElement()
    {
        return new SiteElement();
    }       // end of protected override ConfigurationElement CreateNewElement()

    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((SiteElement)element).name;
    }
}           // end of public class SiteCollection : ConfigurationElementCollection

次に、オプションの値を使用してサイトの定義を追加しました

public class SiteElement : ConfigurationElement
{
    // Constructor
    public SiteElement() { }

    [ConfigurationProperty("name", IsRequired = true, IsKey = true)]
    public String name
    {
        get { return (String)this["name"]; }
        set { this["name"] = value; }
    }           // end of public String name

    [ConfigurationProperty("siteRoot", IsRequired = true)]
    public String siteRoot
    {
        get { return (String)this["siteRoot"]; }
        set { this["siteRoot"] = value; }
    }           // end of public String siteRoot

    [ConfigurationProperty("siteSettings", IsRequired=false)]
    [ConfigurationCollection(typeof(SiteSettingsElementCollection), AddItemName = "setting")]
    public SiteSettingsElementCollection siteSettings
    {
        get
        {
            return (SiteSettingsElementCollection)base["siteSettings"];
        }
    }           // end of public SiteCollection Site
}               // end of public class SiteElement : ConfigurationElement

次に、SiteSettings コレクションを追加しました

public class SiteSettingsElementCollection : ConfigurationElementCollection
{
    // Constructor
    public SiteSettingsElementCollection() { }

    public SiteSettingElement this[int index]
    {
        get { return (SiteSettingElement)BaseGet(index); }
        set
        {
            if (BaseGet(index) != null)
            {
                BaseRemoveAt(index);
            }
            BaseAdd(index, value);
        }
    }       // end of public SiteElement this[int index]

    protected override ConfigurationElement CreateNewElement()
    {
        return new SiteSettingElement();
    }       // end of protected override ConfigurationElement CreateNewElement()

    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((SiteSettingElement)element).name;
    }
}           // end of public class SiteCollection : ConfigurationElementCollection

最後に、Setting Element Definition を追加しました。

public class SiteSettingElement : ConfigurationElement
{
    public SiteSettingElement() { }

    [ConfigurationProperty("name", IsRequired=true, IsKey=true)]
    public String name
    {
        get { return (String)this["name"]; }
        set { this["name"] = value; }
    }           // end of public String name

    [ConfigurationProperty("value", IsRequired = true)]
    public String value
    {
        get { return (String)this["value"]; }
        set { this["value"] = value; }
    }           // end of public String value
}               // end of public class SiteSettingElement : ConfigurationElement

この時点で、2 つのバンドルについて同じことを繰り返すだけです。最終的に、これはすべて機能し、オプションの設定とセクションが可能になります。

于 2016-05-24T14:10:00.917 に答える