2011-07-14 56 views
0

这是一个EntLib验证器,问题再次被忽略。我正在玩C#中的EntLib 5.0和XP pro上的.Net 4.0。属性由EntLib验证

我有T4模板生成一些业务对象(局部类)。所以我决定使用MetadataTypeAttribute作为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(在调试过程中)已经说,我t只是一个AndCompositeValidator没有任何儿童验证器。 同样,如果我将验证属性放在Patient类中,它就可以很好地工作。

到现在为止,我没有真正的想法,我很想念这里,因为我觉得根据文档所做的一切。

在此先感谢你们!

回答

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。但是,文档还讨论了使用属性,但在其示例使用领域中,请在建议下使用它。 :)

+0

你是对的,但命名问题就在我的例子中,而不是在我的应用程序本身。但是我同时想到,如果我在原始类中有属性,那么在元数据类中使用**属性**是非常重要的。正如你所说,他们使用文档中的字段,我认为是什么样的误导。数据类型是不相关的,他们建议使用对象,但只要你愿意,你仍然可以使用相应的类型。 –