我能否在自定义的ConfigurationSection上使用IntegerValidator属性指定一个范围?

8

我有一个包含以下ConfigurationSection的类:

namespace DummyConsole {
  class TestingComponentSettings: ConfigurationSection {

    [ConfigurationProperty("waitForTimeSeconds", IsRequired=true)]
    [IntegerValidator(MinValue = 1, MaxValue = 100, ExcludeRange = false)]
    public int WaitForTimeSeconds
    {
        get { return (int)this["waitForTimeSeconds"]; }
        set { this["waitForTimeSeconds"] = value; }
    }

    [ConfigurationProperty("loginPage", IsRequired = true, IsKey=false)]
    public string LoginPage
    {
        get { return (string)this["loginPage"]; }
        set { this["loginPage"] = value; }
    }
  }
}

我在我的.config文件中有以下内容:

然后,我在我的.config文件中添加了以下内容:

<configSections>
  <section name="TestingComponentSettings" 
           type="DummyConsole.TestingComponentSettings, DummyConsole"/>
</configSections>
<TestingComponentSettings waitForTimeSeconds="20" loginPage="myPage" />

当我尝试使用此配置部分时,我会收到以下错误提示:
var Testing = ConfigurationManager.GetSection("TestingComponentSettings")
             as TestingComponentSettings;

ConfigurationErrorsException was unhandled

属性 'waitForTimeSeconds' 的值无效。错误信息:该值必须在1-100范围内。

如果将 IntegerValidator 更改为 ExcludeRange = true,则会出现以下情况:

ConfigurationErrorsException was unhandled

属性 'waitForTimeSeconds' 的值无效。错误信息:该值不能在1-100范围内。

然后,如果将 .config 文件中的该属性值更改为大于100的数字,则可以正常工作。

如果将验证器更改为仅具有最大值为100,则可以正常工作,但也将接受值为-1的情况。

是否可以使用带有此类范围的 IntegerValidatorAttribute

编辑添加

由微软确认为问题


2
微软链接已经更新,提供了解决方案。显然,如果没有指定默认值,则使用“0”作为默认值。当然,“0”不在1-100的范围内。“解决方案”是在ConfigurationProperty属性中添加一个DefaultValue=参数,并设置一个在范围内的默认值。不幸的是,这意味着您正在强制使用可能不是您想要/需要的默认值。我也遇到了这个问题。很高兴偶然发现了这个问题! - Skrud
1个回答

16

正如Skrud所指出的那样,微软已经更新了连接问题:

报告的问题是由于配置系统处理验证器时的怪癖导致的。每个数值配置属性都有一个默认值,即使未指定。当没有指定默认值时,使用0作为值。在这个例子中,配置属性最终获得了一个不在整数验证器指定的有效范围内的默认值。因此,配置解析总是失败。

要修复这个问题,请将配置属性定义更改为包括在1到100范围内的默认值:

[ConfigurationProperty("waitForTimeSeconds", IsRequired=true, 
                       DefaultValue="10")]
这意味着属性将有一个默认值,但我并不认为这是一个重大问题 - 我们说它应该有一个在“合理”范围内的值,并且应该准备设置一个合理的默认值。

4
这是最终对我有效的方法。在我的情况下,我特别希望要求在配置文件中指定选项,因此我不想设置默认值。但事实证明,如果将字段标记为必需,那么这个事实会优先考虑,并且默认值实际上从未被使用,除了防止验证过早触发。这有点违反直觉,但它是有效的。 - William Scalf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接