Как мне сохранить объект словаря в моем файле web.config?

Я хотел бы сохранить простой словарь строковых ключей / значений в моем файле веб-конфигурации. 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>

person TGnat    schedule 03.12.2008    source источник


Ответы (5)


Зачем изобретать велосипед? Раздел 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"];
}
person Juliet    schedule 03.12.2008
comment
Это то, что мне было нужно. Теперь, будучи программистом на VB, я хотел бы добавить его в часть MySettings файла web.config! - person TGnat; 03.12.2008
comment
@TGnat, у вас есть my.settings в веб-проектах? Я не. Я думаю, что в winform-проектах app.config и my.settings синхронизируются друг с другом. - person Stefan; 04.12.2008
comment
Да, образец кода, который я включил в вопрос, был скопирован из My.Setting в web.config. - person TGnat; 04.12.2008
comment
Я попытался использовать приведенный выше код в своем проекте, но столкнулся с проблемой, когда включил его после элемента ‹appSettings›. Перемещение пользовательского материала выше appSettings, похоже, исправило это (не знаю, почему). Кроме того, я смог отбросить полное имя типа и просто использовать type = System.Configuration.NameValueFileSectionHandler. - person Nogwater; 07.05.2009
comment
Я думаю, что правильный вызов метода - ConfigurationManager.GetSection (MyDictionary). - person JefClaes; 29.12.2011
comment
Это не сработает, если вы попытаетесь определить MyDictionary в файле appSettings. Например, если у вас есть два разных файла configSource для ваших appSettings, вы можете использовать только <add> <clear> <remove>, а не новые разделы, такие как ‹MyDictionary›, который вы определили выше. - person styfle; 27.12.2012
comment
Пример дает мне ошибку HTTP Error 500.19 - Internal Server Error. По-видимому, это больше не работает в более поздних версиях ASP. - person James; 09.12.2014

Ответ Джульетты уместен, но, к вашему сведению, вы также можете разместить дополнительные конфигурации во внешних .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"
person Factor Mystic    schedule 20.07.2010
comment
Это отличный момент. Однако одна настройка заключается в том, что вместо указания файла атрибутов я мог заставить его работать только с атрибутом configSource. например ‹DocTabMap configSource = CustomDocTabs.config /› - person Michael Krauklis; 22.09.2016

Вам потребуется реализовать настраиваемый раздел (см. конструктор разделов конфигурации).

То, что вы действительно хотите ... похоже на это:

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

Где «имя» XmlAttribute - это Ключ, который не позволяет иметь более одного в коде позади. В то же время убедитесь, что Collection MyDictionary также является словарем.

Вы можете сделать все это с помощью этого инструмента и при необходимости заполнить пробел.

person Maxime Rouiller    schedule 03.12.2008
comment
Не можете использовать атрибут Key вместо Name? ‹Add key = UserName value = Stefan /› Я знаю, что у меня есть пара таких в разделе appsettings для некоторых переменных, которые я использую на веб-сайте. - person Stefan; 03.12.2008

В настройках приложения мы можем использовать 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]
person christo    schedule 29.07.2011
comment
Это не словарь. - person Cody; 20.01.2015

Я не уверен, как хранить словарь напрямую, но вы можете легко использовать массив строк для хранения словаря. Для каждой пары ключ, значение вы сохраняете ключ как первую строку и значение как вторую. Затем при восстановлении словаря вы можете отменить эту кодировку.

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;
}
person JaredPar    schedule 03.12.2008