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

C# 如何使用FluentValidation验证复杂模型,并且仍然可以访问模型?,c#,asp.net-mvc-3,fluentvalidation,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 }); //T

我的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; }
}
[验证器(类型(AccountsValidator))]
公共类AccountsViewModel
{
公共帐户viewmodel()
{
账户=新列表();
Accounts.Add(新帐户{AccountNumber=string.Empty});//必须至少有一个帐户
}
公共列表帐户{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
    }
}
公共类AccountsValidator:AbstractValidator
{
公共帐户验证人()
{
//验证是否已输入单个帐号。
规则(x=>x.Accounts[0].AccountNumber)
.NotEmpty()
.WithMessage(“请输入帐号”)
.OverridePropertyName(“帐户[0].AccountNumber”);
规则(x=>x.Accounts)
.SetCollectionValidator(新AccountValidator());
}
}
公共类AccountValidator:AbstractValidator
{
公共帐户验证程序()
{
规则(x=>x.AccountNumber)
.Matches(@“^\d{9}a?[0-9X]$”)
.WithMessage(“请输入有效的帐号”);
//TODO:验证输入的帐号不是重复的帐号
}
}

如果账号在
Accounts
集合中重复,我想针对账号添加一个错误。但是,在
AccountValidator
类中,我无权访问accounts集合(据我所知)。我如何更改/重写此项以访问accounts collection,从而确保帐号不重复?

我认为您的方法有点不正确,这就是为什么您很难做到这一点

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


AccountsValidator中当前的“not empty”规则也应该移动到AccountValidator。

这不是很好,但您可以将集合作为参数传递给AccountValidator构造函数,并将其作为本地字段保留。