.net - net - 單個配置密鑰的多個值
asp net core configuration (6)
你想做什麼是不可能的。 您必須以不同方式命名每個鍵,或者執行類似值=“A,B,C”的操作,並將代碼string values = value.split(',')
的不同值分開。
它將始終獲取最後定義的鍵的值(在您的示例C中)。
我正在嘗試使用ConfigurationManager.AppSettings.GetValues()
來檢索單個鍵的多個配置值,但我總是收到一個只有最後一個值的數組。 我的appsettings.config
看起來像
<add key="mykey" value="A"/>
<add key="mykey" value="B"/>
<add key="mykey" value="C"/>
而我正試圖訪問
ConfigurationManager.AppSettings.GetValues("mykey");
但我只得到{ "C" }
。
關於如何解決這個問題的任何想法?
嘗試
<add key="mykey" value="A,B,C"/>
和
string[] mykey = ConfigurationManager.AppSettings["mykey"].Split(',');
我想,您可以使用自定義配置部分http://www.4guysfromrolla.com/articles/032807-1.aspx
我接受JJS的回复:配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="List1" type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<section name="List2" type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<List1>
<add key="p-Teapot" />
<add key="p-drongo" />
<add key="p-heyho" />
<add key="p-bob" />
<add key="p-Black Adder" />
</List1>
<List2>
<add key="s-Teapot" />
<add key="s-drongo" />
<add key="s-heyho" />
<add key="s-bob"/>
<add key="s-Black Adder" />
</List2>
</configuration>
要檢索到字符串[]的代碼
private void button1_Click(object sender, EventArgs e)
{
string[] output = CollectFromConfig("List1");
foreach (string key in output) label1.Text += key + Environment.NewLine;
label1.Text += Environment.NewLine;
output = CollectFromConfig("List2");
foreach (string key in output) label1.Text += key + Environment.NewLine;
}
private string[] CollectFromConfig(string key)
{
NameValueCollection keyCollection = (NameValueCollection)ConfigurationManager.GetSection(key);
return keyCollection.AllKeys;
}
IMO,這就像它將要獲得的一樣簡單。 隨意證明我錯了:)
由於ConfigurationManager.AppSettings.GetValues()
方法不起作用,我使用以下解決方法來獲得類似的效果,但需要使用唯一索引對鍵進行後綴。
var name = "myKey";
var uniqueKeys = ConfigurationManager.AppSettings.Keys.OfType<string>().Where(
key => key.StartsWith(name + '[', StringComparison.InvariantCultureIgnoreCase)
);
var values = uniqueKeys.Select(key => ConfigurationManager.AppSettings[key]);
這將匹配myKey[0]
和myKey[1]
。
這是完整的解決方案:aspx.cs中的代碼
namespace HelloWorld
{
public partial class _Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
UrlRetrieverSection UrlAddresses = (UrlRetrieverSection)ConfigurationManager.GetSection("urlAddresses");
}
}
public class UrlRetrieverSection : ConfigurationSection
{
[ConfigurationProperty("", IsDefaultCollection = true,IsRequired =true)]
public UrlCollection UrlAddresses
{
get
{
return (UrlCollection)this[""];
}
set
{
this[""] = value;
}
}
}
public class UrlCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new UrlElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((UrlElement)element).Name;
}
}
public class UrlElement : ConfigurationElement
{
[ConfigurationProperty("name", IsRequired = true, IsKey = true)]
public string Name
{
get
{
return (string)this["name"];
}
set
{
this["name"] = value;
}
}
[ConfigurationProperty("url", IsRequired = true)]
public string Url
{
get
{
return (string)this["url"];
}
set
{
this["url"] = value;
}
}
}
}
並在網絡配置
<configSections>
<section name="urlAddresses" type="HelloWorld.UrlRetrieverSection" />
</configSections>
<urlAddresses>
<add name="Google" url="http://www.google.com" />
<add name="Yahoo" url="http://www.yahoo.com" />
<add name="Hotmail" url="http://www.hotmail.com/" />
</urlAddresses>