2013-10-25 12 views
26

In normalen ASP.NET Web Forms-Sites würde ich web.configs "appsettings" verwenden, um Anwendungseinstellungsdaten zu einer Site hinzuzufügen. Ich kann jedoch auf diese Weise keine Einstellungswerte abrufen, wenn MVC 3 verwendet wird.MVC 3 ruft Werte von AppSettings in web.config ab

Als Erstes gibt es 2 web.config-Dateien. Eine im Stammverzeichnis der Site, die zweite im Bereich Views. Ich nehme an, dass ich meine Appsettings-Informationen in die Stammdatei web.config legen möchte, richtig? (Das Einfügen in die anderen Ansichten scheint einen Fehler zu erzeugen, der besagt, dass "AppSettings" nur einmal pro Webanwendung angezeigt werden kann.)

Wenn ich versuche, es abzurufen (C#: ]) Ich bekomme einen leeren oder leeren/null Rückgabewert. Was mache ich falsch?

Ich sollte erwähnen, dass ich diese Informationen tatsächlich in einer Klassendatei unter dem Bereich Modelle abruft, um spezifische Werte für ein Modell mit get festzulegen; einstellen;. Ist es möglich, dass ich das nicht in Models machen darf?

In einem Controller.cs:

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

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

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

... 

In der Model.cs Datei:

 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) Verwenden Sie die web.config bei die Root-Ebene. 2) Ihre 'set' Implementierung ist nicht korrekt. Wie Sie es jetzt haben, wird Ihre 'clientid' nicht initialisiert, bis Sie' ServiceConfiguration.ClientID = ... 'explizit aufrufen, die dann einen Wert aus AppSettings zuweisen. – Jasen

Antwort

45

Normalerweise AppSettings statische Klasse Ich verwende diese Parameter zuzugreifen. So etwas wie das:

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

Werte, die aus dem Element appSettings der Datei Web.config gelesen werden, haben immer den Typ String. Wenn der angegebene Schlüssel in der Datei Web.config nicht vorhanden ist, tritt kein Fehler auf. Stattdessen wird eine leere Zeichenfolge zurückgegeben. (http://msdn.microsoft.com/en-us/library/610xe886(v=vs.85).aspx) – qbantek

+2

was ich meinte ist: Ich glaube, dass Sie nach String.IsNullOrEmpty (Wert) anstelle von Wert = überprüfen sollten null – qbantek

+1

nevermind: Ich habe festgestellt, dass Sie System.Configuration.ConfigurationManager und nicht System.Web.Configuration.WebConfigurationManager verwenden – qbantek

30

Rufst du jemals gesetzt? Ich nehme an, dass es nie aufgerufen wird, also erhält die private Variable nie den Wert von der Config.

Versuchen Sie es auf diese Weise (nur den Wert in der get abrufen, kein Satz erforderlich):

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

Blick auf den Code Ich nehme an, Sie Sharepoint Provider Hosted Apps verwenden? Hier in mvc sollten Sie die Datei web.config ignorieren, die sich auf der Ansichtsebene befindet und nur die Datei im Stammverzeichnis der Webanwendung verwendet.

Die andere Sache, die ich erwähnen möchte ist, dass es wahrscheinlich keine gute Idee ist, Konfigurationsinformationen aus der web.config im aktuellen Modell zu holen. Es ist besser, es so oder zu verschieben: - der Konstruktor des Controllers - Werk/Repository, das dieses Modell gibt

4

Ich habe es auf diese Weise:

myVar = System.Configuration.ConfigurationManager.AppSettings["ClientID"].ToString(); 
Verwandte Themen