【问题标题】:Custom type application settings in ASP.NETASP.NET 中的自定义类型应用程序设置
【发布时间】:2011-09-11 11:24:47
【问题描述】:

刚才我在 .NET WinForms 中遇到了可以处理复杂类型的 ApplicationSettings。
目前我在我的 ASP.NET WebForms 中使用 AppSettings,它只能处理字符串。
我可以在 Web 表单中使用 ApplicationSettings 吗?如果有怎么办?

【问题讨论】:

  • 我认为您要问的是“您是否能够以类似于 Web 应用程序中的 AppSettings 的方式存储更复杂的类型?如果是这样,那么您需要查看“嵌入式资源”而不是将它们存储在 Web.Config
  • @Dave: stackoverflow.com/questions/6288943/… 触发了这个问题。阅读 cmets。我仍然持怀疑态度

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


【解决方案1】:

基本思路:

  1. 在不同的项目中,创建将保存您的自定义设置的类。例如:

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

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

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

  5. 点击设置值的编辑按钮。 (请注意,如果前面步骤中创建的类在同一个项目中,这将不可用。)使用 UI 编辑设置。

  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 文件中查看完整的详细信息。

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

【讨论】:

  • 对于那些对建议的答案持怀疑态度的人,我建议检查以下问题/答案:stackoverflow.com/questions/204695/… ... 它提出了创建自定义配置部分的想法
  • 如果其他人没有看到编辑器... 按钮,原因可能是该类必须位于与设置所在位置不同的项目中。这就是答案的结构,但它并没有清楚地说明这一点。这是一个“已知限制”,根据:msdn.microsoft.com/en-us/library/wabtadw6(v=vs.100).aspx
  • @AustinThompson,我认为从技术上讲,该类必须位于与项目不同的 namespace 中;如果它在同一个项目中但具有不同的命名空间,它似乎仍然有效。
  • 刚刚尝试实施此解决方案,无论该类是在单独的项目中还是在同一项目中的不同命名空间中,我似乎都无法获得设置编辑器。这个解决方案在 VS2012 和 .Net 4.5 中仍然有效吗?是否还有未提及的其他步骤?
  • 我成功完成了这些步骤,并使用编辑器添加了一些设置。但是我在 web.config 中看不到序列化设置。实际上,似乎在编辑器向导中点击“确定”后,设置实际上并没有得到保存。没有“保存”,在vs中做“全部保存”,似乎只是重置设置
【解决方案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>

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

【讨论】:

  • 另请注意,上述方法不适用于只读的序列化类型的成员(私有属性设置器或readonly 字段)。不幸的是,这意味着对于很多类型的用户定义类型,有人希望将其存储在设置中——例如简单的不可变值存储类型——不能使用这种非常有用的技术。 :(
猜你喜欢
  • 2012-10-13
  • 2016-09-11
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
相关资源
最近更新 更多