2008-12-03 38 views
59

Tôi muốn lưu trữ một từ điển chuỗi khóa/giá trị đơn giản trong tệp cấu hình web của tôi. Visual Studio giúp bạn dễ dàng lưu trữ một bộ sưu tập chuỗi (xem mẫu bên dưới) nhưng tôi không chắc chắn làm thế nào để làm điều đó với một bộ sưu tập từ điển.Làm cách nào để lưu trữ một đối tượng từ điển trong tệp web.config của tôi?

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

Trả lời

113

Tại sao lại phát minh bánh xe? Phần AppSettings được thiết kế cho chính xác mục đích lưu trữ dữ liệu giống từ điển trong tệp cấu hình của bạn.

Nếu bạn không muốn đặt quá nhiều dữ liệu trong phần AppSettings của bạn, bạn có thể nhóm các giá trị liên quan của bạn vào phần riêng của họ như sau:

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

Bạn có thể truy cập vào các yếu tố trong bộ sưu tập này sử dụng

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

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

Đây là những gì tôi cần. Bây giờ, là một lập trình viên VB, tôi muốn đưa nó vào phần MySettings của web.config! – TGnat

+0

@TGnat, bạn có my.settings trong webprojects không? Tôi không. Trong các dự án winform, app.config và my.settings được đồng bộ hóa với nhau mà tôi nghĩ. – Stefan

+0

Có, Mẫu mã tôi đưa vào câu hỏi đã được sao chép từ My.Đặt trong web.config. – TGnat

5

Bạn cần triển khai phần tùy chỉnh (Xem Configuration Section Designer).

gì bạn thực sự muốn ... là một cái gì đó như thế này:

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

Trường hợp "tên" XmlAttribute là một khóa mà nó sẽ không cho phép có nhiều hơn một trong các mã sau. Đồng thời, hãy chắc chắn rằng Bộ sưu tập MyDictionary cũng là một từ điển.

Bạn có thể thực hiện tất cả điều này bằng công cụ này và lấp đầy khoảng trống nếu cần.

+0

Bạn có thể sử dụng Thuộc tính khóa thay vì Tên không? Tôi biết tôi có một vài người trong phần ứng dụng cho một số biến tôi sử dụng trên trang web. – Stefan

0

Tôi không biết cách lưu trữ trực tiếp từ điển nhưng bạn có thể dễ dàng sử dụng một chuỗi các chuỗi để lưu trữ từ điển. Đối với mỗi cặp khóa, giá trị, bạn lưu khóa đó làm chuỗi đầu tiên và giá trị là chuỗi thứ hai. Sau đó, khi xây dựng lại từ điển, bạn có thể hoàn tác mã hóa này.

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

câu trả lời của Juliet là ở điểm, nhưng FYI bạn cũng có thể đặt configs bổ sung trong bên ngoài .config file, bằng cách thiết lập web.config của bạn như sau:

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

Sau đó, bạn CustomDocTabs.config trông như thế này:

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

Bây giờ bạn có thể truy cập vào nó trong mã qua:

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

Đây là một điểm tuyệt vời. Tuy nhiên, một thay đổi là thay vì chỉ định thuộc tính "tệp", tôi chỉ có thể làm cho nó hoạt động với thuộc tính "configSource". ví dụ.

3

Trong cài đặt ứng dụng chúng ta có thể sử dụng 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> 

Truy cập danh sách:

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

Đây không phải là từ điển. – Cody

Các vấn đề liên quan