如何使用FluentValidation验证复杂模型并仍然可以访问模型?

时间:2012-04-23 16:00:53

标签: c# asp.net-mvc-3 fluentvalidation

我将AccountsViewModel定义为:

[Validator(typeof(AccountsValidator))]
public class AccountsViewModel
{
    public AccountsViewModel()
    {
        Accounts = new List<Account>();
        Accounts.Add(new Account { AccountNumber = string.Empty }); //There must be at least one account
    }

    public List<Account> Accounts { get; set; }
}

我有以下流利的验证:

public class AccountsValidator : AbstractValidator<AccountsViewModel>
{
    public AccountsValidator()
    {
        //Validate that a single account number has been entered.
        RuleFor(x => x.Accounts[0].AccountNumber)
            .NotEmpty()
            .WithMessage("Please enter an account number.")
            .OverridePropertyName("Accounts[0].AccountNumber");

        RuleFor(x => x.Accounts)
            .SetCollectionValidator(new AccountValidator());
    }
}

public class AccountValidator : AbstractValidator<Account>
{
    public AccountValidator()
    {
        RuleFor(x => x.AccountNumber)
            .Matches(@"^\d{9}a?[0-9X]$")
            .WithMessage("Please enter a valid account number.");

        //TODO: Validate that the account number entered is not a duplicate account
    }
}

如果帐号在Accounts集合中重复,我想对帐号添加错误。但是,在AccountValidator课程中,我无法访问帐户集合(据我所知)。如何更改/重写此内容以访问帐户集合,以便我可以确保帐号不重复?

1 个答案:

答案 0 :(得分:1)

我认为你的方法略有不正确,这就是为什么你要努力做到这一点。

您的AccountValidator应用于验证帐户的单个实例。因此,您的“帐号必须唯一”规则应在集合级别(即在您的AccountsValidator中)实施。在这种情况下,您将可以访问完整的集合,并且可以轻松断言每个帐号都是唯一的。

您还应将AccountsValidator中当前的“非空”规则移至AccountValidator。