38

在普通的 ASP.NET Web 表单站点中,我会使用 web.configs "appsettings" 将应用程序设置数据添加到站点。但是,在使用 MVC 3 时,我无法以这种方式检索设置值。

首先,有 2 个 web.config 文件。一个在站点的根目录中,第二个列在“视图”区域中。我假设我想将我的 appsettings 信息放在根 web.config 文件中,对吗?(将它放在另一个视图中似乎会产生一个错误,指出“AppSettings”每个 Web 应用程序只能出现一次。)

当我尝试检索它时 (C#: System.Configuration.ConfigurationManager.AppSettings["SettingName"]) 我得到一个空白或空/空返回值。我究竟做错了什么?

我应该提到,我实际上是在模型区域下的类文件中检索此信息,以便使用 get 为模型设置特定值;放;。有没有可能我不允许在模型中这样做?

在 Controller.cs 中:

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

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

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

...

在 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"];
                }
            }
        }
4

4 回答 4

66

通常我使用 AppSettings 静态类来访问这些参数。像这样的东西:

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);
    }
}
于 2013-10-25T21:49:20.443 回答
34

你有没有打电话给set?我猜它永远不会被调用,所以私有变量永远不会从配置中获取值。

以这种方式尝试(只需检索 get 中的值,无需设置):

public string ClientSecret
{    
  get { return System.Configuration.ConfigurationManager.AppSettings["ClientSecret"]; }    
}
于 2013-10-25T17:51:12.203 回答
7

我是这样做的:

myVar = System.Configuration.ConfigurationManager.AppSettings["ClientID"].ToString();
于 2016-01-28T21:35:13.930 回答
1

查看我假设您正在使用共享点提供商托管应用程序的代码?在 mvc 中最好的做法是忽略视图级别的 web.config,只使用 web 应用程序根目录中的那个。

我要提到的另一件事是,从实际模型中的 web.config 获取配置信息可能不是一个好主意。最好将其移动到: - 控制器的构造函数 - 返回此模型的工厂/存储库

于 2015-05-29T10:57:28.393 回答