2011-06-09 4 views
8

Proprio ora mi sono imbattuto in ApplicationSettings in .NET WinForms in grado di gestire tipi complessi.
Attualmente sto usando AppSettings nei miei WebForm ASP.NET che possono gestire solo stringhe.
Posso utilizzare ApplicationSettings in Webforms? Se é cosi, come?Impostazioni dell'applicazione tipo personalizzato in ASP.NET

+0

Utilizzare invece Web.config. – BizApps

+0

Penso che quello che stai chiedendo è "Sei in grado di memorizzare più tipi complessi in modo simile a AppSettings all'interno di un'app Web? Se è così, allora devi dare un'occhiata a" Risorse incorporate "invece di memorizzarle in Web. Config –

+0

@Dave: http://stackoverflow.com/questions/6288943/web-config-appsettings-complex-values/6288986#62889986 ha attivato questa domanda, leggi i commenti sono scettico – naveen

risposta

36

L'idea di base:

  1. In un progetto diverso, creare classi che conterrà le impostazioni personalizzate. Ad esempio:

    public class EndPoint 
    { 
        public string HostName { get; set; } 
        public int Port { get; set; } 
    } 
    
    public class EndPointCollection : Collection<EndPoint> 
    { 
    } 
    
  2. Costruire il progetto contenente le classi.

  3. Vai agli Impostazioni scheda in Proprietà progetto. Dirà che non c'è ancora il file delle impostazioni e chiedi se vuoi crearlo.

  4. Aggiungere un nuovo file di impostazioni. Nel campo tipo selezionare Sfoglia e digitare il nome completo della classe. Ad esempio: ClassLibrary.EndPointCollection. Salva e ricostruisci il progetto.

  5. Premere il pulsante di modifica per il valore dell'impostazione. (Nota che questo non sarà disponibile se le classi fatte nel passaggio precedente si trovano nello stesso progetto.) Usa l'interfaccia utente per modificare le impostazioni.

    Visual Studio's settings value editor

  6. Se si apre il web.config/di file app.config, si vedrà qualcosa di simile:

    ... 
    <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. Infine, a leggere queste impostazioni dal codice, utilizzare semplicemente

    var endPointCollection = Settings.Default.MyEndPoints; 
    

    esigner avrà creato, dietro le quinte, gli oggetti fortemente tipizzati per consentire a quanto sopra di funzionare. È possibile visualizzare tutti i dettagli nel file Settings.Designer.cs.

Linea di fondo: si può fare tutti i tipi di impostazioni di tipo personalizzato, a patto che queste impostazioni hanno XmlSerializable o hanno convertitore di tipi. Questa tecnica funziona su applicazioni Web, WinForms, WPF, applicazioni console ecc

+6

Nel caso in cui qualcun altro non sia vedendo il pulsante dell'editor '...' la ragione potrebbe essere che la classe deve trovarsi in un progetto diverso da quello in cui si trovano le impostazioni.Questo è il modo in cui la risposta è strutturata ma non ha reso chiaramente quel punto. limitazione "secondo: http://msdn.microsoft.com/en-us/library/wabtadw6(v=vs.100).aspx –

+0

Per coloro che sono scettici con la risposta proposta, vorrei raccomandare di verificare la seguente domanda/answer: http://stackoverflow.com/questions/204695/stor ing-values-in-the-web-config-appsettings-or-configsection-which-is-more ... che nasce con l'idea di creare una sezione di configurazione personalizzata – Learner

+2

@AustinThompson, penso che tecnicamente, la classe deve essere in un diverso * spazio dei nomi * per il progetto; sembra ancora funzionare se si trova nello stesso progetto ma con uno spazio dei nomi diverso. – Sam

2

Qui è una variante la risposta accettata, con la seguente classe definita dall'utente per rappresentare un'impostazione:

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

La risposta accettata propone l'uso di una classe di raccolta specializzata, EndPointCollection per mantenere le impostazioni. Tuttavia, non penso che sia necessario; anche un tipo di array (EndPoint[]) sembra funzionare.

Tuttavia, digitare il tipo di matrice nel browser dei tipi non funziona; puoi invece specificare il tipo direttamente nel .Impostazioni di file (usando un editor di testo):

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

Inoltre, se l'editor valore indicato nella risposta accettato non è disponibile, è possibile invece digitare i valori direttamente nel campo valore utilizzando 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.

si noti che le dichiarazioni di namespace XML che genera Visual Studio non sono necessari in XML, come indicato sopra.

+1

Si noti inoltre che quanto sopra non funziona per i membri del tipo serializzato che sono di sola lettura (setter di proprietà privata o campo 'readonly'). Sfortunatamente, ciò significa che per molti tipi di tipi definiti dall'utente che qualcuno vorrebbe memorizzare nelle impostazioni, ad es. semplici tipi di memorizzazione del valore immutabili - questa tecnica molto utile non può essere utilizzata. :( –

Problemi correlati