Могу ли я указать диапазон с атрибутом IntegerValidator в пользовательском разделе ConfigurationSection?

У меня есть класс, содержащий следующий 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:

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

Когда я затем пытаюсь использовать этот раздел конфигурации, я получаю следующую ошибку:

var Testing = ConfigurationManager.GetSection("TestingComponentSettings")
             as TestingComponentSettings;

ConfigurationErrorsException не было обработано

Недопустимое значение свойства «waitForTimeSeconds». Ошибка: значение должно находиться в диапазоне от 1 до 100.

Если я изменю IntegerValidator на ExcludeRage = true, я (очевидно) получу:

ConfigurationErrorsException не было обработано

Недопустимое значение свойства «waitForTimeSeconds». Ошибка: значение не должно быть в диапазоне 1-100

Если затем я изменю значение свойства в .config на число больше 100, оно сработает.

Если я изменю валидатор на MaxValue из 100, он сработает, но также примет значение -1.

Можно ли использовать IntegerValidatorAttribute с таким диапазоном?

Изменить, чтобы добавить

Подтверждено Microsoft как проблема.


person Zhaph - Ben Duguid    schedule 21.01.2010    source источник
comment
Ссылка Microsoft была обновлена ​​​​сегодня с решением. По-видимому, если значение по умолчанию не указано, в качестве значения по умолчанию используется 0. 0, конечно, вне диапазона 1-100. Решение состоит в том, чтобы добавить параметр DefaultValue= к атрибуту ConfigurationProperty со значением по умолчанию, которое находится в диапазоне. К сожалению, это означает, что вы устанавливаете значение по умолчанию, которое может не совпадать с тем, что вам нужно/нужно. У меня тоже была эта проблема. Рад, что наткнулся на этот вопрос!   -  person Skrud    schedule 28.01.2010


Ответы (1)


Как указывает Skrud, MS обновила проблему подключения:

Сообщенная проблема связана с особенностью того, как система конфигурации обрабатывает валидаторы. Каждое числовое свойство конфигурации имеет значение по умолчанию, даже если оно не указано. Если значение по умолчанию не указано, используется значение 0. В этом примере свойство конфигурации заканчивается значением по умолчанию, которое не находится в допустимом диапазоне, указанном средством проверки целых чисел. В результате синтаксический анализ конфигурации всегда терпит неудачу.

Чтобы исправить это, измените определение свойства конфигурации, включив в него значение по умолчанию в диапазоне от 1 до 100:

[ConfigurationProperty("waitForTimeSeconds", IsRequired=true, 
                       DefaultValue="10")]

Это означает, что свойство будет иметь значение по умолчанию, но на самом деле я не вижу в этом серьезной проблемы — мы говорим, что оно должно иметь значение, попадающее в «разумный» диапазон, и должно быть готово установить разумный дефолт.

person Zhaph - Ben Duguid    schedule 27.01.2010
comment
Это то, что в итоге сработало для меня. В моем случае я специально хотел, чтобы этот параметр был указан в файле конфигурации, поэтому я не хотел устанавливать значение по умолчанию. Но оказывается, что если вы пометите поле как обязательное, этот факт имеет приоритет, и значение по умолчанию никогда фактически используется, кроме как для предотвращения преждевременного запуска проверки. Это немного нелогично, но это работает. - person William Scalf; 08.05.2014