2011-07-14 21 views
0

これはEntLib-Validatorの問題です。私はEntLib 5.0とC#で、そして.NET 4.0はXPプロでプレイしています。MetadataTypeの属性の属性はEntLib検証で無視されます

T4テンプレートで生成されたビジネスオブジェクト(部分クラス)があります。だから私はentLib 5.0(msdn)のドキュメントで間違いなく推奨されているように、MetadataTypeAttributeを使ってバリデーション属性をバディクラスに入れることにしました。 ValidatorFactoryから取得したValidatorオブジェクトは、メタデータクラスで定義されている検証属性についてはわかりません。

ビジネス・オブジェクトは、次のように定義されています。私は、検証をこの方法を実行しようとわかっている場合

public class PatientMetadata 
{ 
    [RangeValidator(4)] 
    public int DiagnosisCount { get; set; } 

    [StringLengthValidator(64, ErrorMessage = "Name must not exceed 64 chars.")] 
    public string Name { get; set; } 
} 

:このような

[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; 
      } 
     } 
    } 
} 

とメタデータクラス、マニュアルに従って

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

あなたは正しいですが、その命名の問題はここの私の例ではまさにそのケースであり、私のアプリケーション自体ではありませんでした。しかし、元のクラスにプロパティがある場合は、メタデータクラスで**プロパティ**を使用することが不可欠であることを理解しました。あなたが言ったように、彼らはドキュメントのフィールドを使用して、誤解を招くようなものだと思います。データ型は無関係で、オブジェクトを使用することを推奨しますが、必要に応じて対応する型を使用することはできます。 –

関連する問題