2010-05-06 6 views
4

Я пишу раздел пользовательских настроек, и я хотел бы, чтобы проверить свойство конфигурации с обратным вызовом, как в этом примере:Пользовательских ConfigurationSection: CallbackValidator вызывается с пустой строкой

using System; 
using System.Configuration; 

class CustomSection : ConfigurationSection { 

    [ConfigurationProperty("stringValue", IsRequired = false)] 
    [CallbackValidator(Type = typeof(CustomSection), CallbackMethodName = "ValidateString")] 
    public string StringValue { 
     get { return (string)this["stringValue"]; } 
     set { this["stringValue"] = value; } 
    } 

    public static void ValidateString(object value) { 
     if (string.IsNullOrEmpty((string)value)) { 
      throw new ArgumentException("string must not be empty."); 
     } 
    } 
} 

class Program { 
    static void Main(string[] args) { 
     CustomSection cfg = (CustomSection)ConfigurationManager.GetSection("customSection"); 
     Console.WriteLine(cfg.StringValue); 
    } 
} 

И мой файл App.config выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="customSection" type="CustomSection, config-section"/> 
    </configSections> 
    <customSection stringValue="lorem ipsum"/> 
</configuration> 

Моя проблема заключается в том, что, когда функция ValidateString называется параметр value всегда пустая строка, и, следовательно, проверка не выполняется. Если я просто удалю валидатор, строковое значение будет правильно инициализировано значением в файле конфигурации.

Что мне не хватает?

EDIT Я обнаружил, что фактически функция проверки вызывается дважды: первый раз со значением по умолчанию для свойства, которое является пустой строкой, если ничего не указано, второй раз с реальным значением, считанным с Файл конфигурации. Есть ли способ изменить это поведение?

+0

Возможно, IsRequired = false в ConfigurationPropertyAttribute? – Ikaso

+0

@Ikaso: no, настройка IsRequired = true ничего не меняет. –

+0

@PaoloTedesco: Ответ, который вы приняли, действительно устраняет проблему? Если кто-то упоминает «" (пустую строку) как значение в конфигурации (например, stringValue = ""), валидатор просто возвращает и 'IsRequired = true' также не дает никакого сообщения. 'Isrequired' жалуется только тогда, когда атрибут (свойство конфигурации) полностью отсутствует в конфигурации. – Learner

ответ

2

У меня была такая же проблема (за исключением того, что я создавал специальный валидатор вместо использования CallbackValidator) - валидатор вызывался дважды, причем первый вызов передавался по умолчанию, а второй - в настроенных значениях. Поскольку пустая строка не была допустимым значением для одного из моих свойств, она вызывала ошибку конфигурации, даже когда я настроил строковое значение.

Поэтому я просто изменил валидатор, чтобы возвращать пустую строку, а не проверять ее. Затем вы можете использовать атрибут IsRequired для управления тем, что происходит, когда значение не предоставляется.

+1

Реально ли это проблема? Если кто-то упоминает «" (пустую строку) как значение в конфигурации (например, stringValue = ""), валидатор просто возвращает и 'IsRequired = true' не дает никакого сообщения. 'Isrequired' жалуется только тогда, когда атрибут (свойство конфигурации) полностью отсутствует в конфигурации. – Learner

Смежные вопросы