如何在 web.config 中定义和枚举列表
How to define and enumerate list in web.config
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; }
}
}
}
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; } }
}
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; }
}
}
}
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; } }
}