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

时间:2011-06-09 07:20:48

标签: c# .net asp.net web-config settings

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

2 个答案:

答案 0 :(得分:38)

基本理念:

  1. 在其他项目中,创建将保留自定义设置的类。例如:

    public class EndPoint
    {
        public string HostName { get; set; }
        public int Port { get; set; }
    }
    
    public class EndPointCollection : Collection<EndPoint>
    {
    }
    
  2. 构建包含类的项目。

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

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

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

    Visual Studio's settings value editor

  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>
    ...
    
  7. 最后,要从代码中读取这些设置,只需使用

    即可
    var endPointCollection = Settings.Default.MyEndPoints;
    

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

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

答案 1 :(得分:2)

这是接受答案的变体,使用以下用户定义的类来表示设置:

namespace MyApplication
{
    public class EndPoint
    {
        public string HostName { get; set; }
        public int Port { get; set; }
    }
}

接受的答案建议使用专门的集合类EndPointCollection来保存设置。但是,我不认为这是必要的;数组类型(EndPoint[])似乎也有效。

但是,在类型浏览器中键入数组类型并不起作用;您可以直接在 .settings 文件中指定类型(使用文本编辑器):

<Setting Name="MyEndPoints" Type="MyApplication.EndPoint[]" Scope="User">
    <Value Profile="(Default)" />
</Setting>

此外,如果接受的答案中显示的值编辑器不可用,您可以使用XML直接在值字段中键入值:

<ArrayOfEndPoint>
    <EndPoint>
        <HostName>MyHostName</HostName>
        <Port>12345</Port>
    </EndPoint>
    <EndPoint>
        <HostName>MyHost1</HostName>
        <Port>1212</Port>
    </EndPoint>
</ArrayOfEndPoint>

A setting with its value set to a complex value using the above XML.

请注意,Visual Studio生成的XML名称空间声明在XML中是不必要的,如上所示。