2011-06-09 17 views
8

Właśnie natknąłem się na ApplicationSettings w WinFormach .NET, które mogą obsługiwać typy złożone.
Obecnie używam AppSettings w moich WebForms ASP.NET, które mogą obsługiwać tylko ciąg.
Czy mogę użyć ApplicationSettings w formularzach internetowych? Jeśli tak to jak?Ustawienia aplikacji typu niestandardowego w ASP.NET

+0

Zamiast tego użyj Web.config. – BizApps

+0

Myślę, że o to pytasz: "Czy możesz przechowywać bardziej złożone typy w podobny sposób, jak AppSettings w aplikacji sieciowej? Jeśli tak, to musisz spojrzeć na" Zasoby osadzone "zamiast przechowywać je w Internecie. Config –

+0

@Dave: http://stackoverflow.com/questions/6288943/web-config-appsettings-complex-values/6288986#62889986 wywołało to pytanie.Przeczytaj komentarze Jestem sceptyczny – naveen

Odpowiedz

36

Podstawowa idea:

  1. W innym projekcie, tworzenia klas, które posiadają swoje ustawienia niestandardowe. Na przykład:

    public class EndPoint 
    { 
        public string HostName { get; set; } 
        public int Port { get; set; } 
    } 
    
    public class EndPointCollection : Collection<EndPoint> 
    { 
    } 
    
  2. Zbuduj projekt zawierający klasy.

  3. Przejdź do zakładki Ustawienia w Właściwości projektu. Powie, że nie ma jeszcze pliku ustawień i zapytaj, czy chcesz go utworzyć.

  4. Dodaj nowy plik ustawień. W polu typu wybierz Przeglądaj i wpisz pełną nazwę klasy. Na przykład: ClassLibrary.EndPointCollection. Zapisz i odbuduj projekt.

  5. Naciśnij przycisk edycji dla wartości ustawienia. (Zauważ, że nie będzie to możliwe, jeśli klasy wykonane we wcześniejszym kroku są w tym samym projekcie.) Użyj interfejsu do edycji ustawień.

    Visual Studio's settings value editor

  6. Jeśli otworzysz web.config/app.config plik, zobaczysz coś takiego:

    ... 
    <applicationSettings> 
        <WebApplication1.Properties.Settings> 
        <setting name="MyEndPoints" 
          serializeAs="Xml"> 
         <value> 
         <ArrayOfEndPoint xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
          <EndPoint> 
          <HostName>MyHostName</HostName> 
          <Port>12345</Port> 
          </EndPoint> 
          <EndPoint> 
          <HostName>MyHost1</HostName> 
          <Port>1212</Port> 
          </EndPoint> 
         </ArrayOfEndPoint> 
         </value> 
        </setting> 
        </WebApplication1.Properties.Settings> 
    </applicationSettings> 
    ... 
    
  7. Wreszcie, aby przeczytać te ustawienia z kod, po prostu użyj

    var endPointCollection = Settings.Default.MyEndPoints; 
    

    The d esigner stworzy, za kulisami, silnie wpisane obiekty, aby umożliwić powyższe działanie. Możesz zobaczyć pełne szczegóły w pliku Settings.Designer.cs.

Dolna linia: możesz wykonywać wszystkie rodzaje niestandardowych ustawień, o ile te ustawienia mają XmlSerializable lub mają konwerter typów. Ta technika działa na aplikacji internetowych, WinForms, WPF, aplikacji konsolowych itp

+6

W przypadku, gdy ktoś jeszcze nie jest widząc przycisk edytora '...' może to wynikać z tego, że klasa musi znajdować się w innym projekcie, niż gdzie znajdują się ustawienia, w ten sposób struktura jest uporządkowana, ale nie jest to jasne. ograniczenie "według: http://msdn.microsoft.com/en-us/library/wabtadw6(v=vs.100).aspx –

+0

Dla tych, którzy są sceptycznie nastawieni do proponowanej odpowiedzi, polecam sprawdzenie następującego pytania/answer: http://stackoverflow.com/questions/204695/stor ing-values-in-the-web-config-appsettings-or-configsection-co-is-more ... co przychodzi z pomysłem utworzenia sekcji konfiguracji niestandardowej – Learner

+2

@AustinThompson, myślę, że technicznie, klasa musi być w innej * przestrzeni nazw * do projektu; nadal działa, jeśli jest w tym samym projekcie, ale z inną przestrzenią nazw. – Sam

2

Oto wariacja na zaakceptowanej odpowiedzi, stosując następujące klasy zdefiniowanej przez użytkownika do reprezentowania ustawienie:

namespace MyApplication 
{ 
    public class EndPoint 
    { 
     public string HostName { get; set; } 
     public int Port { get; set; } 
    } 
} 

Zaakceptowanych odpowiedź proponuje korzystanie z wyspecjalizowanej klasy kolekcji, EndPointCollection do przechowywania ustawień. Jednak nie uważam tego za konieczne; Typ tablicy (EndPoint[]) również wydaje się działać.

Jednak wpisywanie typu tablicy w przeglądarce typów nie działa; możesz zamiast tego określić typ bezpośrednio w .Ustawienia pliku (przy użyciu edytora tekstu):

<Setting Name="MyEndPoints" Type="MyApplication.EndPoint[]" Scope="User"> 
    <Value Profile="(Default)" /> 
</Setting> 

Ponadto, jeśli redaktor wartość wykazana w przyjętym odpowiedź nie jest dostępny, można zamiast wpisać wartości bezpośrednio w polu wartości za pomocą XML:

<ArrayOfEndPoint> 
    <EndPoint> 
     <HostName>MyHostName</HostName> 
     <Port>12345</Port> 
    </EndPoint> 
    <EndPoint> 
     <HostName>MyHost1</HostName> 
     <Port>1212</Port> 
    </EndPoint> 
</ArrayOfEndPoint> 

A setting with its value set to a complex value using the above XML.

Należy pamiętać, że deklaracje przestrzeni nazw XML, że Visual Studio generuje nie są konieczne w formacie XML, jak pokazano powyżej.

+1

Należy również zauważyć, że powyższe nie działa dla członków typu szeregowego, które są tylko do odczytu (ustawienie właściwości prywatnej lub pole 'readonly'). Co niestety oznacza, że ​​dla wielu rodzajów typów zdefiniowanych przez użytkownika ktoś chciałby przechowywać w ustawieniach - np. proste niezmienne typy przechowywania wartości - ta bardzo użyteczna technika nie może być użyta. :( –

Powiązane problemy