Я пишу раздел пользовательских настроек, и я хотел бы, чтобы проверить свойство конфигурации с обратным вызовом, как в этом примере:Пользовательских 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 Я обнаружил, что фактически функция проверки вызывается дважды: первый раз со значением по умолчанию для свойства, которое является пустой строкой, если ничего не указано, второй раз с реальным значением, считанным с Файл конфигурации. Есть ли способ изменить это поведение?
Возможно, IsRequired = false в ConfigurationPropertyAttribute? – Ikaso
@Ikaso: no, настройка IsRequired = true ничего не меняет. –
@PaoloTedesco: Ответ, который вы приняли, действительно устраняет проблему? Если кто-то упоминает «" (пустую строку) как значение в конфигурации (например, stringValue = ""), валидатор просто возвращает и 'IsRequired = true' также не дает никакого сообщения. 'Isrequired' жалуется только тогда, когда атрибут (свойство конфигурации) полностью отсутствует в конфигурации. – Learner