Как определить и перечислить список в web.config

#c# #asp.net #asp.net-mvc-4 #web-config #configurationmanager

#c# #asp.net #asp.net-mvc-4 #web-config #configurationmanager

Вопрос:

ASP.NET Приложению MVC4 требуется список чтения из файла web.config.

web.config содержит

 <?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>
  

код для перечисления это:

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

его запуск приводит к ошибке

 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>
  

Как это исправить, чтобы web.config мог содержать несколько элементов подключения?

Раздел определяется как:

 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; }
        }
   }
  }
  

Ответ №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; } }
}
  

Комментарии:

1. и вызовите (WebConfigurationManager. GetSection(ConnectionGroupConfigurationSection. Имя узла) как ConnectionGroupConfigurationSection). ConnectionGroup.Cast<ConnectionElement>()