2012-04-23 61 views
0

我有一个AccountsViewModel定义为:如何使用FluentValidation验证复杂模型并仍然可以访问模型?

[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类中,我无权访问帐户集合(据我所知)。我怎样才能改变/重写这个访问帐户集合,以便我可以确保帐号不重复?

+0

这不是很好,但您可以将集合作为参数传递给AccountValidator构造函数并将其保留为本地字段。 – ilmatte 2012-06-04 09:54:30

回答

1

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

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

您在AccountsValidator中的当前“非空”规则也应该移至AccountValidator。