2011-07-14 88 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

你是對的,但命名問題就在我的例子中,而不是在我的應用程序本身。但是我同時想到,如果我在原始類中有屬性,那麼在元數據類中使用**屬性**是非常重要的。正如你所說,他們使用文檔中的字段,我認爲是什麼樣的誤導。數據類型是不相關的,他們建議使用對象,但只要你願意,你仍然可以使用相應的類型。 –