2008-12-03 3 views
59

Я хотел бы сохранить простой словарь строки/значения в моем файле веб-конфигурации. Visual Studio упрощает хранение коллекции строк (см. Пример ниже), но я не уверен, как это сделать со сборником словарей.Как сохранить словарь в моем файле web.config?

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

ответ

113

Зачем изобретать колесо? Раздел 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"]; 
} 
+0

Это то, что мне нужно. Теперь, будучи программистом VB, я хотел бы получить его в разделе MySettings web.config! – TGnat 2008-12-03 19:13:14

+0

@TGnat, у вас есть my.settings в веб-проектах? Я не. В winform-проектах app.config и my.settings синхронизированы друг с другом, я думаю. – Stefan 2008-12-03 21:55:25

+0

Да, образец кода, который я включил в вопрос, был скопирован из My.Установка в файле web.config. – TGnat 2008-12-04 04:49:13

5

Вам нужно будет реализовать пользовательский раздел (см Configuration Section Designer).

То, что вы действительно хотите ... что-то близкое к этому:

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

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

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

+0

Нельзя использовать атрибут Key вместо имени? Я знаю, что у меня есть пара тех, кто находится в разделе appsettings для некоторых переменных, которые я использую на веб-сайте. – Stefan 2008-12-03 18:41:12

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

ответ Джульетты на момент, но FYI вы также можете поместить дополнительные конфиги во внешних .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" 
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]