25

我使用了流利的验证器。但有时我需要创建规则层次结构。例如:

[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 继承验证类?

4

1 回答 1

36

要解决此问题,您必须将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;
}
于 2011-01-21T10:12:40.923 回答