我正在编写自定义配置部分,我想使用回调验证配置属性,如下例所示:
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参数始终是一个空字符串,因此验证失败.如果我只删除验证器,则将字符串值正确初始化为配置文件中的值.
我错过了什么?
编辑我发现实际上验证函数被调用了两次:第一次使用属性的默认值,如果没有指定则为空字符串,第二次使用从配置文件中读取的实际值.有没有办法修改这种行为?
最佳答案 我有同样的问题(除了我创建一个自定义验证器而不是使用CallbackValidator) – 验证器被调用两次,第一次调用传递默认值,第二次调用传递配置值.由于空字符串不是我的某个属性的有效值,因此即使配置了字符串值,也会导致配置错误.
所以我只是更改了验证器以返回一个空字符串,而不是验证它.然后,您可以使用IsRequired属性来控制未提供值时发生的情况.