EntLib验证会忽略MetadataType中属性的属性

时间:2011-07-14 17:08:47

标签: c# .net validation enterprise-library metadatatype

这又是一个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类中,它就能完美运行。

到现在为止,我没有真正的想法,我在这里缺少什么,因为我认为根据文档做一切。

先感谢你们!

1 个答案:

答案 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。但是,文档还讨论了使用属性,但在他们的示例中使用了字段,因此请将其置于建议之下。 :)