2011-01-20 8 views
19

検証クラスを継承します。しかし時々私はルールの階層を作成する必要があります。例:流暢検証。私は流暢バリデータを使用

[Validator(typeof(UserValidation))] 
public class UserViewModel 
{ 
    public string FirstName; 
    public string LastName; 
} 

public class UserValidation : AbstractValidator<UserViewModel> 
{ 
    public UserValidation() 
    { 
     this.RuleFor(x => x.FirstName).NotNull(); 
     this.RuleFor(x => x.FirstName).NotEmpty(); 

     this.RuleFor(x => x.LastName).NotNull(); 
     this.RuleFor(x => x.LastName).NotEmpty(); 
    } 
} 

public class RootViewModel : UserViewModel 
{ 
    public string MiddleName;  
} 

UserValidationからRootValidationへの検証ルールを継承したいとします。しかし、このコードは動作しませんでした:

public class RootViewModelValidation:UserValidation<RootViewModel> 
{ 
    public RootViewModelValidation() 
    { 
     this.RuleFor(x => x.MiddleName).NotNull(); 
     this.RuleFor(x => x.MiddleName).NotEmpty(); 
    } 
} 

FluentValidationを使用して検証クラスを継承するにはどうすればよいですか?これを解決するには

答えて

29

、あなたはジェネリックにUserValidationクラスを変更する必要があります。以下のコードを参照してください。

public class UserValidation<T> : AbstractValidator<T> where T : UserViewModel 
{ 
    public UserValidation() 
    { 
     this.RuleFor(x => x.FirstName).NotNull(); 
     this.RuleFor(x => x.FirstName).NotEmpty(); 

     this.RuleFor(x => x.LastName).NotNull(); 
     this.RuleFor(x => x.LastName).NotEmpty(); 
    } 
} 

[Validator(typeof(UserValidation<UserViewModel>))] 
public class UserViewModel 
{ 
    public string FirstName; 
    public string LastName; 
} 

public class RootViewModelValidation : UserValidation<RootViewModel> 
{ 
    public RootViewModelValidation() 
    { 
     this.RuleFor(x => x.MiddleName).NotNull(); 
     this.RuleFor(x => x.MiddleName).NotEmpty(); 
    } 
} 

[Validator(typeof(RootViewModelValidation))] 
public class RootViewModel : UserViewModel 
{ 
    public string MiddleName; 
} 
+0

私は個人的にUserValidationの要約を作るためにしようとするだろう。しかし、それはすでにそれのように素晴らしいです!ありがとうございました! –