2008-12-03 7 views
59

Ich möchte ein einfaches Schlüssel/Wert-String-Wörterbuch in meiner Web-Konfigurationsdatei speichern. Visual Studio erleichtert das Speichern einer Zeichenfolgesammlung (siehe Beispiel unten), aber ich bin mir nicht sicher, wie ich das mit einer Wörterbuchsammlung machen soll.Wie speichere ich ein Wörterbuchobjekt in meiner Datei 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> 

Antwort

113

Warum das Rad neu erfinden? Der Abschnitt AppSettings ist für genau den Zweck gedacht, wörterbuchartige Daten in Ihrer Konfigurationsdatei zu speichern.

Wenn Sie nicht zu viele Daten in Ihrem AppSettings Abschnitt setzen möchten, können Sie Ihre Gruppe zugehörigen Werte in einem eigenen Abschnitt wie folgt:

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

Sie können Elemente Zugriff in dieser Sammlung mit

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

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

Das ist, was ich brauchte. Nun, als VB-Programmierer möchte ich es in den MySettings-Teil der web.config bringen! – TGnat

+0

@TGnat, hast du my.settings in webprojects? Ich nicht. In winform-projects sind die app.config und my.settings nach meiner Meinung gegeneinander synchronisiert. – Stefan

+0

Ja, das Codebeispiel, das ich in die Frage eingefügt habe, wurde von einem My kopiert.Einstellung in der web.config. – TGnat

5

Sie müssten einen benutzerdefinierten Abschnitt implementieren (siehe Configuration Section Designer).

Was Sie wirklich wollen ... ist etwas in der Nähe dieser:

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

Wo der XmlAttribute „name“ ist ein Schlüssel, der es nicht erlaubt, mehr als eine in der Code-behind zu haben. Stellen Sie gleichzeitig sicher, dass das Collection MyDictionary auch ein Dictionary ist.

Sie können all dies mit diesem Tool tun und füllen Sie die Lücke wie benötigt.

+0

Können Sie das Key-Attribut anstelle von Name verwenden? Ich weiß, ich habe ein paar davon im appsettings-Abschnitt für einige Variablen, die ich auf der Website verwende. – Stefan

0

Ich bin nicht sicher, wie man ein Dictionary direkt speichert, aber Sie könnten einfach ein Array von Strings verwenden, um ein Wörterbuch zu speichern. Für jedes Schlüssel-Wert-Paar speichern Sie den Schlüssel als erste Zeichenfolge und den Wert als zweite Zeichenfolge. Wenn Sie das Wörterbuch neu aufbauen, können Sie diese Kodierung rückgängig machen.

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

Julias Antwort ist auf den Punkt, aber FYI können Sie auch zusätzliche Konfigurationen in externen .config Dateien setzen, indem Sie Ihre web.config Einrichtung wie folgt:

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

Dann Ihre CustomDocTabs.config sieht wie folgt aus:

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

Jetzt haben Sie es im Code über zugreifen:

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

Das ist ein ausgezeichneter Punkt. Eine Optimierung besteht jedoch darin, das Attribut "Datei" nicht anzugeben, sondern nur mit dem Attribut "configSource". z.B.

3

In Anwendungseinstellungen können wir System.Collection.Specilized.StringCollection verwenden

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

Zugriff auf die Liste:

var element = Settings.Default.ElementsList[index] 
+2

Dies ist kein Wörterbuch. – Cody

Verwandte Themen