这又是一个EntLib-Validator问题。我正在使用C#中的EntLib 5.0和XP专业版的.Net 4.0。
我有一些由T4模板生成的业务对象(部分类)。所以我决定使用MetadataTypeAttribute
将其验证属性放在buddy-classes中,这是entLib 5.0(msdn)文档中明确建议的。
但是我从ValidatorFactory获得的Validator
对象不知道在元数据类中定义的验证属性。
业务对象的定义如下:
[MetadataType(typeof(PatientMetadata))]
public partial class Patient
{
private string _Name;
private int _DiagnosisCount;
public int DiagnosisCount
{
get
{
return _DiagnosisCount;
}
set
{
if (value != _DiagnosisCount)
{
_DiagnosisCount = value;
}
}
}
public string Name
{
get
{
return _Name;
}
set
{
if (value != _Name)
{
_Name = value;
}
}
}
}
这样的元数据类,根据文档:
public class PatientMetadata
{
[RangeValidator(4)]
public int DiagnosisCount { get; set; }
[StringLengthValidator(64, ErrorMessage = "Name must not exceed 64 chars.")]
public string Name { get; set; }
}
如果我知道尝试以这种方式进行验证:
var factory = ValidationFactory.DefaultCompositeValidatorFactory;
var validator = factory.CreateValidator<Patient>();
...然后观察validator
(在调试期间)已经说过,它只是一个没有任何子验证器的AndCompositeValidator
。
同样,如果我将验证属性放在Patient
类中,它就能完美运行。
到现在为止,我没有真正的想法,我在这里缺少什么,因为我认为根据文档做一切。
先感谢你们!
答案 0 :(得分:1)
元数据类的属性名称必须与主类的属性名称匹配。
在您的情况下,您的元数据类应如下所示:
public class PatientMetadata
{
[RangeValidator(0, RangeBoundaryType.Inclusive, 10, RangeBoundaryType.Ignore)]
public int DiagnosisCount { get; set; }
[StringLengthValidator(6, ErrorMessage = "Name must not exceed 6 chars.")]
public string Name { get; set; }
}
此外,文档表明接受的方法是将所有返回类型声明为object
。但是,文档还讨论了使用属性,但在他们的示例中使用了字段,因此请将其置于建议之下。 :)