2013-10-25 55 views
26

在正常的ASP.NET Web表单网站中,我将使用web.configs“appsettings”将应用程序设置数据添加到网站。但是,当使用MVC 3时,我无法以这种方式检索设置值。MVC 3从web.config中的AppSettings获取值

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

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

我应该提到,我实际上是在Model区域下的Class文件中检索这些信息,以便使用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"]; 
       } 
      } 
     } 
+0

1)使用在web.config中根级。 2)你的'set'实现不正确。就像你现在所做的那样,你的'clientid'不会被初始化,直到你明确地调用'ServiceConfiguration.ClientID = ...',然后它会从AppSettings中为它分配一个值。 – Jasen

回答

45

通常我使用的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); 
    } 
} 
+2

从Web.config文件的appSettings元素读取的值始终为String类型。如果指定的键不存在于Web.config文件中,则不会发生错误。而是返回一个空字符串。 (http://msdn.microsoft.com/en-us/library/610xe886(v=vs.85).aspx) – qbantek

+2

我的意思是:我相信你应该检查String.IsNullOrEmpty(值),而不是值= null – qbantek

+1

nevermind:我注意到你正在使用System.Configuration.ConfigurationManager而不是System.Web.Configuration.WebConfigurationManager – qbantek

30

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

尝试这种方式(只检索在获取的价值,没有固定的需要):

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

看看代码我假设你使用SharePoint提供程序托管的应用程序? 在mvc中做的最好的事情是忽略位于视图级别的web.config,并且只使用web应用程序根目录下的web.config。

我想提到的另一件事是,它可能不是一个好主意从实际模型中的web.config中获取配置信息。 其更好地,要么移动到: - 控制器 的构造 - 工厂/仓库返回该模型

4

我就是这么做的:

myVar = System.Configuration.ConfigurationManager.AppSettings["ClientID"].ToString(); 
相关问题