2013-10-25 11 views
26

nei siti normali moduli Web ASP.NET vorrei usare web.configs "appsettings" per aggiungere dati di impostazione applicazione a un sito. Tuttavia, io non sono in grado di recuperare i valori di impostazione in questo modo quando si utilizza MVC 3.MVC 3 valori che ottengono da AppSettings in web.config

Prima di tutto, ci sono 2 file web.config. Uno nella radice del sito, il secondo è elencato nell'area Viste. Suppongo di voler inserire le informazioni delle mie app nel file web.config di root, corretto? (Mettendolo in l'altro sotto di vista sembra produrre un errore che indica "AppSettings" può apparire solo una volta per ogni applicazione Web.)

Quando provo a recuperarla (C#: System.Configuration.ConfigurationManager.AppSettings [ "SettingName" ]) Ricevo un valore di ritorno vuoto o vuoto/nullo. Che cosa sto facendo di sbagliato?

Devo dire che io sono in realtà il recupero di queste informazioni in un file di classe sotto l'area modelle per impostare valori specifici per un modello con get; impostato;. È possibile che non mi sia permesso farlo in Modelli?

In un Controller.cs:

WindowsLiveConnect.ServiceConfiguration WLSC = new WindowsLiveConnect.ServiceConfiguration(); 

ViewBag.ClientID = SC.ClientID; // This returns empty 

Nel web.config

... 

    <appSettings> 
    <add key="webpages:Version" value="1.0.0.0"/> 
    <add key="ClientValidationEnabled" value="true"/> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 

    <add key="ClientID" value="0000000040062A3F" /> 
    <add key="ClientSecret" value="SUPERSECRETPASSWORD" /> 
    <add key="RedirectURL" value="http%3A%2F%2Fwww.quilnet.com" /> 
    </appSettings> 

... 

Nel file Model.cs:

 public class ServiceConfiguration 
     { 
      private string clientid; 
      private string clientsecret; 
      private string redirecturl; 

      public string ClientID 
      { 

       get { return clientid; } 

       set 
       { 
        clientid = System.Configuration.ConfigurationManager.AppSettings["ClientID"]; 
       } 
      } 

      public string ClientSecret 
      { 

       get { return clientsecret; } 

       set 
       { 
        clientsecret = System.Configuration.ConfigurationManager.AppSettings["ClientSecret"]; 
       } 
      } 

      public string RedirectURL 
      { 

       get { return redirecturl; } 

       set 
       { 
        redirecturl = System.Configuration.ConfigurationManager.AppSettings["RedirectURL"]; 
       } 
      } 
     } 
+0

1) Usare il web.config in il livello principale. 2) L'implementazione di 'set' non è corretta. Come lo avete ora, il vostro 'clientid' non viene inizializzato fino a quando si chiama in modo esplicito' ServiceConfiguration.ClientID = ... 'che poi assegnarle un valore da AppSettings. – Jasen

risposta

45

Di solito sto usando AppSettings classe statica per accedere a tali parametri. Qualcosa del genere:

public static class AppSettings 
{ 

    public static string ClientSecret 
    { 
     get 
     { 
      return Setting<string>("ClientSecret"); 
     } 
    } 

    private static T Setting<T>(string name) 
    { 
     string value = ConfigurationManager.AppSettings[name]; 

     if (value == null) 
     { 
      throw new Exception(String.Format("Could not find setting '{0}',", name)); 
     } 

     return (T)Convert.ChangeType(value, typeof(T), CultureInfo.InvariantCulture); 
    } 
} 
+2

I valori letti dall'elemento appSettings del file Web.config sono sempre di tipo String. Se la chiave specificata non esiste nel file Web.config, non si verifica alcun errore. Invece, viene restituita una stringa vuota. (http://msdn.microsoft.com/en-us/library/610xe886(v=vs.85).aspx) – qbantek

+2

ciò che intendevo è: credo che dovresti cercare String.IsNullOrEmpty (value) invece di value = null – qbantek

+1

non importa: ho notato che stai usando System.Configuration.ConfigurationManager e non System.Web.Configuration.WebConfigurationManager – qbantek

30

Stai sempre chiamando set? Suppongo che non venga mai chiamato, quindi la variabile privata non ottiene mai il valore dalla configurazione.

Prova in questo modo (solo recuperare il valore nella get, nessun set necessario):

public string ClientSecret 
{  
    get { return System.Configuration.ConfigurationManager.AppSettings["ClientSecret"]; }  
} 
1

Guardando il codice presumo che stiate utilizzando applicazioni in hosting con provider di sharepoint? La cosa migliore da fare qui in MVC è di ignorare il web.config che si trova sul livello di vista e utilizzare solo quello nella radice della WebApplication.

L'altra cosa che voglio dire è che la sua probabilmente non è una buona idea per andare a prendere le informazioni di configurazione dal web.config nel modello attuale. suo meglio spostarlo sia per: - il costruttore del controllore - la fabbrica/repository che restituisce questo modello

4

ho fatto in questo modo:

myVar = System.Configuration.ConfigurationManager.AppSettings["ClientID"].ToString(); 
Problemi correlati