C# EntLib验证将忽略MetadataType中属性的属性
这又是一个EntLib验证程序问题。我正在玩C#中的EntLib 5.0和XP pro中的.Net 4.0 我有一些由T4模板生成的业务对象(部分类)。因此,我决定使用entlib5.0()文档明确推荐的C# EntLib验证将忽略MetadataType中属性的属性,c#,.net,validation,enterprise-library,metadatatype,C#,.net,Validation,Enterprise Library,Metadatatype,这又是一个EntLib验证程序问题。我正在玩C#中的EntLib 5.0和XP pro中的.Net 4.0 我有一些由T4模板生成的业务对象(部分类)。因此,我决定使用entlib5.0()文档明确推荐的MetadataTypeAttribute将它们的验证属性放在buddy类中。 但是我从ValidatorFactory获得的Validator对象不知道元数据类中定义的验证属性 业务对象的定义如下: [MetadataType(typeof(PatientMetadata))] public
MetadataTypeAttribute
将它们的验证属性放在buddy类中。
但是我从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>();
var factory=ValidationFactory.DefaultCompositeValidatorFactory;
var validator=factory.CreateValidator();
…然后观察验证器
(在调试期间)已经表明,它只是一个和compositevalidator
,没有任何子验证器。
同样,如果我将验证属性正确地放在Patient
类中,那么它将非常有效
到现在为止,我真的不知道我在这里遗漏了什么,因为我认为一切都是按照文件进行的
提前感谢你们 元数据类的属性名称必须与主类的属性名称匹配 在您的情况下,元数据类应该如下所示:
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
。但是,文档也谈到了使用属性,但在其示例中使用了字段,因此请慎重考虑。:) 你说得对,但命名问题只是我的示例中的情况,而不是我的应用程序本身。但我同时发现,如果我在原始类中有属性,那么在元数据类中使用属性是至关重要的。正如你所说,他们在文档中使用字段,我认为这是一种误导。数据类型是不相关的,他们建议使用object,但只要您愿意,您仍然可以使用相应的类型。