如何在我的web.config文件中存储字典对象?


67

我想在我的Web配置文件中存储一个简单的键/值字符串字典。Visual Studio可以很容易地存储字符串集合(请参见下面的示例),但是我不确定如何使用字典集合。

        <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          <string>value1</string>
          <string>value2</string>
          <string>value2</string>
        </ArrayOfString>

Answers:


126

为什么要重新发明轮子?该AppSettings的部分被设计用于存储字典的在你的配置文件中的数据准确的目的。

如果您不想在“ AppSettings”部分中放置太多数据,可以将相关值分组到自己的部分中,如下所示:

<configuration>
  <configSections>
    <section 
      name="MyDictionary" 
      type="System.Configuration.NameValueFileSectionHandler,System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>

  <MyDictionary>
     <add key="name1" value="value1" />
     <add key="name2" value="value2" />
     <add key="name3" value="value3" />
     <add key="name4" value="value4" />
  </MyDictionary>
</configuration>

您可以使用以下方法访问此集合中的元素

using System.Collections.Specialized;
using System.Configuration;

public string GetName1()
{
    NameValueCollection section =
        (NameValueCollection)ConfigurationManager.GetSection("MyDictionary");
    return section["name1"];
}

这就是我所需要的。现在,作为一名VB程序员,我希望将其纳入web.config的MySettings部分!
TGnat

@TGnat,您在Web项目中是否有my.settings?我不。在winform-projects中,我认为app.config和my.settings是相互同步的。
Stefan

是的,我从问题中包含的代码示例是从web.config中的My.Setting复制的。
TGnat

1
我试图在项目中使用上面的代码,但是当我在<appSettings>元素之后添加上述代码时遇到了问题。将自定义内容移至appSettings上方似乎可以解决该问题(不确定原因)。另外,我能够删除完整的类型名称,而只需使用type =“ System.Configuration.NameValueFileSectionHandler”。
Nogwater,2009年

1
我认为正确的方法调用是ConfigurationManager.GetSection(“ MyDictionary”)。
JefClaes

27

朱丽叶(Juliet)的答案是正确的,但仅供参考,您还可以.config通过web.config如下设置来在外部文件中添加其他配置:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <!-- blah blah the default stuff here -->

    <!-- here, add your custom section -->
    <section name="DocTabMap" type="System.Configuration.NameValueFileSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>

  <!-- your custom section, but referenced in another file -->
  <DocTabMap file="CustomDocTabs.config" />

  <!-- etc, remainder of default web.config is here -->
</configuration>

然后,您的CustomDocTabs.config外观如下所示:

<?xml version="1.0"?>
<DocTabMap>
  <add key="A" value="1" />
  <add key="B" value="2" />
  <add key="C" value="3" />
  <add key="D" value="4" />
</DocTabMap>

现在,您可以通过以下代码访问它:

NameValueCollection DocTabMap = ConfigurationManager.GetSection("DocTabMap") as NameValueCollection;
DocTabMap["A"] // == "B"

1
这是一个很好的观点。但是,一项调整不是代替指定属性“文件”,我只能使其与属性“ configSource”一起使用。例如<DocTabMap configSource =“ CustomDocTabs.config” />
Michael Krauklis

5

您将需要实现一个自定义部分(请参阅“配置部分设计器”)。

您真正想要的是……与之接近的东西:

<MyDictionary>
  <add name="Something1" value="something else"/>
  <add name="Something2" value="something else"/>
  <add name="Something3" value="something else"/>
</MyDictionary>

XmlAttribute“名称”是一个Key,在后面的代码中不允许有多个。同时,确保“收藏MyDictionary”也是“字典”。

您可以使用此工具完成所有这些操作,并根据需要填补空白。


难道您使用键属性而不是名称?<add key =“ UserName” value =“ Stefan” />我知道我在appsettings部分中有几个用于网站中使用的变量的变量。
Stefan

3

在应用程序设置中,我们可以使用System.Collection.Specilized.StringCollection

<X.Properties.Settings>
  <setting name="ElementsList" serializeAs="Xml">
    <value>
      <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <string>Element1</string>
        <string>Element2</string>
      </ArrayOfString>
    </value>
  </setting>
</X.Properties.Settings>

访问列表:

var element = Settings.Default.ElementsList[index]

2
这不是字典。
科迪2015年

0

我不确定如何直接存储字典,但是您可以轻松地使用字符串数组来存储字典。对于每个键,将值对保存为第一个字符串,将值保存为第二个字符串。然后,当重建字典时,您可以撤消此编码。

static Dictionary<string,string> ArrayToDictionary(string[] data) {
  var map = new Dictionary<string,string>();
  for ( var i=  0; i < data.Length; i+=2 ) {
    map.Add(data[i], data[i+1]);
  }
  return map;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.