web-dev-qa-db-fra.com

MVC 3 obtenir des valeurs d'AppSettings dans web.config

Dans les sites de formulaires Web ASP.NET normaux, j'utilisais les "paramètres d'applications" de web.configs pour ajouter des données de paramètres d'application à un site. Cependant, je ne parviens pas à récupérer les valeurs de réglage de cette manière lors de l'utilisation de MVC 3.

Tout d'abord, il y a 2 fichiers web.config. Un à la racine du site, le second est répertorié dans la zone Vues. Je suppose que je veux mettre mes informations appsettings dans le fichier racine web.config, correct? (le placer dans les autres vues sous semble produire une erreur indiquant que "AppSettings" ne peut apparaître qu'une fois par application Web.)

Lorsque j'essaie de le récupérer (C #: System.Configuration.ConfigurationManager.AppSettings ["SettingName"]), la valeur renvoyée est vide ou vide/null. Qu'est-ce que je fais mal?

Je dois mentionner que je récupère actuellement ces informations dans un fichier de classe sous la zone Modèles pour définir des valeurs spécifiques pour un modèle à l'aide de get; ensemble;. Est-il possible que je ne sois pas autorisé à faire cela dans les modèles?

Dans un Controller.cs:

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

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

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

...

Dans le fichier 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"];
                }
            }
        }
33
Vinod Kumar

J'utilise généralement la classe statique AppSettings pour accéder à ces paramètres. Quelque chose comme ça:

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);
    }
}
59

Est-ce que vous appelez déjà ensemble? J'imagine qu'il n'est jamais appelé, donc la variable privée n'obtient jamais la valeur de la configuration.

Essayez-le de cette manière (récupérez simplement la valeur dans le get, aucun ensemble requis):

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

Je l'ai fait comme ça:

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

En regardant le code, je suppose que vous utilisez des applications hébergées par le fournisseur SharePoint? La meilleure chose à faire ici dans mvc est d’ignorer le fichier web.config qui se trouve au niveau de la vue et d’utiliser uniquement celui qui se trouve à la racine de l’application Web.

L'autre chose que je veux mentionner est que ce n'est probablement pas une bonne idée d'extraire des informations de configuration à partir de web.config dans le modèle actuel. Il est préférable de le déplacer soit vers: - le constructeur du contrôleur - la fabrique/le référentiel qui renvoie ce modèle

1
Serge