ASP.NET中的自定义类型应用程序设置

nav*_*een 9 .net c# asp.net settings web-config

刚才我在.NET WinForms中遇到了可以处理复杂类型的ApplicationSettings.
目前我在我的ASP.NET WebForms中使用AppSettings,它只能处理字符串.
我可以在Webforms中使用ApplicationSettings吗?如果是这样的话?

Ale*_*Aza 38

基本理念:

  1. 在另一个项目中,创建将保留自定义设置的类.例如:

    public class EndPoint
    {
        public string HostName { get; set; }
        public int Port { get; set; }
    }
    
    public class EndPointCollection : Collection<EndPoint>
    {
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 构建包含类的项目.

  3. 转到" 项目属性 "中的"设置"选项卡.它会说还没有设置文件,并询问您是否要创建它.

  4. 添加新的设置文件.在类型字段中,选择" 浏览"并键入完整的类名.例如:ClassLibrary.EndPointCollection.保存并重建项目.

  5. 点击设置值的编辑按钮.(请注意,如果在前一步中创建的类位于同一项目中,则无法使用此选项.)使用UI编辑设置.

    Visual Studio的设置值编辑器

  6. 如果您打开web.config/app.config文件,您将看到如下内容:

    ...
    <applicationSettings>
      <WebApplication1.Properties.Settings>
        <setting name="MyEndPoints"
                 serializeAs="Xml">
          <value>
            <ArrayOfEndPoint xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                             xmlns:xsd="http://www.w3.org/2001/XMLSchema">
              <EndPoint>
                <HostName>MyHostName</HostName>
                <Port>12345</Port>
              </EndPoint>
              <EndPoint>
                <HostName>MyHost1</HostName>
                <Port>1212</Port>
              </EndPoint>
            </ArrayOfEndPoint>
          </value>
        </setting>
      </WebApplication1.Properties.Settings>
    </applicationSettings>
    ...
    
    Run Code Online (Sandbox Code Playgroud)
  7. 最后,要从代码中读取这些设置,只需使用即可

    var endPointCollection = Settings.Default.MyEndPoints;
    
    Run Code Online (Sandbox Code Playgroud)

    设计师将在幕后创建强类型对象以允许上述工作.您可以在Settings.Designer.cs文件中看到完整的详细信息.

底线:您可以进行各种自定义类型设置,只要这些设置具有XmlSerializable或具有类型转换器.此技术适用于Web应用程序,WinForms,WPF,控制台应用程序等.

  • 如果其他人没有看到编辑器`...`按钮,原因可能是该类必须位于与设置所在位置不同的项目中.这就是答案的结构,但它没有明确说明这一点.根据以下内容,这是一个"已知的限制":http://msdn.microsoft.com/en-us/library/wabtadw6(v = vs.100).aspx (6认同)
  • 刚刚尝试实现此解决方案,我似乎永远无法获得设置编辑器,无论该类是在单独的项目中还是在同一项目中的不同命名空间中.此解决方案是否仍适用于VS2012和.Net 4.5?还没有提到其他步骤吗? (4认同)
  • @AustinThompson,我认为从技术上讲,类必须与项目的*namespace*不同; 如果它在同一个项目中但具有不同的命名空间,它似乎仍然可以工作. (2认同)