2016-10-12 1 views
0

L'application ASP.NET MVC4 nécessite une liste de lecture à partir du fichier web.config.Comment définir et énumérer une liste dans web.config

web.config contient

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 

    <configSections> 
    <sectionGroup name="connectionGroup"> 
     <section 
     name="connection" 
     type="Helpers.connectionSection" 
     allowLocation="true" 
     allowDefinition="Everywhere" 
     /> 
    </sectionGroup> 
    </configSections> 

    <connectionGroup> 
    <connection url="site1" database="db1" /> 
    <connection url="site2" database="db2" /> 
    </connectionGroup> 

code pour l'énumérer est:

 IList<ConnectionSection> connection = 
       (IList<ConnectionSection>)ConfigurationManager.GetSection("connectionGroup"); 
     foreach (var s in connection) 
      Debug.WriteLine(s.Url); 

exécuter produit erreur

Parser Error Message: Sections must only appear once per config file. See the help topic <location> for exceptions. 

Source Error: 

Line 19: <connectionGroup> 
Line 20:  <connection url="site1" database="site1" /> 
Line 21:  <connection url="site2" database="site2" /> 
Line 22: </connectionGroup> 

Comment résoudre ce problème afin que web.config peut contenir plusieurs éléments de connexion?

section est définie comme:

namespace Helpers 
{ 
    public class ConnectionSection : ConfigurationSection 
    { 

     [ConfigurationProperty("url", IsRequired = true, IsKey = true)] 
     public string Url 
     { 
      get { return (string)this["url"]; } 
      set { this["url"] = value; } 
     } 

     [ConfigurationProperty("database", DefaultValue = "mydb", IsRequired = false)] 
     public string Database 
     { 
      get { return (string)this["database"]; } 
      set { this["database"] = value; } 
     } 
    } 
    } 

Répondre

1
public class ConnectionGroupConfigurationSection : ConfigurationSection 
{ 
    public const string NodeName = "connectionGroup"; 

    [ConfigurationProperty("", IsDefaultCollection=true)] 
    public ConnectionGroupConfigurationElementCollection ConnectionGroup 
    { 
     get { return (ConnectionGroupConfigurationElementCollection)this[""]; } 
    } 
} 

public class ConnectionGroupConfigurationElementCollection : ConfigurationElementCollection 
{ 
    protected override ConfigurationElement CreateNewElement() 
    { 
     return new ConnectionElement(); 
    } 

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return (element as ConnectionElement).Id; 
    } 

    public override ConfigurationElementCollectionType CollectionType 
    { 
     get { return ConfigurationElementCollectionType.BasicMap; } 
    } 

    protected override string ElementName 
    { 
     get { return "connection"; } 
    } 
} 

public class ConnectionElement : ConfigurationElement 
{ 
    [ConfigurationProperty("url", IsRequired=true, IsKey=true)] 
    public string Url { get { return (string)this["url"]; } } 

    [ConfigurationProperty("database", DefaultValue = "mydb", IsRequired = false)] 
    public string Database { get { return (string)this["database"]; } set { this["database"] = value; } } 
} 
+0

et appel (WebConfigurationManager.GetSection (ConnectionGroupConfigurationSection.NodeName) comme ConnectionGroupConfigurationSection) .ConnectionGroup.Cast () – Nathan