假设我有一个配置属性,如下所示。请注意,没有默认值。
[ConfigurationProperty("x", IsRequired = true)]
[StringValidator(MinLength = 1)]
public string X
{
get { return (string)this["x"]; }
set { this["x"] = value; }
}现在,我将我的部分添加如下:
<mySection x="123" />我会得到这个错误:
属性'x‘的值无效。错误是:字符串必须至少有一个字符长。
如果我将configuration属性更改为包含这样的默认设置,它就可以工作:
[ConfigurationProperty("x", DefaultValue="abc", IsRequired = true)]
[StringValidator(MinLength = 1)]
public string X
{
get { return (string)this["x"]; }
set { this["x"] = value; }
}这意味着即使IsRequired是真的,验证器也会验证默认值。这也意味着,我必须在所有属性上包含一个虚拟默认值,才能通过验证,即使它们实际上不会被使用。
这是一个糟糕的设计,还是有一个合理的理由,这种行为?
发布于 2010-09-19 08:48:46
我以前也有过这个问题。这是有道理的,但我记不起细节了。
我不记得这是否有效,但是您可以尝试在构造函数中声明属性,其中null是默认值。
public class CustomConfigurationSection : ConfigurationSection
{
public CustomConfigurationSection()
{
Properties.Add(new ConfigurationProperty(
"x",
typeof(string),
null,
null,
new StringValidator(1),
ConfigurationPropertyOptions.IsRequired));
}
public string X
{
get { return (string)this["x"]; }
set { this["x"] = value; }
}
}这与使用默认值和验证器有关,但也是需要默认值的地方。http://msdn.microsoft.com/en-us/library/system.configuration.configurationproperty(VS.85).aspx#1
编辑
我刚刚试用了前面的代码,它就像我预期的那样做了。我之前的代码没有编译,因为我遗漏了一个构造函数属性,所以我已经修复了它。
发布于 2012-02-05 14:06:48
原因是可以在代码中更新配置节类,而不需要配置文件。可以使用默认构造函数,而不为属性指定任何值。在这种情况下,即使您指定了IsRequired=true,也不会引发任何异常。换句话说,只有当属性被从XML反序列化时,IsRequired才会应用。
但是,DefaultValue在这种情况下确实适用,就像当属性从XML反序列化时一样(与任何ConfigurationValidatorAttribute一样)。
如果在单元测试中使用配置部分,这是有意义的。A)在构造节时有一个声明性默认值,B)对默认值进行验证。
发布于 2010-09-19 12:00:02
根据我的理解,这种行为是非常必要的。
由于配置是任何应用程序的核心区域之一,并且假设没有为应用程序关键属性提供任何值,那么整个应用程序可能会导致一些不必要的行为(可能是崩溃、无限期资源利用等)。我认为这就是原因,大多数.Net内置配置属性(如会话超时等)都被设置为默认值,即使用户没有指定值,也会应用这些属性。
https://stackoverflow.com/questions/3744953
复制相似问题