2013-10-19 38 views
1

希望,我可以提出這個問題,這個網站的大腦信任,有人會看到我的錯誤。ConfigurationSection嵌套ConfigurationElementCollections

我正在開發一個項目,郵件文本需要與各種內部類的屬性中找到的信息「郵件合併」。電子郵件中的典型符號可能類似於「{會員姓名},{手機}等。」

我想定義它們在web.config中使用ConfigurationSection時找到的符號和類。這是我的建議配置部分:

<EmailSymbols> 
    <SymbolClasses> 

     <SymbolClass name="OHMember"> 
      <Symbol name="Member Name" template="{0} {1}"> 
       <add index="0" value="SMFirstName" /> 
       <add index="1" value="SMLastName" /> 
      </Symbol> 
      <Symbol name="Phone" template="{0}"> 
       <add index="0" value="SMPhone" /> 
      </Symbol> 
     </SymbolClass> 

     <SymbolClass name="Form"> 
      <Symbol name="Contact Name" dataname="ContactName" /> 
     </SymbolClass> 

    </SymbolClasses> 
</EmailSymbols> 

...那我試圖與解析它的代碼:

public class EmailSymbols : ConfigurationSection { 

    [ConfigurationProperty("SymbolClasses", IsRequired = true)] 
    public SymbolClassCollection SymbolClasses { 
     get { 
      return this["SymbolClasses"] as SymbolClassCollection; 
     } 
    } 
} 

[ConfigurationCollection(typeof(SymbolClass), AddItemName = "SymbolClass")] 
public class SymbolClassCollection : ConfigurationElementCollection { 

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

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

[ConfigurationCollection(typeof(Symbol), AddItemName = "Symbol")] 
public class SymbolClass : ConfigurationElementCollection { 

    [ConfigurationProperty("name", IsRequired = true, IsKey = true)] 
    public String Name { 
     get { 
      return this["name"] as String; 
     } 
    } 

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

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

[ConfigurationCollection(typeof(TemplateValue), AddItemName = "add")] 
public class Symbol : ConfigurationElementCollection { 

    [ConfigurationProperty("name", IsRequired = true, IsKey = true)] 
    public String Name { 
     get { 
      return this["name"] as String; 
     } 
    } 

    [ConfigurationProperty("template", IsRequired = false)] 
    public String Template { 
     get { 
      return this["template"] as String; 
     } 
    } 

    [ConfigurationProperty("dataname", IsRequired = false)] 
    public String DataName { 
     get { 
      return this["dataname"] as String; 
     } 
    } 

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

    protected override object GetElementKey(ConfigurationElement element) { 
     return ((TemplateValue)element).Index; 
    } 
} 

public class TemplateValue : ConfigurationElement { 

    [ConfigurationProperty("index", IsRequired = false, IsKey = true)] 
    public Int32 Index { 
     get { 
      return this["index"] == null ? -1 : Convert.ToInt32(this["index"]); 
     } 
    } 

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

當我分析這種說法的部分: 符號= ConfigurationManager中。 GetSection(「EmailSymbols」)作爲EmailSymbols;

我收到此錯誤消息:「無法識別的元素符號」。「

這只是一個.NET領域,我不知道我的方式。任何人都可以提供的幫助將是最受讚賞的。

我的XML定義是否有意義,它是否是正確的形式?我想要一個SymbolClass集合,每個集合都包含一個Symbol集合,每個集合都包含一個TemplateValue集合。

再次感謝您的幫助。

最好的問候, 吉米

+0

你註冊了配置文件頂部的部分嗎? http://msdn.microsoft.com/en-us/library/2tw134k3.aspx –

+0

我做到了。它解析,直到它到,然後我得到一個異常,錯誤:「無法識別的元素'符號'。」我已經使用「AddItemName」聲明瞭「Symbol」。如果我將Symbol添加爲ConfigurationProperty,則解析器將識別出「Symbol」,但請告訴我「Symbol」只能使用一次。 – JConnell

+0

這是重複的。這裏有一個很好的答案:http://stackoverflow.com/questions/5661544/correct-implementation-of-a-custom-config-section-with-nested-collections – klev

回答

1

你可以嘗試重寫SymbolClass類的Init()方法:

protected override void Init() 
{ 
    base.Init(); 
    this.AddElementName = "Symbol"; 
} 

你一個也刪除[ConfigurationCollection(typeof(SymbolClass), AddItemName = "SymbolClass")]和其他類似從上面的類聲明爲自己沒有做任何事情。